Only call bi_end_io once for any bio
[firefly-linux-kernel-4.4.55.git] / fs / bio.c
index 29a44c1b64c6a307948107308dec492252654150..5720b940bb5fc4e53b0a03a9723339113c69ac5b 100644 (file)
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -1018,6 +1018,8 @@ void bio_endio(struct bio *bio, unsigned int bytes_done, int error)
 {
        if (error)
                clear_bit(BIO_UPTODATE, &bio->bi_flags);
+       else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
+               error = -EIO;
 
        if (unlikely(bytes_done > bio->bi_size)) {
                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)
        bio->bi_size -= bytes_done;
        bio->bi_sector += (bytes_done >> 9);
 
-       if (bio->bi_end_io)
+       if (bio->bi_size && bio->bi_end_io)
                bio->bi_end_io(bio, bytes_done, error);
 }