diff options
author | Dmitry Monakhov | 2010-04-28 15:55:07 +0200 |
---|---|---|
committer | Jens Axboe | 2010-04-28 19:47:36 +0200 |
commit | f17e232e9237c231daf9f0f4b177c61218bcb2e4 (patch) | |
tree | 6fae1e48cd6edde825229bfdf9a31ffbce9626e9 /block/blk-barrier.c | |
parent | blkdev: generalize flags for blkdev_issue_fn functions (diff) | |
download | kernel-qcow2-linux-f17e232e9237c231daf9f0f4b177c61218bcb2e4.tar.gz kernel-qcow2-linux-f17e232e9237c231daf9f0f4b177c61218bcb2e4.tar.xz kernel-qcow2-linux-f17e232e9237c231daf9f0f4b177c61218bcb2e4.zip |
blkdev: allow async blkdev_issue_flush requests
In some places caller don't want to wait a request to complete.
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/blk-barrier.c')
-rw-r--r-- | block/blk-barrier.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/block/blk-barrier.c b/block/blk-barrier.c index cf14311b98fc..f11eec9669e4 100644 --- a/block/blk-barrier.c +++ b/block/blk-barrier.c @@ -286,8 +286,9 @@ static void bio_end_empty_barrier(struct bio *bio, int err) set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); clear_bit(BIO_UPTODATE, &bio->bi_flags); } - - complete(bio->bi_private); + if (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) * Description: * 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 - * 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, sector_t *error_sector, unsigned long flags) @@ -319,19 +321,22 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask, bio = bio_alloc(gfp_mask, 0); bio->bi_end_io = bio_end_empty_barrier; - bio->bi_private = &wait; bio->bi_bdev = bdev; - submit_bio(WRITE_BARRIER, bio); - - wait_for_completion(&wait); + if (test_bit(BLKDEV_WAIT, &flags)) + bio->bi_private = &wait; - /* - * The driver must store the error location in ->bi_sector, if - * it supports it. For non-stacked drivers, this should be copied - * from blk_rq_pos(rq). - */ - if (error_sector) - *error_sector = bio->bi_sector; + bio_get(bio); + submit_bio(WRITE_BARRIER, bio); + if (test_bit(BLKDEV_WAIT, &flags)) { + wait_for_completion(&wait); + /* + * The driver must store the error location in ->bi_sector, if + * 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)) ret = -EOPNOTSUPP; |