block: fix blkdev_issue_flush() not detecting and passing EOPNOTSUPP back
authorJens Axboe <jens.axboe@oracle.com>
Tue, 4 Mar 2008 10:47:46 +0000 (11:47 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 4 Mar 2008 10:47:46 +0000 (11:47 +0100)
This is important to eg dm, that tries to decide whether to stop using
barriers or not.

Tested as working by Anders Henke <anders.henke@1und1.de>

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/blk-barrier.c

index 6901eedeffce83bd3db09b3d0b802da6486994b4..55c5f1fc4f1fcd90c1f119a9bc0f58b46f446e83 100644 (file)
@@ -259,8 +259,11 @@ int blk_do_ordered(struct request_queue *q, struct request **rqp)
 
 static void bio_end_empty_barrier(struct bio *bio, int err)
 {
-       if (err)
+       if (err) {
+               if (err == -EOPNOTSUPP)
+                       set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
                clear_bit(BIO_UPTODATE, &bio->bi_flags);
+       }
 
        complete(bio->bi_private);
 }
@@ -309,7 +312,9 @@ int blkdev_issue_flush(struct block_device *bdev, sector_t *error_sector)
                *error_sector = bio->bi_sector;
 
        ret = 0;
-       if (!bio_flagged(bio, BIO_UPTODATE))
+       if (bio_flagged(bio, BIO_EOPNOTSUPP))
+               ret = -EOPNOTSUPP;
+       else if (!bio_flagged(bio, BIO_UPTODATE))
                ret = -EIO;
 
        bio_put(bio);