ide:ide-cd: fix kernel panic resulting from missing scsi_req_init
authorHongxu Jia <hongxu.jia@windriver.com>
Tue, 31 Oct 2017 07:39:40 +0000 (15:39 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 1 Nov 2017 14:21:58 +0000 (08:21 -0600)
Since we split the scsi_request out of struct request, while the
standard prep_rq_fn builds 10 byte cmds, it missed to invoke
scsi_req_init() to initialize certain fields of a scsi_request
structure (.__cmd[], .cmd, .cmd_len and .sense_len but no other
members of struct scsi_request).

An example panic on virtual machines (qemu/virtualbox) to boot
from IDE cdrom:
...
[    8.754381] Call Trace:
[    8.755419]  blk_peek_request+0x182/0x2e0
[    8.755863]  blk_fetch_request+0x1c/0x40
[    8.756148]  ? ktime_get+0x40/0xa0
[    8.756385]  do_ide_request+0x37d/0x660
[    8.756704]  ? cfq_group_service_tree_add+0x98/0xc0
[    8.757011]  ? cfq_service_tree_add+0x1e5/0x2c0
[    8.757313]  ? ktime_get+0x40/0xa0
[    8.757544]  __blk_run_queue+0x3d/0x60
[    8.757837]  queue_unplugged+0x2f/0xc0
[    8.758088]  blk_flush_plug_list+0x1f4/0x240
[    8.758362]  blk_finish_plug+0x2c/0x40
...
[    8.770906] RIP: ide_cdrom_prep_fn+0x63/0x180 RSP: ffff92aec018bae8
[    8.772329] ---[ end trace 6408481e551a85c9 ]---
...

Fixes: 82ed4db499b8 ("block: split scsi_request out of struct request")
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/ide/ide-cd.c

index 81e18f9628d068e54cd5fca5f80b06594ee5d29f..a7355ab3bb221a0a6438d336719f1f3a30e4e00a 100644 (file)
@@ -1328,6 +1328,7 @@ static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
        unsigned long blocks = blk_rq_sectors(rq) / (hard_sect >> 9);
        struct scsi_request *req = scsi_req(rq);
 
+       scsi_req_init(req);
        memset(req->cmd, 0, BLK_MAX_CDB);
 
        if (rq_data_dir(rq) == READ)