linux/fs/btrfs
Qu Wenruo dc4d316849 btrfs: reject log replay if there is unsupported RO compat flag
[BUG]
If we have a btrfs image with dirty log, along with an unsupported RO
compatible flag:

log_root		30474240
...
compat_flags		0x0
compat_ro_flags		0x40000003
			( FREE_SPACE_TREE |
			  FREE_SPACE_TREE_VALID |
			  unknown flag: 0x40000000 )

Then even if we can only mount it RO, we will still cause metadata
update for log replay:

  BTRFS info (device dm-1): flagging fs with big metadata feature
  BTRFS info (device dm-1): using free space tree
  BTRFS info (device dm-1): has skinny extents
  BTRFS info (device dm-1): start tree-log replay

This is definitely against RO compact flag requirement.

[CAUSE]
RO compact flag only forces us to do RO mount, but we will still do log
replay for plain RO mount.

Thus this will result us to do log replay and update metadata.

This can be very problematic for new RO compat flag, for example older
kernel can not understand v2 cache, and if we allow metadata update on
RO mount and invalidate/corrupt v2 cache.

[FIX]
Just reject the mount unless rescue=nologreplay is provided:

  BTRFS error (device dm-1): cannot replay dirty log with unsupport optional features (0x40000000), try rescue=nologreplay instead

We don't want to set rescue=nologreply directly, as this would make the
end user to read the old data, and cause confusion.

Since the such case is really rare, we're mostly fine to just reject the
mount with an error message, which also includes the proper workaround.

CC: stable@vger.kernel.org #4.9+
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-07-25 17:45:34 +02:00
..
tests Revert "btrfs: turn fs_info member buffer_radix into XArray" 2022-07-15 19:14:33 +02:00
acl.c btrfs: reserve correct number of items for inode creation 2022-05-16 17:03:08 +02:00
async-thread.c btrfs: simplify WQ_HIGHPRI handling in struct btrfs_workqueue 2022-05-16 17:03:15 +02:00
async-thread.h btrfs: simplify WQ_HIGHPRI handling in struct btrfs_workqueue 2022-05-16 17:03:15 +02:00
backref.c btrfs: unify the error handling pattern for read_tree_block() 2022-03-14 13:13:53 +01:00
backref.h
block-group.c btrfs: zoned: zone finish unused block group 2022-05-16 17:17:32 +02:00
block-group.h btrfs: zoned: prevent allocation from previous data relocation BG 2022-06-21 14:43:48 +02:00
block-rsv.c btrfs: reserve extra space for the free space tree 2022-01-07 14:18:25 +01:00
block-rsv.h
btrfs_inode.h btrfs: move struct btrfs_dio_private to inode.c 2022-05-16 17:17:32 +02:00
check-integrity.c btrfs: check-integrity: simplify bio allocation in btrfsic_read_block 2022-05-16 17:03:12 +02:00
check-integrity.h btrfs: check-integrity: split submit_bio from btrfsic checking 2022-05-16 17:03:12 +02:00
compression.c btrfs: remove btrfs_end_io_wq 2022-07-25 17:45:33 +02:00
compression.h btrfs: don't use btrfs_bio_wq_end_io for compressed writes 2022-07-25 17:45:33 +02:00
ctree.c btrfs: sink parameter is_data to btrfs_set_disk_extent_flags 2022-05-16 17:17:31 +02:00
ctree.h btrfs: make btrfs_super_block::log_root_transid deprecated 2022-07-25 17:45:34 +02:00
delalloc-space.c btrfs: avoid blocking on space revervation when doing nowait dio writes 2022-05-16 17:03:10 +02:00
delalloc-space.h
delayed-inode.c btrfs: do not batch insert non-consecutive dir indexes during log replay 2022-07-25 17:45:14 +02:00
delayed-inode.h btrfs: reduce amount of reserved metadata for delayed item insertion 2022-07-25 17:44:36 +02:00
delayed-ref.c btrfs: remove btrfs_delayed_extent_op::is_data 2022-05-16 17:17:31 +02:00
delayed-ref.h btrfs: remove btrfs_delayed_extent_op::is_data 2022-05-16 17:17:31 +02:00
dev-replace.c btrfs: use a local variable for fs_devices pointer in btrfs_dev_replace_finishing 2022-05-16 17:03:08 +02:00
dev-replace.h
dir-item.c btrfs: use btrfs_for_each_slot in btrfs_search_dir_index_item 2022-05-16 17:03:07 +02:00
discard.c
discard.h
disk-io.c btrfs: reject log replay if there is unsupported RO compat flag 2022-07-25 17:45:34 +02:00
disk-io.h btrfs: remove btrfs_end_io_wq 2022-07-25 17:45:33 +02:00
export.c
export.h
extent_io.c btrfs: pass the btrfs_bio_ctrl to submit_one_bio 2022-07-25 17:45:34 +02:00
extent_io.h btrfs: do not allocate a btrfs_bio for low-level bios 2022-07-25 17:45:33 +02:00
extent_map.c btrfs: assert we have a write lock when removing and replacing extent maps 2022-03-14 13:13:50 +01:00
extent_map.h btrfs: defrag: don't use merged extent map for their generation check 2022-02-23 17:43:13 +01:00
extent-io-tree.h btrfs: Convert from invalidatepage to invalidate_folio 2022-03-15 08:23:29 -04:00
extent-tree.c for-5.19-rc7-tag 2022-07-16 13:48:55 -07:00
file-item.c btrfs: handle csum lookup errors properly on reads 2022-03-14 13:13:51 +01:00
file.c for-5.19-rc3-tag 2022-06-26 10:11:36 -07:00
free-space-cache.c Page cache changes for 5.19 2022-05-24 19:55:07 -07:00
free-space-cache.h
free-space-tree.c btrfs: use rbtree with leftmost node cached for tracking lowest block group 2022-05-16 17:03:13 +02:00
free-space-tree.h
inode-item.c btrfs: make should_throttle loop local in btrfs_truncate_inode_items 2022-01-07 14:18:25 +01:00
inode-item.h btrfs: add inode to truncate control 2022-01-07 14:18:24 +01:00
inode.c btrfs: replace kmap() with kmap_local_page() in inode.c 2022-07-25 17:45:33 +02:00
ioctl.c btrfs: use btrfs_try_lock_balance in btrfs_ioctl_balance 2022-07-25 17:44:34 +02:00
Kconfig btrfs: use generic Kconfig option for 256kB page size limit 2022-01-20 08:52:55 +02:00
locking.c btrfs: don't set lock_owner when locking extent buffer for reading 2022-06-21 14:46:56 +02:00
locking.h
lzo.c btrfs: replace kmap() with kmap_local_page() in lzo.c 2022-07-25 17:45:33 +02:00
Makefile Kbuild: add -Wno-shift-negative-value where -Wextra is used 2022-03-13 17:30:31 +09:00
misc.h
ordered-data.c btrfs: fix typos in comments 2022-07-25 17:44:33 +02:00
ordered-data.h btrfs: add BTRFS_IOC_ENCODED_WRITE 2022-03-14 13:13:51 +01:00
orphan.c
print-tree.c btrfs: unify the error handling pattern for read_tree_block() 2022-03-14 13:13:53 +01:00
print-tree.h
props.c btrfs: move common inode creation code into btrfs_create_new_inode() 2022-05-16 17:03:08 +02:00
props.h btrfs: move common inode creation code into btrfs_create_new_inode() 2022-05-16 17:03:08 +02:00
qgroup.c btrfs: avoid blocking on space revervation when doing nowait dio writes 2022-05-16 17:03:10 +02:00
qgroup.h btrfs: avoid blocking on space revervation when doing nowait dio writes 2022-05-16 17:03:10 +02:00
raid56.c btrfs: defer I/O completion based on the btrfs_raid_bio 2022-07-25 17:45:33 +02:00
raid56.h btrfs: defer I/O completion based on the btrfs_raid_bio 2022-07-25 17:45:33 +02:00
rcu-string.h
ref-verify.c
ref-verify.h
reflink.c btrfs: balance btree dirty pages and delayed items after clone and dedupe 2022-07-25 17:44:35 +02:00
reflink.h
relocation.c Page cache changes for 5.19 2022-05-24 19:55:07 -07:00
root-tree.c btrfs: avoid blocking on space revervation when doing nowait dio writes 2022-05-16 17:03:10 +02:00
scrub.c btrfs: use integrated bitmaps for scrub_parity::dbitmap and ebitmap 2022-07-25 17:44:34 +02:00
send.c btrfs: send: enable support for stream v2 and compressed writes 2022-07-25 17:45:32 +02:00
send.h btrfs: send: enable support for stream v2 and compressed writes 2022-07-25 17:45:32 +02:00
space-info.c btrfs: store chunk size in space-info struct 2022-07-25 17:45:32 +02:00
space-info.h btrfs: store chunk size in space-info struct 2022-07-25 17:45:32 +02:00
struct-funcs.c btrfs: remove redundant check in up check_setget_bounds 2022-07-25 17:45:33 +02:00
subpage.c btrfs: fix typos in comments 2022-07-25 17:44:33 +02:00
subpage.h btrfs: make nodesize >= PAGE_SIZE case to reuse the non-subpage routine 2022-05-16 17:03:11 +02:00
super.c btrfs: remove btrfs_end_io_wq 2022-07-25 17:45:33 +02:00
sysfs.c btrfs: sysfs: add force_chunk_alloc trigger to force allocation 2022-07-25 17:45:32 +02:00
sysfs.h
transaction.c Revert "btrfs: turn fs_roots_radix in btrfs_fs_info into an XArray" 2022-07-15 19:14:28 +02:00
transaction.h btrfs: pass btrfs_fs_info for deleting snapshots and cleaner 2022-03-14 13:13:52 +01:00
tree-checker.c btrfs: tree-checker: check extent buffer owner against owner rootid 2022-05-16 17:03:09 +02:00
tree-checker.h btrfs: tree-checker: check extent buffer owner against owner rootid 2022-05-16 17:03:09 +02:00
tree-defrag.c
tree-log.c btrfs: fix typos in comments 2022-07-25 17:44:33 +02:00
tree-log.h btrfs: avoid inode logging during rename and link when possible 2022-03-14 13:13:48 +01:00
tree-mod-log.c
tree-mod-log.h
ulist.c
ulist.h
uuid-tree.c
verity.c
volumes.c btrfs: do not allocate a btrfs_bio for low-level bios 2022-07-25 17:45:33 +02:00
volumes.h btrfs: do not allocate a btrfs_bio for low-level bios 2022-07-25 17:45:33 +02:00
xattr.c btrfs: use btrfs_for_each_slot in btrfs_listxattr 2022-05-16 17:03:08 +02:00
xattr.h
zlib.c
zoned.c btrfs: zoned: fix comment description for sb_write_pointer logic 2022-07-25 17:44:33 +02:00
zoned.h btrfs: zoned: prevent allocation from previous data relocation BG 2022-06-21 14:43:48 +02:00
zstd.c btrfs: use non-bh spin_lock in zstd timer callback 2022-05-16 17:03:13 +02:00