block: make sure FSEQ_DATA request has the same rq_disk as the original
rq->rq_disk and bio->bi_bdev->bd_disk may differ if a request has passed through remapping drivers. FSEQ_DATA request incorrectly followed bio->bi_bdev->bd_disk ending up being issued w/ mismatching rq_disk. Make it follow orig_rq->rq_disk. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com> Tested-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
parent
47f70d5a6c
commit
09d60c701b
1 changed files with 7 additions and 0 deletions
|
@ -111,6 +111,13 @@ static struct request *queue_next_fseq(struct request_queue *q)
|
||||||
break;
|
break;
|
||||||
case QUEUE_FSEQ_DATA:
|
case QUEUE_FSEQ_DATA:
|
||||||
init_request_from_bio(rq, orig_rq->bio);
|
init_request_from_bio(rq, orig_rq->bio);
|
||||||
|
/*
|
||||||
|
* orig_rq->rq_disk may be different from
|
||||||
|
* bio->bi_bdev->bd_disk if orig_rq got here through
|
||||||
|
* remapping drivers. Make sure rq->rq_disk points
|
||||||
|
* to the same one as orig_rq.
|
||||||
|
*/
|
||||||
|
rq->rq_disk = orig_rq->rq_disk;
|
||||||
rq->cmd_flags &= ~(REQ_FLUSH | REQ_FUA);
|
rq->cmd_flags &= ~(REQ_FLUSH | REQ_FUA);
|
||||||
rq->cmd_flags |= orig_rq->cmd_flags & (REQ_FLUSH | REQ_FUA);
|
rq->cmd_flags |= orig_rq->cmd_flags & (REQ_FLUSH | REQ_FUA);
|
||||||
rq->end_io = flush_data_end_io;
|
rq->end_io = flush_data_end_io;
|
||||||
|
|
Loading…
Add table
Reference in a new issue