]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: zoned: skip fully truncated ordered extents at zone finish
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Thu, 16 Jul 2026 08:23:12 +0000 (10:23 +0200)
committerDavid Sterba <dsterba@suse.com>
Tue, 21 Jul 2026 04:43:46 +0000 (06:43 +0200)
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 commit 66ff4d366e7e a 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: 66ff4d366e7e ("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>
fs/btrfs/zoned.c

index 0706c0788cb29e878367f7056109051d23315f23..a016cb471beb4717b176c443c94b4ee1d262981b 100644 (file)
@@ -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;