On 1/22/20 6:58 PM, Kirill Tkhai wrote: > This introduces a new primitive, which returns max sectors > for REQ_OP_WRITE_ZEROES operation. > @op_flags is unused now, and it will be enabled in next patch. > > Signed-off-by: Kirill Tkhai <ktkhai@xxxxxxxxxxxxx> > --- > block/blk-core.c | 2 +- > block/blk-merge.c | 9 ++++++--- > include/linux/blkdev.h | 8 +++++++- > 3 files changed, 14 insertions(+), 5 deletions(-) > Reviewed-by: Bob Liu <bob.liu@xxxxxxxxxx> > diff --git a/block/blk-core.c b/block/blk-core.c > index ac2634bcda1f..2edcd55624f1 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -978,7 +978,7 @@ generic_make_request_checks(struct bio *bio) > goto not_supported; > break; > case REQ_OP_WRITE_ZEROES: > - if (!q->limits.max_write_zeroes_sectors) > + if (!blk_queue_get_max_write_zeroes_sectors(q, bio->bi_opf)) > goto not_supported; > break; > default: > diff --git a/block/blk-merge.c b/block/blk-merge.c > index 1534ed736363..467b292bc6e8 100644 > --- a/block/blk-merge.c > +++ b/block/blk-merge.c > @@ -105,15 +105,18 @@ static struct bio *blk_bio_discard_split(struct request_queue *q, > static struct bio *blk_bio_write_zeroes_split(struct request_queue *q, > struct bio *bio, struct bio_set *bs, unsigned *nsegs) > { > + unsigned int max_sectors; > + > + max_sectors = blk_queue_get_max_write_zeroes_sectors(q, bio->bi_opf); > *nsegs = 0; > > - if (!q->limits.max_write_zeroes_sectors) > + if (!max_sectors) > return NULL; > > - if (bio_sectors(bio) <= q->limits.max_write_zeroes_sectors) > + if (bio_sectors(bio) <= max_sectors) > return NULL; > > - return bio_split(bio, q->limits.max_write_zeroes_sectors, GFP_NOIO, bs); > + return bio_split(bio, max_sectors, GFP_NOIO, bs); > } > > static struct bio *blk_bio_write_same_split(struct request_queue *q, > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > index 23a5850f35f6..264202fa3bf8 100644 > --- a/include/linux/blkdev.h > +++ b/include/linux/blkdev.h > @@ -988,6 +988,12 @@ static inline struct bio_vec req_bvec(struct request *rq) > return mp_bvec_iter_bvec(rq->bio->bi_io_vec, rq->bio->bi_iter); > } > > +static inline unsigned int blk_queue_get_max_write_zeroes_sectors( > + struct request_queue *q, unsigned int op_flags) > +{ > + return q->limits.max_write_zeroes_sectors; > +} > + > static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, > unsigned int op_flags) > { > @@ -1001,7 +1007,7 @@ static inline unsigned int blk_queue_get_max_sectors(struct request_queue *q, > return q->limits.max_write_same_sectors; > > if (unlikely(op == REQ_OP_WRITE_ZEROES)) > - return q->limits.max_write_zeroes_sectors; > + return blk_queue_get_max_write_zeroes_sectors(q, op_flags); > > return q->limits.max_sectors; > } > >