linux/fs/btrfs
Naohiro Aota 6887938618 btrfs: zoned: do not flag ZEROOUT on non-dirty extent buffer
Btrfs clears the content of an extent buffer marked as
EXTENT_BUFFER_ZONED_ZEROOUT before the bio submission. This mechanism is
introduced to prevent a write hole of an extent buffer, which is once
allocated, marked dirty, but turns out unnecessary and cleaned up within
one transaction operation.

Currently, btrfs_clear_buffer_dirty() marks the extent buffer as
EXTENT_BUFFER_ZONED_ZEROOUT, and skips the entry function. If this call
happens while the buffer is under IO (with the WRITEBACK flag set,
without the DIRTY flag), we can add the ZEROOUT flag and clear the
buffer's content just before a bio submission. As a result:

1) it can lead to adding faulty delayed reference item which leads to a
   FS corrupted (EUCLEAN) error, and

2) it writes out cleared tree node on disk

The former issue is previously discussed in [1]. The corruption happens
when it runs a delayed reference update. So, on-disk data is safe.

[1] https://lore.kernel.org/linux-btrfs/3f4f2a0ff1a6c818050434288925bdcf3cd719e5.1709124777.git.naohiro.aota@wdc.com/

The latter one can reach on-disk data. But, as that node is already
processed by btrfs_clear_buffer_dirty(), that will be invalidated in the
next transaction commit anyway. So, the chance of hitting the corruption
is relatively small.

Anyway, we should skip flagging ZEROOUT on a non-DIRTY extent buffer, to
keep the content under IO intact.

Fixes: aa6313e6ff ("btrfs: zoned: don't clear dirty flag of extent buffer")
CC: stable@vger.kernel.org # 6.8
Link: https://lore.kernel.org/linux-btrfs/oadvdekkturysgfgi4qzuemd57zudeasynswurjxw3ocdfsef6@sjyufeugh63f/
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2024-04-09 23:20:28 +02:00
..
tests btrfs: tests: allocate dummy fs_info and root in test_find_delalloc() 2024-03-04 16:24:49 +01:00
accessors.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
accessors.h btrfs: move balance args conversion helpers to volumes.c 2024-03-04 16:24:52 +01:00
acl.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
acl.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
async-thread.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
async-thread.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
backref.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
backref.h btrfs: uninline some static inline helpers from backref.h 2024-03-04 16:24:53 +01:00
bio.c btrfs: introduce offload_csum_mode to tweak checksum offloading behavior 2024-03-04 16:24:52 +01:00
bio.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
block-group.c btrfs: zoned: don't skip block groups with 100% zone unusable 2024-03-26 16:42:39 +01:00
block-group.h btrfs: mark btrfs_put_caching_control() static 2024-03-05 17:13:23 +01:00
block-rsv.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
block-rsv.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
btrfs_inode.h btrfs: merge btrfs_del_delalloc_inode() helpers 2024-03-04 16:24:54 +01:00
compression.c btrfs: compression: remove dead comments in btrfs_compress_heuristic() 2024-03-05 17:13:23 +01:00
compression.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
ctree.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
ctree.h btrfs: add forward declarations and headers, part 3 2024-03-04 16:24:49 +01:00
defrag.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
defrag.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
delalloc-space.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
delalloc-space.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
delayed-inode.c btrfs: record delayed inode root in transaction 2024-04-02 19:18:33 +02:00
delayed-inode.h btrfs: uninline btrfs_init_delayed_root() 2024-03-04 16:24:53 +01:00
delayed-ref.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
delayed-ref.h btrfs: uninline some static inline helpers from delayed-ref.h 2024-03-04 16:24:53 +01:00
dev-replace.c btrfs: pass btrfs_device to btrfs_scratch_superblocks() 2024-03-04 16:24:54 +01:00
dev-replace.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
dir-item.c btrfs: abort transaction on generation mismatch when marking eb as dirty 2023-10-12 16:44:07 +02:00
dir-item.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
discard.c btrfs: unexport btrfs_run_discard_work and make it static 2023-06-19 13:59:25 +02:00
discard.h btrfs: unexport btrfs_run_discard_work and make it static 2023-06-19 13:59:25 +02:00
disk-io.c btrfs: merge btrfs_del_delalloc_inode() helpers 2024-03-04 16:24:54 +01:00
disk-io.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
export.c btrfs: add helper to get fs_info from struct inode pointer 2024-03-04 16:24:49 +01:00
export.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
extent_io.c btrfs: zoned: do not flag ZEROOUT on non-dirty extent buffer 2024-04-09 23:20:28 +02:00
extent_io.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
extent_map.c btrfs: use btrfs_warn() to log message at btrfs_add_extent_mapping() 2024-03-26 16:42:39 +01:00
extent_map.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
extent-io-tree.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
extent-io-tree.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
extent-tree.c btrfs: avoid unnecessary ref initialization when freeing log tree block 2024-03-04 16:24:52 +01:00
extent-tree.h btrfs: add forward declarations and headers, part 3 2024-03-04 16:24:49 +01:00
file-item.c btrfs: unify handling of return values of btrfs_insert_empty_items() 2024-03-04 16:24:48 +01:00
file-item.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
file.c btrfs: add helper to get fs_info from struct inode pointer 2024-03-04 16:24:49 +01:00
file.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
free-space-cache.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
free-space-cache.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
free-space-tree.c btrfs: move transaction abort to the error site btrfs_rebuild_free_space_tree() 2024-03-04 16:24:48 +01:00
free-space-tree.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
fs.c btrfs: sysfs: update fs features directory asynchronously 2023-02-13 17:50:35 +01:00
fs.h btrfs: factor out validation of btrfs_ioctl_vol_args::name 2024-03-04 16:24:52 +01:00
inode-item.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
inode-item.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
inode.c btrfs: make btrfs_clear_delalloc_extent() free delalloc reserve 2024-04-02 19:19:08 +02:00
ioctl.c btrfs: qgroup: fix qgroup prealloc rsv leak in subvolume operations 2024-04-02 19:18:23 +02:00
ioctl.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
Kconfig btrfs: check-integrity: remove CONFIG_BTRFS_FS_CHECK_INTEGRITY option 2023-10-12 16:44:05 +02:00
locking.c btrfs: change BUG_ON to assertion when verifying lockdep class setup 2024-03-04 16:24:48 +01:00
locking.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
lru_cache.c btrfs: fix typos found by codespell 2023-12-15 23:00:04 +01:00
lru_cache.h btrfs: open code trivial btrfs_lru_cache_size() 2024-03-04 16:24:53 +01:00
lzo.c btrfs: add helper to get fs_info from struct inode pointer 2024-03-04 16:24:49 +01:00
Makefile btrfs: add support for inserting raid stripe extents 2023-10-12 16:44:09 +02:00
messages.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
messages.h btrfs: constify fs_info parameter in __btrfs_panic() 2023-12-15 20:27:02 +01:00
misc.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
ordered-data.c btrfs: remove SLAB_MEM_SPREAD flag use 2024-03-05 17:13:23 +01:00
ordered-data.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
orphan.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
orphan.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
print-tree.c btrfs: new inline ref storing owning subvol of data extents 2023-10-12 16:44:11 +02:00
print-tree.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
props.c btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
props.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
qgroup.c btrfs: qgroup: correctly model root qgroup rsv in convert 2024-04-02 19:18:04 +02:00
qgroup.h btrfs: qgroup: validate btrfs_qgroup_inherit parameter 2024-03-05 17:13:24 +01:00
raid56.c btrfs: raid56: extra debugging for raid6 syndrome generation 2024-03-04 16:24:52 +01:00
raid56.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
raid-stripe-tree.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
raid-stripe-tree.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
rcu-string.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
ref-verify.c btrfs: ref-verify: free ref cache before clearing mount opt 2024-01-12 01:59:49 +01:00
ref-verify.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
reflink.c btrfs: add helper to get fs_info from struct inode pointer 2024-03-04 16:24:49 +01:00
reflink.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
relocation.c btrfs: open code btrfs_backref_iter_free() 2024-03-04 16:24:52 +01:00
relocation.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
root-tree.c btrfs: qgroup: fix qgroup prealloc rsv leak in subvolume operations 2024-04-02 19:18:23 +02:00
root-tree.h btrfs: qgroup: fix qgroup prealloc rsv leak in subvolume operations 2024-04-02 19:18:23 +02:00
scrub.c btrfs: zoned: use zone aware sb location for scrub 2024-03-15 02:00:26 +01:00
scrub.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
send.c btrfs: open code trivial btrfs_lru_cache_size() 2024-03-04 16:24:53 +01:00
send.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
space-info.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
space-info.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
subpage.c btrfs: subpage: make writer lock utilize bitmap 2024-03-05 17:13:23 +01:00
subpage.h btrfs: subpage: make reader lock utilize bitmap 2024-03-05 17:13:23 +01:00
super.c btrfs: factor out validation of btrfs_ioctl_vol_args::name 2024-03-04 16:24:52 +01:00
super.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
sysfs.c btrfs: introduce offload_csum_mode to tweak checksum offloading behavior 2024-03-04 16:24:52 +01:00
sysfs.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
transaction.c btrfs: always clear PERTRANS metadata during commit 2024-04-02 19:19:13 +02:00
transaction.h btrfs: remove no longer used btrfs_transaction_in_commit() 2024-03-04 16:24:52 +01:00
tree-checker.c btrfs: tree-checker: dump the page status if hit something wrong 2024-03-05 17:13:23 +01:00
tree-checker.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
tree-log.c btrfs: uninline some static inline helpers from tree-log.h 2024-03-04 16:24:53 +01:00
tree-log.h btrfs: uninline some static inline helpers from tree-log.h 2024-03-04 16:24:53 +01:00
tree-mod-log.c btrfs: drop static inline specifiers from tree-mod-log.c 2024-03-04 16:24:53 +01:00
tree-mod-log.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
ulist.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
ulist.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
uuid-tree.c btrfs: unify handling of return values of btrfs_insert_empty_items() 2024-03-04 16:24:48 +01:00
uuid-tree.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
verity.c btrfs: remove unused included headers 2024-03-04 16:24:46 +01:00
verity.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
volumes.c btrfs: return accurate error code on open failure in open_fs_devices() 2024-03-26 16:42:39 +01:00
volumes.h btrfs: pass btrfs_device to btrfs_scratch_superblocks() 2024-03-04 16:24:54 +01:00
xattr.c btrfs: cache that we don't have security.capability set 2023-12-15 20:27:05 +01:00
xattr.h btrfs: add forward declarations and headers, part 1 2024-03-04 16:24:49 +01:00
zlib.c btrfs: zlib: Fix spelling mistake "infalte" -> "inflate" 2024-03-04 16:24:46 +01:00
zoned.c btrfs: zoned: fix use-after-free in do_zone_finish() 2024-03-26 16:41:01 +01:00
zoned.h btrfs: add forward declarations and headers, part 2 2024-03-04 16:24:49 +01:00
zstd.c btrfs: zstd: fix and simplify the inline extent decompression (v2) 2024-03-04 16:24:46 +01:00