Skip to content

Commit 3cd181c

Browse files
Michal Grzedzickikdave
authored andcommitted
btrfs: fix silent IO error loss in encoded writes and zoned split
can_finish_ordered_extent() and btrfs_finish_ordered_zoned() set BTRFS_ORDERED_IOERR via bare set_bit(). Later, btrfs_mark_ordered_extent_error() in btrfs_finish_one_ordered() uses test_and_set_bit(), finds it already set, and skips mapping_set_error(). The error is never recorded on the inode's address_space, making it invisible to fsync. For encoded writes this causes btrfs receive to silently produce files with zero-filled holes. Fix: replace bare set_bit(BTRFS_ORDERED_IOERR) with btrfs_mark_ordered_extent_error() which pairs test_and_set_bit() with mapping_set_error(), guaranteeing the error is recorded exactly once. Reviewed-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Mark Harmstone <mark@harmstone.com> Signed-off-by: Michal Grzedzicki <mge@meta.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent e0dfaeb commit 3cd181c

2 files changed

Lines changed: 2 additions & 2 deletions

File tree

fs/btrfs/ordered-data.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ static bool can_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
386386
}
387387

388388
if (!uptodate)
389-
set_bit(BTRFS_ORDERED_IOERR, &ordered->flags);
389+
btrfs_mark_ordered_extent_error(ordered);
390390

391391
if (ordered->bytes_left)
392392
return false;

fs/btrfs/zoned.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,7 @@ void btrfs_finish_ordered_zoned(struct btrfs_ordered_extent *ordered)
21342134
continue;
21352135
}
21362136
if (!btrfs_zoned_split_ordered(ordered, logical, len)) {
2137-
set_bit(BTRFS_ORDERED_IOERR, &ordered->flags);
2137+
btrfs_mark_ordered_extent_error(ordered);
21382138
btrfs_err(fs_info, "failed to split ordered extent");
21392139
goto out;
21402140
}

0 commit comments

Comments
 (0)