ide: clear ide_req()->special for non-passthrough requests
authorJens Axboe <axboe@kernel.dk>
Fri, 16 Nov 2018 02:42:07 +0000 (19:42 -0700)
committerJens Axboe <axboe@kernel.dk>
Fri, 16 Nov 2018 02:47:35 +0000 (19:47 -0700)
The initial patch cleared this for all requests, which is wrong
since internal uses can't have this cleared as that's what they
are using to pass data. The fix moved the initialization to the
mq_ops->initialize_rq_fn(), but that's only a partial fix since
it only catches uses from blk_get_request(), not requests coming
from the file system.

Keep the non-fs initialization, and add the IDE entry clear
IFF RQF_DONTPREP isn't set and it's a passthrough request.

Fixes: d16a67667c61 ("ide: don't clear special on ide_queue_rq() entry")
Fixes: 22ce0a7ccf23 ("ide: don't use req->special")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/ide/ide-io.c

index c0dd0fad16a3d0b4033f4597a18289b6a4fa11a4..8445b484ae69ed3f813860731c137a6d4b32789b 100644 (file)
@@ -463,6 +463,11 @@ blk_status_t ide_queue_rq(struct blk_mq_hw_ctx *hctx,
        struct request  *rq = bd->rq;
        ide_startstop_t startstop;
 
+       if (!blk_rq_is_passthrough(rq) && !(rq->rq_flags & RQF_DONTPREP)) {
+               rq->rq_flags |= RQF_DONTPREP;
+               ide_req(rq)->special = NULL;
+       }
+
        /* HLD do_request() callback might sleep, make sure it's okay */
        might_sleep();