On 04/12/2016 10:39 PM, Bart Van Assche wrote: > Move the code for rounding down a sector into a new function. > This patch does not change any functionality. > > Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx> > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > Cc: Jan Kara <jack@xxxxxxx> > Cc: Mike Snitzer <snitzer@xxxxxxxxxx> > Cc: Martin K. Petersen <martin.petersen@xxxxxxxxxx> > Cc: Dmitry Monakhov <dmonakhov@xxxxxxxxxx> > Cc: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > Cc: Sagi Grimberg <sagi@xxxxxxxxxxx> > --- > block/blk-lib.c | 32 +++++++++++++++++++++++++------- > 1 file changed, 25 insertions(+), 7 deletions(-) > > diff --git a/block/blk-lib.c b/block/blk-lib.c > index 9ebf653..2f4c6b2 100644 > --- a/block/blk-lib.c > +++ b/block/blk-lib.c > @@ -26,6 +26,26 @@ static void bio_batch_end_io(struct bio *bio) > bio_put(bio); > } > > +/* > + * Return the largest number that is less than or equal to @s and for which > + * the remainder of the division by @granularity is @alignment. > + */ > +static sector_t blk_round_sect_down(sector_t s, u32 granularity, u32 alignment) > +{ > + sector_t tmp = s, res = s; > + u32 remainder; > + > + WARN_ON_ONCE(alignment >= granularity); > + > + remainder = sector_div(tmp, granularity); > + if (remainder == alignment) > + return res; > + res -= remainder - alignment; > + if (remainder < alignment) > + res -= granularity; > + return min(res, s); > +} > + > /** > * blkdev_issue_discard - queue a discard > * @bdev: blockdev to issue discard for > @@ -73,7 +93,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, > blk_start_plug(&plug); > while (nr_sects) { > unsigned int req_sects; > - sector_t end_sect, tmp; > + sector_t end_sect; > > bio = bio_alloc(gfp_mask, 1); > if (!bio) { > @@ -89,12 +109,10 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, > * 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; > + if (req_sects < nr_sects) { > + end_sect = blk_round_sect_down(end_sect, granularity, > + alignment); > + WARN_ON_ONCE(end_sect < sector); > req_sects = end_sect - sector; > } > > Reviewed-by: Hannes Reinecke <hare@xxxxxxxx> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@xxxxxxx +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html