Revert "btrfs: use proper endianness accessors for super_copy"
Subsystems (2)
David Sterba
maintainerPATCH 1/1 Revert "btrfs: use proper endianness accessors for super_copy"
This reverts commit 3c181c12c431fe33b669410d663beb9cceefcd1b.
The offending patch was merged in 4.16-rc4 and was promptly applied to stable kernels 4.14.25 and 4.15.8.
The patch causes a corruption in several superblock items on big-endian machines because of messed up endianity conversions. The damage is manually repairable. A filesystem cannot be mounted again after it has been unmounted once.
We do a full revert and not a fixup so stable can pick that patch ASAP.
Fixes 3c181c12c431 ("btrfs: use proper endianness accessors for super_copy")
CC [email protected] # 4.14+
Reported-by Christoph Biedl <[email protected]>
Signed-off-by David Sterba <[email protected]>
--- fs/btrfs/sysfs.c | 8 +++++--- fs/btrfs/transaction.c | 20 ++++++++------------ 2 files changed, 13 insertions(+), 15 deletions(-)
fs/btrfs/sysfs.c +5 -3
@@ -423,7 +423,7 @@ static ssize_t btrfs_nodesize_show(struct kobject *kobj, {struct btrfs_fs_info *fs_info =to_fs_info (kobj); -return snprintf (buf,PAGE_SIZE ,"%u\n" , fs_info->nodesize); +return snprintf (buf,PAGE_SIZE ,"%u\n" , fs_info->super_copy->nodesize); } BTRFS_ATTR(, nodesize, btrfs_nodesize_show);
@@ -433,7 +433,8 @@ static ssize_t btrfs_sectorsize_show(struct kobject *kobj, {struct btrfs_fs_info *fs_info =to_fs_info (kobj); -return snprintf (buf,PAGE_SIZE ,"%u\n" , fs_info->sectorsize); +return snprintf (buf,PAGE_SIZE ,"%u\n" , + fs_info->super_copy->sectorsize); } BTRFS_ATTR(, sectorsize, btrfs_sectorsize_show);
@@ -443,7 +444,8 @@ static ssize_t btrfs_clone_alignment_show(struct kobject *kobj, {struct btrfs_fs_info *fs_info =to_fs_info (kobj); -return snprintf (buf,PAGE_SIZE ,"%u\n" , fs_info->sectorsize); +return snprintf (buf,PAGE_SIZE ,"%u\n" , + fs_info->super_copy->sectorsize); } BTRFS_ATTR(, clone_alignment, btrfs_clone_alignment_show);
fs/btrfs/transaction.c +8 -12
@@ -1722,23 +1722,19 @@ static void update_super_roots(struct btrfs_fs_info *fs_info) super = fs_info->super_copy; -/* update latest btrfs_super_block::chunk_root refs */ root_item = &fs_info->chunk_root->root_item; -btrfs_set_super_chunk_root (super, root_item->bytenr); -btrfs_set_super_chunk_root_generation (super, root_item->generation); -btrfs_set_super_chunk_root_level (super, root_item->level); + super->chunk_root = root_item->bytenr; + super->chunk_root_generation = root_item->generation; + super->chunk_root_level = root_item->level; -/* update latest btrfs_super_block::root refs */ root_item = &fs_info->tree_root->root_item; -btrfs_set_super_root (super, root_item->bytenr); -btrfs_set_super_generation (super, root_item->generation); -btrfs_set_super_root_level (super, root_item->level); - + super->root = root_item->bytenr; + super->generation = root_item->generation; + super->root_level = root_item->level;if (btrfs_test_opt (fs_info,SPACE_CACHE )) -btrfs_set_super_cache_generation (super, root_item->generation); + super->cache_generation = root_item->generation;if (test_bit (BTRFS_FS_UPDATE_UUID_TREE_GEN , &fs_info->flags)) -btrfs_set_super_uuid_tree_generation (super, - root_item->generation); + super->uuid_tree_generation = root_item->generation; }int btrfs_transaction_in_commit (struct btrfs_fs_info *info)
Signature · 1 line
2.16.2