mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 03:35:32 -04:00
btrfs: zoned: skip fully truncated ordered extents at zone finish
A fully truncated ordered extent (truncated_len == 0) wrote no data, so its ->csum_list is empty and btrfs_finish_ordered_zoned() trips: assertion failed: !list_empty(&ordered->csum_list), in fs/btrfs/zoned.c:2141 Since commit66ff4d366ea short or cancelled direct IO write finishes the unsubmitted ordered extent as truncated with uptodate = true instead of setting BTRFS_ORDERED_IOERR, so it now reaches btrfs_finish_ordered_zoned() rather than being skipped by the IOERR check in btrfs_finish_ordered_io(). generic/208 hits this on a zoned filesystem. Return early for these, like the BTRFS_ORDERED_PREALLOC case; there is no zone append result to record and btrfs_finish_one_ordered() skips them too. Fixes:66ff4d366e("btrfs: fix false IO failure after falling back to buffered write") Reviewed-by: Qu Wenruo <wqu@suse.com> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
0d214d14be
commit
ab602da96a
@@ -2138,6 +2138,16 @@ void btrfs_finish_ordered_zoned(struct btrfs_ordered_extent *ordered)
|
||||
if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered->flags))
|
||||
return;
|
||||
|
||||
/*
|
||||
* A fully truncated ordered extent wrote no data and so has
|
||||
* no zone append result to record.
|
||||
*/
|
||||
if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered->flags) &&
|
||||
ordered->truncated_len == 0) {
|
||||
ASSERT(list_empty(&ordered->csum_list));
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(!list_empty(&ordered->csum_list));
|
||||
sum = list_first_entry(&ordered->csum_list, struct btrfs_ordered_sum, list);
|
||||
logical = sum->logical;
|
||||
|
||||
Reference in New Issue
Block a user