Block I/O while SG reset operation in progress - the midlayer patch
PATCH 1/2 Block I/O while SG reset operation in progress - the midlayer patch
The scsi midlayer portion of the patch
Signed-off-by James Smart <[email protected]>
drivers/scsi/scsi_error.c +22 -0
@@ -1654,7 +1654,9 @@ int scsi_reset_provider(struct scsi_device *dev, int flag) {struct scsi_cmnd *scmd =scsi_get_command (dev,GFP_KERNEL ); +struct Scsi_Host *shost = dev->host;struct request req; +unsigned long flags;int rtn; scmd->request = &req;
@@ -1684,6 +1686,10 @@ scsi_reset_provider(struct scsi_device **/ scmd->pid =0 ; +spin_lock_irqsave (shost->host_lock, flags); + shost->tmf_in_progress =1 ; +spin_unlock_irqrestore (shost->host_lock, flags); +switch (flag) {case SCSI_TRY_RESET_DEVICE : rtn =scsi_try_bus_device_reset (scmd);
@@ -1702,6 +1708,22 @@ scsi_reset_provider(struct scsi_device * rtn =FAILED ; } +spin_lock_irqsave (shost->host_lock, flags); + shost->tmf_in_progress =0 ; +spin_unlock_irqrestore (shost->host_lock, flags); + +/* +* be sure to wake up anyone who was sleeping or had their queue +* suspended while we performed the TMF. +*/ +SCSI_LOG_ERROR_RECOVERY (3 , +printk ("%s: waking up host to restart after TMF\n" , + __FUNCTION__)); + +wake_up (&shost->host_wait); + +scsi_run_host_queues (shost); +scsi_next_command (scmd);return rtn; }
include/scsi/scsi_host.h +5 -1
@@ -556,6 +556,9 @@ struct Scsi_Host {*/ unsigned ordered_tag:1; +/* task mgmt function in progress */ + unsigned tmf_in_progress:1; +/* * Optional work queue to be utilized by the transport */
@@ -633,7 +636,8 @@ static inline int scsi_host_in_recovery( {return shost->shost_state ==SHOST_RECOVERY || shost->shost_state ==SHOST_CANCEL_RECOVERY || - shost->shost_state ==SHOST_DEL_RECOVERY ; + shost->shost_state ==SHOST_DEL_RECOVERY || + shost->tmf_in_progress; }extern int scsi_queue_work (struct Scsi_Host *,struct work_struct *);