lkml.org 
[lkml]   [2015]   [May]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 05/11] block: remove split code in blkdev_issue_discard
    Date
    The split code in blkdev_issue_discard() can go away now
    that any driver that cares does the split.

    Signed-off-by: Ming Lin <mlin@kernel.org>
    ---
    block/blk-lib.c | 73 +++++++++++----------------------------------------------
    1 file changed, 14 insertions(+), 59 deletions(-)

    diff --git a/block/blk-lib.c b/block/blk-lib.c
    index 7688ee3..3bf3c4a 100644
    --- a/block/blk-lib.c
    +++ b/block/blk-lib.c
    @@ -43,34 +43,17 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
    DECLARE_COMPLETION_ONSTACK(wait);
    struct request_queue *q = bdev_get_queue(bdev);
    int type = REQ_WRITE | REQ_DISCARD;
    - unsigned int max_discard_sectors, granularity;
    - int alignment;
    struct bio_batch bb;
    struct bio *bio;
    int ret = 0;
    struct blk_plug plug;

    - if (!q)
    + if (!q || !nr_sects)
    return -ENXIO;

    if (!blk_queue_discard(q))
    return -EOPNOTSUPP;

    - /* Zero-sector (unknown) and one-sector granularities are the same. */
    - granularity = max(q->limits.discard_granularity >> 9, 1U);
    - alignment = (bdev_discard_alignment(bdev) >> 9) % granularity;
    -
    - /*
    - * Ensure that max_discard_sectors is of the proper
    - * granularity, so that requests stay aligned after a split.
    - */
    - max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9);
    - max_discard_sectors -= max_discard_sectors % granularity;
    - if (unlikely(!max_discard_sectors)) {
    - /* Avoid infinite loop below. Being cautious never hurts. */
    - return -EOPNOTSUPP;
    - }
    -
    if (flags & BLKDEV_DISCARD_SECURE) {
    if (!blk_queue_secdiscard(q))
    return -EOPNOTSUPP;
    @@ -82,52 +65,24 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
    bb.wait = &wait;

    blk_start_plug(&plug);
    - while (nr_sects) {
    - unsigned int req_sects;
    - sector_t end_sect, tmp;

    - bio = bio_alloc(gfp_mask, 1);
    - if (!bio) {
    - ret = -ENOMEM;
    - break;
    - }
    + bio = bio_alloc(gfp_mask, 1);
    + if (!bio) {
    + ret = -ENOMEM;
    + goto out;
    + }

    - req_sects = min_t(sector_t, nr_sects, max_discard_sectors);
    -
    - /*
    - * If splitting a request, and the next starting sector would be
    - * misaligned, stop the discard at the previous aligned sector.
    - */
    - end_sect = sector + req_sects;
    - tmp = end_sect;
    - if (req_sects < nr_sects &&
    - sector_div(tmp, granularity) != alignment) {
    - end_sect = end_sect - alignment;
    - sector_div(end_sect, granularity);
    - end_sect = end_sect * granularity + alignment;
    - req_sects = end_sect - sector;
    - }
    + bio->bi_iter.bi_sector = sector;
    + bio->bi_end_io = bio_batch_end_io;
    + bio->bi_bdev = bdev;
    + bio->bi_private = &bb;

    - bio->bi_iter.bi_sector = sector;
    - bio->bi_end_io = bio_batch_end_io;
    - bio->bi_bdev = bdev;
    - bio->bi_private = &bb;
    + bio->bi_iter.bi_size = nr_sects << 9;

    - bio->bi_iter.bi_size = req_sects << 9;
    - nr_sects -= req_sects;
    - sector = end_sect;
    + atomic_inc(&bb.done);
    + submit_bio(type, bio);

    - atomic_inc(&bb.done);
    - submit_bio(type, bio);
    -
    - /*
    - * We can loop for a long time in here, if someone does
    - * full device discards (like mkfs). Be nice and allow
    - * us to schedule out to avoid softlocking if preempt
    - * is disabled.
    - */
    - cond_resched();
    - }
    +out:
    blk_finish_plug(&plug);

    /* Wait for bios in-flight */
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-05-22 20:41    [W:4.545 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site