On Fri, Apr 13, 2018 at 04:30:35PM -0600, Jens Axboe wrote: > We can always get at the request from the payload, no need to store > a pointer to it. > > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > --- > drivers/block/loop.c | 36 +++++++++++++++++++----------------- > drivers/block/loop.h | 1 - > 2 files changed, 19 insertions(+), 18 deletions(-) > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index c9d04497a415..8b2fde2109fc 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -452,9 +452,9 @@ static void lo_complete_rq(struct request *rq) > { > struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq); > > - if (unlikely(req_op(cmd->rq) == REQ_OP_READ && cmd->use_aio && > - cmd->ret >= 0 && cmd->ret < blk_rq_bytes(cmd->rq))) { > - struct bio *bio = cmd->rq->bio; > + if (unlikely(req_op(rq) == REQ_OP_READ && cmd->use_aio && > + cmd->ret >= 0 && cmd->ret < blk_rq_bytes(rq))) { > + struct bio *bio = rq->bio; > > bio_advance(bio, cmd->ret); > zero_fill_bio(bio); > @@ -465,11 +465,13 @@ static void lo_complete_rq(struct request *rq) > > static void lo_rw_aio_do_completion(struct loop_cmd *cmd) > { > + struct request *rq = blk_mq_rq_from_pdu(cmd); > + > if (!atomic_dec_and_test(&cmd->ref)) > return; > kfree(cmd->bvec); > cmd->bvec = NULL; > - blk_mq_complete_request(cmd->rq); > + blk_mq_complete_request(rq); > } > > static void lo_rw_aio_complete(struct kiocb *iocb, long ret, long ret2) > @@ -487,7 +489,7 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, > { > struct iov_iter iter; > struct bio_vec *bvec; > - struct request *rq = cmd->rq; > + struct request *rq = blk_mq_rq_from_pdu(cmd); > struct bio *bio = rq->bio; > struct file *file = lo->lo_backing_file; > unsigned int offset; > @@ -1702,15 +1704,16 @@ EXPORT_SYMBOL(loop_unregister_transfer); > static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx, > const struct blk_mq_queue_data *bd) > { > - struct loop_cmd *cmd = blk_mq_rq_to_pdu(bd->rq); > - struct loop_device *lo = cmd->rq->q->queuedata; > + struct request *rq = bd->rq; > + struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq); > + struct loop_device *lo = rq->q->queuedata; > > - blk_mq_start_request(bd->rq); > + blk_mq_start_request(rq); > > if (lo->lo_state != Lo_bound) > return BLK_STS_IOERR; > > - switch (req_op(cmd->rq)) { > + switch (req_op(rq)) { > case REQ_OP_FLUSH: > case REQ_OP_DISCARD: > case REQ_OP_WRITE_ZEROES: > @@ -1723,8 +1726,8 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx, > > /* always use the first bio's css */ > #ifdef CONFIG_BLK_CGROUP > - if (cmd->use_aio && cmd->rq->bio && cmd->rq->bio->bi_css) { > - cmd->css = cmd->rq->bio->bi_css; > + if (cmd->use_aio && rq->bio && rq->bio->bi_css) { > + cmd->css = rq->bio->bi_css; > css_get(cmd->css); > } else > #endif > @@ -1736,8 +1739,9 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx, > > static void loop_handle_cmd(struct loop_cmd *cmd) > { > - const bool write = op_is_write(req_op(cmd->rq)); > - struct loop_device *lo = cmd->rq->q->queuedata; > + struct request *rq = blk_mq_rq_from_pdu(cmd); > + const bool write = op_is_write(req_op(rq)); > + struct loop_device *lo = rq->q->queuedata; > int ret = 0; > > if (write && (lo->lo_flags & LO_FLAGS_READ_ONLY)) { > @@ -1745,12 +1749,12 @@ static void loop_handle_cmd(struct loop_cmd *cmd) > goto failed; > } > > - ret = do_req_filebacked(lo, cmd->rq); > + ret = do_req_filebacked(lo, rq); > failed: > /* complete non-aio request */ > if (!cmd->use_aio || ret) { > cmd->ret = ret ? -EIO : 0; > - blk_mq_complete_request(cmd->rq); > + blk_mq_complete_request(rq); > } > } > > @@ -1767,9 +1771,7 @@ static int loop_init_request(struct blk_mq_tag_set *set, struct request *rq, > { > struct loop_cmd *cmd = blk_mq_rq_to_pdu(rq); > > - cmd->rq = rq; > kthread_init_work(&cmd->work, loop_queue_work); > - > return 0; > } > > diff --git a/drivers/block/loop.h b/drivers/block/loop.h > index 0f45416e4fcf..b78de9879f4f 100644 > --- a/drivers/block/loop.h > +++ b/drivers/block/loop.h > @@ -66,7 +66,6 @@ struct loop_device { > > struct loop_cmd { > struct kthread_work work; > - struct request *rq; > bool use_aio; /* use AIO interface to handle I/O */ > atomic_t ref; /* only for aio */ > long ret; > -- > 2.7.4 > Reviewed-by: Ming Lei <ming.lei@xxxxxxxxxx> -- Ming