Message ID | 1478865957-25252-9-git-send-email-tom.leiming@gmail.com (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Mike Snitzer |
Headers | show |
On Fri, Nov 11, 2016 at 8:05 PM, Ming Lei <tom.leiming@gmail.com> wrote: > Avoid to access .bi_vcnt directly, because the bio can be > splitted from block layer, and .bi_vcnt should never have > been used here. > > Signed-off-by: Ming Lei <tom.leiming@gmail.com> > --- > drivers/md/dm-rq.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c > index b2a9e2d161e4..d9cc8324e597 100644 > --- a/drivers/md/dm-rq.c > +++ b/drivers/md/dm-rq.c > @@ -797,8 +797,13 @@ static void dm_old_request_fn(struct request_queue *q) > if (req_op(rq) != REQ_OP_FLUSH) > pos = blk_rq_pos(rq); > > + /* > + * bio can be splitted from block layer, so use > + * !bio_multiple_segments instead of 'bio->bi_vcnt == 1' > + */ > if ((dm_old_request_peeked_before_merge_deadline(md) && > - md_in_flight(md) && rq->bio && rq->bio->bi_vcnt == 1 && > + md_in_flight(md) && rq->bio && > + !bio_multiple_segments(rq->bio) && > md->last_rq_pos == pos && md->last_rq_rw == rq_data_dir(rq)) || > (ti->type->busy && ti->type->busy(ti))) { > blk_delay_queue(q, 10); Hi Alasdair, Mike, Christoph and anyone, Could you give this one a review? Thanks, Ming Lei -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On Fri, Nov 11 2016 at 7:05am -0500, Ming Lei <tom.leiming@gmail.com> wrote: > Avoid to access .bi_vcnt directly, because the bio can be > splitted from block layer, and .bi_vcnt should never have > been used here. > > Signed-off-by: Ming Lei <tom.leiming@gmail.com> I've staged this for 4.10 -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/drivers/md/dm-rq.c b/drivers/md/dm-rq.c index b2a9e2d161e4..d9cc8324e597 100644 --- a/drivers/md/dm-rq.c +++ b/drivers/md/dm-rq.c @@ -797,8 +797,13 @@ static void dm_old_request_fn(struct request_queue *q) if (req_op(rq) != REQ_OP_FLUSH) pos = blk_rq_pos(rq); + /* + * bio can be splitted from block layer, so use + * !bio_multiple_segments instead of 'bio->bi_vcnt == 1' + */ if ((dm_old_request_peeked_before_merge_deadline(md) && - md_in_flight(md) && rq->bio && rq->bio->bi_vcnt == 1 && + md_in_flight(md) && rq->bio && + !bio_multiple_segments(rq->bio) && md->last_rq_pos == pos && md->last_rq_rw == rq_data_dir(rq)) || (ti->type->busy && ti->type->busy(ti))) { blk_delay_queue(q, 10);
Avoid to access .bi_vcnt directly, because the bio can be splitted from block layer, and .bi_vcnt should never have been used here. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- drivers/md/dm-rq.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)