lkml.org 
[lkml]   [2010]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/4] blkdev: allow async blkdev_issue_flush requests
    Date
    In some places caller don't want to wait a request to complete.

    Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
    ---
    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 cf14311..f11eec9 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;
    --
    1.6.6.1


    \
     
     \ /
      Last update: 2010-04-28 15:59    [W:4.591 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site