forked from luck/tmp_suning_uos_patched
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 DEFINE_MUTEX(scsi_sense_cache_mutex);
|
||||
|
||||
static void scsi_mq_uninit_cmd(struct scsi_cmnd *cmd);
|
||||
|
||||
static inline struct kmem_cache *
|
||||
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;
|
||||
|
||||
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);
|
||||
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.
|
||||
*/
|
||||
if (q->mq_ops) {
|
||||
cmd->request->rq_flags &= ~RQF_DONTPREP;
|
||||
scsi_mq_uninit_cmd(cmd);
|
||||
scsi_mq_requeue_cmd(cmd);
|
||||
} else {
|
||||
scsi_release_buffers(cmd);
|
||||
|
|
Loading…
Reference in New Issue
Block a user