diff options
Diffstat (limited to 'fs/bio.c')
-rw-r--r-- | fs/bio.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -1018,6 +1018,8 @@ void bio_endio(struct bio *bio, unsigned int bytes_done, int error) | |||
1018 | { | 1018 | { |
1019 | if (error) | 1019 | if (error) |
1020 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | 1020 | clear_bit(BIO_UPTODATE, &bio->bi_flags); |
1021 | else if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | ||
1022 | error = -EIO; | ||
1021 | 1023 | ||
1022 | if (unlikely(bytes_done > bio->bi_size)) { | 1024 | if (unlikely(bytes_done > bio->bi_size)) { |
1023 | printk("%s: want %u bytes done, only %u left\n", __FUNCTION__, | 1025 | printk("%s: want %u bytes done, only %u left\n", __FUNCTION__, |
@@ -1028,7 +1030,7 @@ void bio_endio(struct bio *bio, unsigned int bytes_done, int error) | |||
1028 | bio->bi_size -= bytes_done; | 1030 | bio->bi_size -= bytes_done; |
1029 | bio->bi_sector += (bytes_done >> 9); | 1031 | bio->bi_sector += (bytes_done >> 9); |
1030 | 1032 | ||
1031 | if (bio->bi_end_io) | 1033 | if (bio->bi_size && bio->bi_end_io) |
1032 | bio->bi_end_io(bio, bytes_done, error); | 1034 | bio->bi_end_io(bio, bytes_done, error); |
1033 | } | 1035 | } |
1034 | 1036 | ||