提交 f17e232e 编写于 作者: D Dmitry Monakhov 提交者: Jens Axboe

blkdev: allow async blkdev_issue_flush requests

In some places caller don't want to wait a request to complete.
Signed-off-by: NDmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
上级 fbd9b09a
...@@ -286,8 +286,9 @@ static void bio_end_empty_barrier(struct bio *bio, int err) ...@@ -286,8 +286,9 @@ static void bio_end_empty_barrier(struct bio *bio, int err)
set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
clear_bit(BIO_UPTODATE, &bio->bi_flags); clear_bit(BIO_UPTODATE, &bio->bi_flags);
} }
if (bio->bi_private)
complete(bio->bi_private); complete(bio->bi_private);
bio_put(bio);
} }
/** /**
...@@ -300,7 +301,8 @@ static void bio_end_empty_barrier(struct bio *bio, int err) ...@@ -300,7 +301,8 @@ static void bio_end_empty_barrier(struct bio *bio, int err)
* Description: * Description:
* Issue a flush for the block device in question. Caller can supply * Issue a flush for the block device in question. Caller can supply
* room for storing the error offset in case of a flush error, if they * room for storing the error offset in case of a flush error, if they
* wish to. * wish to. If WAIT flag is not passed then caller may check only what
* request was pushed in some internal queue for later handling.
*/ */
int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
sector_t *error_sector, unsigned long flags) sector_t *error_sector, unsigned long flags)
...@@ -319,19 +321,22 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, ...@@ -319,19 +321,22 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
bio = bio_alloc(gfp_mask, 0); bio = bio_alloc(gfp_mask, 0);
bio->bi_end_io = bio_end_empty_barrier; bio->bi_end_io = bio_end_empty_barrier;
bio->bi_private = &wait;
bio->bi_bdev = bdev; bio->bi_bdev = bdev;
submit_bio(WRITE_BARRIER, bio); if (test_bit(BLKDEV_WAIT, &flags))
bio->bi_private = &wait;
wait_for_completion(&wait);
/* bio_get(bio);
* The driver must store the error location in ->bi_sector, if submit_bio(WRITE_BARRIER, bio);
* it supports it. For non-stacked drivers, this should be copied if (test_bit(BLKDEV_WAIT, &flags)) {
* from blk_rq_pos(rq). wait_for_completion(&wait);
*/ /*
if (error_sector) * The driver must store the error location in ->bi_sector, if
*error_sector = bio->bi_sector; * it supports it. For non-stacked drivers, this should be
* copied from blk_rq_pos(rq).
*/
if (error_sector)
*error_sector = bio->bi_sector;
}
if (bio_flagged(bio, BIO_EOPNOTSUPP)) if (bio_flagged(bio, BIO_EOPNOTSUPP))
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册