btrfs: tree-checker: fix false alert caused by legacy btrfs root item
[sfrench/cifs-2.6.git] / fs / btrfs / tree-checker.c
index 7b1fee630f97851a35eb0bb34d33d95d1e31b991..f0ffd5ee77bd5700847bb580417a3f3242f88630 100644 (file)
@@ -1035,7 +1035,7 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,
                           int slot)
 {
        struct btrfs_fs_info *fs_info = leaf->fs_info;
-       struct btrfs_root_item ri;
+       struct btrfs_root_item ri = { 0 };
        const u64 valid_root_flags = BTRFS_ROOT_SUBVOL_RDONLY |
                                     BTRFS_ROOT_SUBVOL_DEAD;
        int ret;
@@ -1044,14 +1044,21 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,
        if (ret < 0)
                return ret;
 
-       if (btrfs_item_size_nr(leaf, slot) != sizeof(ri)) {
+       if (btrfs_item_size_nr(leaf, slot) != sizeof(ri) &&
+           btrfs_item_size_nr(leaf, slot) != btrfs_legacy_root_item_size()) {
                generic_err(leaf, slot,
-                           "invalid root item size, have %u expect %zu",
-                           btrfs_item_size_nr(leaf, slot), sizeof(ri));
+                           "invalid root item size, have %u expect %zu or %u",
+                           btrfs_item_size_nr(leaf, slot), sizeof(ri),
+                           btrfs_legacy_root_item_size());
        }
 
+       /*
+        * For legacy root item, the members starting at generation_v2 will be
+        * all filled with 0.
+        * And since we allow geneartion_v2 as 0, it will still pass the check.
+        */
        read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot),
-                          sizeof(ri));
+                          btrfs_item_size_nr(leaf, slot));
 
        /* Generation related */
        if (btrfs_root_generation(&ri) >