diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 5 | 
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index b7c569a42aa4..0226c9279cef 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1463,6 +1463,8 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)  	struct Scsi_Host *host = cmd->device->host;  	int rtn = 0; +	atomic_inc(&cmd->device->iorequest_cnt); +  	/* check if the device is still usable */  	if (unlikely(cmd->device->sdev_state == SDEV_DEL)) {  		/* in SDEV_DEL we error all commands. DID_NO_CONNECT @@ -1483,6 +1485,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)  		 */  		SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd,  			"queuecommand : device blocked\n")); +		atomic_dec(&cmd->device->iorequest_cnt);  		return SCSI_MLQUEUE_DEVICE_BUSY;  	} @@ -1515,6 +1518,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)  	trace_scsi_dispatch_cmd_start(cmd);  	rtn = host->hostt->queuecommand(host, cmd);  	if (rtn) { +		atomic_dec(&cmd->device->iorequest_cnt);  		trace_scsi_dispatch_cmd_error(cmd, rtn);  		if (rtn != SCSI_MLQUEUE_DEVICE_BUSY &&  		    rtn != SCSI_MLQUEUE_TARGET_BUSY) @@ -1761,7 +1765,6 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,  		goto out_dec_host_busy;  	} -	atomic_inc(&cmd->device->iorequest_cnt);  	return BLK_STS_OK;  out_dec_host_busy:  | 
