block: fix blkdev_issue_flush() not detecting and passing EOPNOTSUPP back

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>
This commit is contained in:
Jens Axboe 2008-03-04 11:47:46 +01:00
parent 56d94a37f6
commit cc66b4512c

View 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) 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); clear_bit(BIO_UPTODATE, &bio->bi_flags);
}
complete(bio->bi_private); 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; *error_sector = bio->bi_sector;
ret = 0; 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; ret = -EIO;
bio_put(bio); bio_put(bio);