Skip to content

Commit 3c181c1

Browse files
asjkdave
authored andcommitted
btrfs: use proper endianness accessors for super_copy
The fs_info::super_copy is a byte copy of the on-disk structure and all members must use the accessor macros/functions to obtain the right value. This was missing in update_super_roots and in sysfs readers. Moving between opposite endianness hosts will report bogus numbers in sysfs, and mount may fail as the root will not be restored correctly. If the filesystem is always used on a same endian host, this will not be a problem. Fix this by using the btrfs_set_super...() functions to set fs_info::super_copy values, and for the sysfs, use the cached fs_info::nodesize/sectorsize values. CC: stable@vger.kernel.org Fixes: df93589 ("btrfs: export more from FS_INFO to sysfs") Signed-off-by: Anand Jain <anand.jain@oracle.com> Reviewed-by: Liu Bo <bo.li.liu@oracle.com> Reviewed-by: David Sterba <dsterba@suse.com> [ update changelog ] Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 92e222d commit 3c181c1

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

fs/btrfs/sysfs.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ static ssize_t btrfs_nodesize_show(struct kobject *kobj,
423423
{
424424
struct btrfs_fs_info *fs_info = to_fs_info(kobj);
425425

426-
return snprintf(buf, PAGE_SIZE, "%u\n", fs_info->super_copy->nodesize);
426+
return snprintf(buf, PAGE_SIZE, "%u\n", fs_info->nodesize);
427427
}
428428

429429
BTRFS_ATTR(, nodesize, btrfs_nodesize_show);
@@ -433,8 +433,7 @@ static ssize_t btrfs_sectorsize_show(struct kobject *kobj,
433433
{
434434
struct btrfs_fs_info *fs_info = to_fs_info(kobj);
435435

436-
return snprintf(buf, PAGE_SIZE, "%u\n",
437-
fs_info->super_copy->sectorsize);
436+
return snprintf(buf, PAGE_SIZE, "%u\n", fs_info->sectorsize);
438437
}
439438

440439
BTRFS_ATTR(, sectorsize, btrfs_sectorsize_show);
@@ -444,8 +443,7 @@ static ssize_t btrfs_clone_alignment_show(struct kobject *kobj,
444443
{
445444
struct btrfs_fs_info *fs_info = to_fs_info(kobj);
446445

447-
return snprintf(buf, PAGE_SIZE, "%u\n",
448-
fs_info->super_copy->sectorsize);
446+
return snprintf(buf, PAGE_SIZE, "%u\n", fs_info->sectorsize);
449447
}
450448

451449
BTRFS_ATTR(, clone_alignment, btrfs_clone_alignment_show);

fs/btrfs/transaction.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1722,19 +1722,23 @@ static void update_super_roots(struct btrfs_fs_info *fs_info)
17221722

17231723
super = fs_info->super_copy;
17241724

1725+
/* update latest btrfs_super_block::chunk_root refs */
17251726
root_item = &fs_info->chunk_root->root_item;
1726-
super->chunk_root = root_item->bytenr;
1727-
super->chunk_root_generation = root_item->generation;
1728-
super->chunk_root_level = root_item->level;
1727+
btrfs_set_super_chunk_root(super, root_item->bytenr);
1728+
btrfs_set_super_chunk_root_generation(super, root_item->generation);
1729+
btrfs_set_super_chunk_root_level(super, root_item->level);
17291730

1731+
/* update latest btrfs_super_block::root refs */
17301732
root_item = &fs_info->tree_root->root_item;
1731-
super->root = root_item->bytenr;
1732-
super->generation = root_item->generation;
1733-
super->root_level = root_item->level;
1733+
btrfs_set_super_root(super, root_item->bytenr);
1734+
btrfs_set_super_generation(super, root_item->generation);
1735+
btrfs_set_super_root_level(super, root_item->level);
1736+
17341737
if (btrfs_test_opt(fs_info, SPACE_CACHE))
1735-
super->cache_generation = root_item->generation;
1738+
btrfs_set_super_cache_generation(super, root_item->generation);
17361739
if (test_bit(BTRFS_FS_UPDATE_UUID_TREE_GEN, &fs_info->flags))
1737-
super->uuid_tree_generation = root_item->generation;
1740+
btrfs_set_super_uuid_tree_generation(super,
1741+
root_item->generation);
17381742
}
17391743

17401744
int btrfs_transaction_in_commit(struct btrfs_fs_info *info)

0 commit comments

Comments
 (0)