scsi: scsi-mq: Always unprepare before requeuing a request
One of the two scsi-mq functions that requeue a request unprepares a
request before requeueing (scsi_io_completion()) but the other function
not (__scsi_queue_insert()). Make sure that a request is unprepared
before requeuing it.
Fixes: commit d285203cf6
("scsi: add support for a blk-mq based I/O path.")
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Damien Le Moal <damien.lemoal@wdc.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
cad8cf20a6
commit
a45a1f3614
|
@ -44,6 +44,8 @@ static struct kmem_cache *scsi_sense_cache;
|
||||||
static struct kmem_cache *scsi_sense_isadma_cache;
|
static struct kmem_cache *scsi_sense_isadma_cache;
|
||||||
static DEFINE_MUTEX(scsi_sense_cache_mutex);
|
static DEFINE_MUTEX(scsi_sense_cache_mutex);
|
||||||
|
|
||||||
|
static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd);
|
||||||
|
|
||||||
static inline struct kmem_cache *
|
static inline struct kmem_cache *
|
||||||
scsi_select_sense_cache(bool unchecked_isa_dma)
|
scsi_select_sense_cache(bool unchecked_isa_dma)
|
||||||
{
|
{
|
||||||
|
@ -140,6 +142,12 @@ static void scsi_mq_requeue_cmd(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
struct scsi_device *sdev = cmd->device;
|
struct scsi_device *sdev = cmd->device;
|
||||||
|
|
||||||
|
if (cmd->request->rq_flags & RQF_DONTPREP) {
|
||||||
|
cmd->request->rq_flags &= ~RQF_DONTPREP;
|
||||||
|
scsi_mq_uninit_cmd(cmd);
|
||||||
|
} else {
|
||||||
|
WARN_ON_ONCE(true);
|
||||||
|
}
|
||||||
blk_mq_requeue_request(cmd->request, true);
|
blk_mq_requeue_request(cmd->request, true);
|
||||||
put_device(&sdev->sdev_gendev);
|
put_device(&sdev->sdev_gendev);
|
||||||
}
|
}
|
||||||
|
@ -982,8 +990,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
||||||
* A new command will be prepared and issued.
|
* A new command will be prepared and issued.
|
||||||
*/
|
*/
|
||||||
if (q->mq_ops) {
|
if (q->mq_ops) {
|
||||||
cmd->request->rq_flags &= ~RQF_DONTPREP;
|
|
||||||
scsi_mq_uninit_cmd(cmd);
|
|
||||||
scsi_mq_requeue_cmd(cmd);
|
scsi_mq_requeue_cmd(cmd);
|
||||||
} else {
|
} else {
|
||||||
scsi_release_buffers(cmd);
|
scsi_release_buffers(cmd);
|
||||||
|
|
Loading…
Reference in New Issue