On Sun, Oct 30, 2022 at 06:47:33PM +0000, Al Viro wrote: > static inline void set_bio_status(struct bio *bio, blk_status_t status) > { > if (unlikely(status)) > cmpxchg(&bio->bi_status, 0, status); > } > > with e.g. > if (bio->bi_status && !dio->bio.bi_status) > dio->bio.bi_status = bio->bi_status; > in blkdev_bio_end_io() replaced with > set_bio_status(&dio->bio, bio->bi_status); > > perhaps? I think so, yes. > That would probably do for almost all users, but... what about > e.g. drivers/md/raid1.c:fix_sync_read_error()? Looks like it really > intends non-zero -> zero change; I'm not familiar enough with the guts > of that sucker to tell if it is guaranteed to get no propagation from > another bio... I think the clearing to zero here is intentional as the bio failed, but it manages to get the data from the other leg of the mirror. But the md code is really hard to follow, and any change to this code needs careful review from the maintainer and the linux-raid list.