Message ID | 20210209173406.16691-1-marek.behun@nic.cz (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [btrfs-progs] btrfs-progs: do not fail when offset of a ROOT_ITEM is not -1 | expand |
On Tue, Feb 09, 2021 at 06:34:06PM +0100, Marek Behún wrote: > When the btrfs_read_fs_root() function is searching a ROOT_ITEM with > location key offset other than -1, it currently fails via BUG_ON. > > The offset can have other value than -1, though. This can happen for > example if a subvolume is renamed: > > $ btrfs subvolume create X && sync > Create subvolume './X' > $ btrfs inspect-internal dump-tree /dev/root | grep -B 2 'name: X$ > location key (270 ROOT_ITEM 18446744073709551615) type DIR > transid 283 data_len 0 name_len 1 > name: X > $ mv X Y && sync > $ btrfs inspect-internal dump-tree /dev/root | grep -B 2 'name: Y$ > location key (270 ROOT_ITEM 0) type DIR > transid 285 data_len 0 name_len 1 > name: Y > > As can be seen the offset changed from -1ULL to 0. > > Do not fail in this case. > > Signed-off-by: Marek Behún <marek.behun@nic.cz> > Cc: David Sterba <dsterba@suse.com> > Cc: Qu Wenruo <wqu@suse.com> > Cc: Tom Rini <trini@konsulko.com> Added to devel, thanks.
diff --git a/kernel-shared/disk-io.c b/kernel-shared/disk-io.c index 6f584986..ba8ffd8b 100644 --- a/kernel-shared/disk-io.c +++ b/kernel-shared/disk-io.c @@ -752,8 +752,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info, return fs_info->free_space_root ? fs_info->free_space_root : ERR_PTR(-ENOENT); - BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID || - location->offset != (u64)-1); + BUG_ON(location->objectid == BTRFS_TREE_RELOC_OBJECTID); node = rb_search(&fs_info->fs_root_tree, (void *)&objectid, btrfs_fs_roots_compare_objectids, NULL);
When the btrfs_read_fs_root() function is searching a ROOT_ITEM with location key offset other than -1, it currently fails via BUG_ON. The offset can have other value than -1, though. This can happen for example if a subvolume is renamed: $ btrfs subvolume create X && sync Create subvolume './X' $ btrfs inspect-internal dump-tree /dev/root | grep -B 2 'name: X$ location key (270 ROOT_ITEM 18446744073709551615) type DIR transid 283 data_len 0 name_len 1 name: X $ mv X Y && sync $ btrfs inspect-internal dump-tree /dev/root | grep -B 2 'name: Y$ location key (270 ROOT_ITEM 0) type DIR transid 285 data_len 0 name_len 1 name: Y As can be seen the offset changed from -1ULL to 0. Do not fail in this case. Signed-off-by: Marek Behún <marek.behun@nic.cz> Cc: David Sterba <dsterba@suse.com> Cc: Qu Wenruo <wqu@suse.com> Cc: Tom Rini <trini@konsulko.com> --- kernel-shared/disk-io.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)