mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 22:58:29 +00:00
[SCSI] Block I/O while SG reset operation in progress - the midlayer patch
The scsi midlayer portion of the patch Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
12e9b5fb96
commit
d7a1bb0a04
2 changed files with 27 additions and 1 deletions
|
@ -1672,7 +1672,9 @@ int
|
||||||
scsi_reset_provider(struct scsi_device *dev, int flag)
|
scsi_reset_provider(struct scsi_device *dev, int flag)
|
||||||
{
|
{
|
||||||
struct scsi_cmnd *scmd = scsi_get_command(dev, GFP_KERNEL);
|
struct scsi_cmnd *scmd = scsi_get_command(dev, GFP_KERNEL);
|
||||||
|
struct Scsi_Host *shost = dev->host;
|
||||||
struct request req;
|
struct request req;
|
||||||
|
unsigned long flags;
|
||||||
int rtn;
|
int rtn;
|
||||||
|
|
||||||
scmd->request = &req;
|
scmd->request = &req;
|
||||||
|
@ -1699,6 +1701,10 @@ scsi_reset_provider(struct scsi_device *dev, int flag)
|
||||||
*/
|
*/
|
||||||
scmd->pid = 0;
|
scmd->pid = 0;
|
||||||
|
|
||||||
|
spin_lock_irqsave(shost->host_lock, flags);
|
||||||
|
shost->tmf_in_progress = 1;
|
||||||
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||||
|
|
||||||
switch (flag) {
|
switch (flag) {
|
||||||
case SCSI_TRY_RESET_DEVICE:
|
case SCSI_TRY_RESET_DEVICE:
|
||||||
rtn = scsi_try_bus_device_reset(scmd);
|
rtn = scsi_try_bus_device_reset(scmd);
|
||||||
|
@ -1717,6 +1723,22 @@ scsi_reset_provider(struct scsi_device *dev, int flag)
|
||||||
rtn = FAILED;
|
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);
|
scsi_next_command(scmd);
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
|
@ -542,6 +542,9 @@ struct Scsi_Host {
|
||||||
*/
|
*/
|
||||||
unsigned ordered_tag:1;
|
unsigned ordered_tag:1;
|
||||||
|
|
||||||
|
/* task mgmt function in progress */
|
||||||
|
unsigned tmf_in_progress:1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Optional work queue to be utilized by the transport
|
* Optional work queue to be utilized by the transport
|
||||||
*/
|
*/
|
||||||
|
@ -619,7 +622,8 @@ static inline int scsi_host_in_recovery(struct Scsi_Host *shost)
|
||||||
{
|
{
|
||||||
return shost->shost_state == SHOST_RECOVERY ||
|
return shost->shost_state == SHOST_RECOVERY ||
|
||||||
shost->shost_state == SHOST_CANCEL_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 *);
|
extern int scsi_queue_work(struct Scsi_Host *, struct work_struct *);
|
||||||
|
|
Loading…
Add table
Reference in a new issue