From: Jens Axboe Found a subtle bug that caused mount errors on a SATA drive with barriers on reiser and ext3, where it should have recovered and just turned off barriers. The problem is that the EOPNOTSUPP error isn't being propagated properly to the bounced bio. This patch fixes that by correctly passing error all the way down. Signed-off-by: Jens Axboe Signed-off-by: Andrew Morton --- 25-akpm/mm/highmem.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff -puN mm/highmem.c~highmemc-fix-bio-error-propagation mm/highmem.c --- 25/mm/highmem.c~highmemc-fix-bio-error-propagation Fri Dec 10 15:08:36 2004 +++ 25-akpm/mm/highmem.c Fri Dec 10 15:08:36 2004 @@ -305,14 +305,14 @@ static void copy_to_high_bio_irq(struct } } -static void bounce_end_io(struct bio *bio, mempool_t *pool) +static void bounce_end_io(struct bio *bio, mempool_t *pool, int err) { struct bio *bio_orig = bio->bi_private; struct bio_vec *bvec, *org_vec; - int i, err = 0; + int i; - if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) - err = -EIO; + if (test_bit(BIO_EOPNOTSUPP, &bio->bi_flags)) + set_bit(BIO_EOPNOTSUPP, &bio_orig->bi_flags); /* * free up bounce indirect pages used @@ -334,7 +334,7 @@ static int bounce_end_io_write(struct bi if (bio->bi_size) return 1; - bounce_end_io(bio, page_pool); + bounce_end_io(bio, page_pool, err); return 0; } @@ -343,18 +343,18 @@ static int bounce_end_io_write_isa(struc if (bio->bi_size) return 1; - bounce_end_io(bio, isa_page_pool); + bounce_end_io(bio, isa_page_pool, err); return 0; } -static void __bounce_end_io_read(struct bio *bio, mempool_t *pool) +static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err) { struct bio *bio_orig = bio->bi_private; if (test_bit(BIO_UPTODATE, &bio->bi_flags)) copy_to_high_bio_irq(bio_orig, bio); - bounce_end_io(bio, pool); + bounce_end_io(bio, pool, err); } static int bounce_end_io_read(struct bio *bio, unsigned int bytes_done, int err) @@ -362,7 +362,7 @@ static int bounce_end_io_read(struct bio if (bio->bi_size) return 1; - __bounce_end_io_read(bio, page_pool); + __bounce_end_io_read(bio, page_pool, err); return 0; } @@ -371,7 +371,7 @@ static int bounce_end_io_read_isa(struct if (bio->bi_size) return 1; - __bounce_end_io_read(bio, isa_page_pool); + __bounce_end_io_read(bio, isa_page_pool, err); return 0; } _