This function doesn't correctly accumulate -EIO for its caller. --- 25-akpm/fs/direct-io.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) diff -puN fs/direct-io.c~dio_bio_reap-retval-fix fs/direct-io.c --- 25/fs/direct-io.c~dio_bio_reap-retval-fix Thu Apr 22 14:43:49 2004 +++ 25-akpm/fs/direct-io.c Thu Apr 22 14:44:17 2004 @@ -446,12 +446,15 @@ static int dio_bio_reap(struct dio *dio) while (dio->bio_list) { unsigned long flags; struct bio *bio; + int ret2; spin_lock_irqsave(&dio->bio_lock, flags); bio = dio->bio_list; dio->bio_list = bio->bi_private; spin_unlock_irqrestore(&dio->bio_lock, flags); - ret = dio_bio_complete(dio, bio); + ret2 = dio_bio_complete(dio, bio); + if (ret == 0) + ret = ret2; } dio->reap_counter = 0; } _