Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94d0e7b8 authored by Jeff Garzik 's avatar Jeff Garzik
Browse files

[SCSI] allow sleeping in ->eh_device_reset_handler()

parent 8fa728a2
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -973,8 +973,7 @@ Details:
 *
 *      Returns SUCCESS if command aborted else FAILED
 *
 *      Locks: struct Scsi_Host::host_lock held (with irqsave) on entry
 *      and assumed to be held on return.
 *      Locks: None held
 *
 *      Calling context: kernel thread
 *
+13 −1
Original line number Diff line number Diff line
@@ -2615,7 +2615,7 @@ static int sbp2scsi_abort(struct scsi_cmnd *SCpnt)
/*
 * Called by scsi stack when something has really gone wrong.
 */
static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
static int __sbp2scsi_reset(struct scsi_cmnd *SCpnt)
{
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
@@ -2630,6 +2630,18 @@ static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
	return(SUCCESS);
}

static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
{
	unsigned long flags;
	int rc;

	spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
	rc = __sbp2scsi_reset(SCpnt);
	spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);

	return rc;
}

static const char *sbp2scsi_info (struct Scsi_Host *host)
{
        return "SCSI emulation for IEEE-1394 SBP-2 Devices";
+1 −5
Original line number Diff line number Diff line
@@ -1801,7 +1801,6 @@ int
mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
{
	MPT_SCSI_HOST	*hd;
	spinlock_t	*host_lock = SCpnt->device->host->host_lock;

	/* If we can't locate our host adapter structure, return FAILED status.
	 */
@@ -1818,7 +1817,6 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
	printk(KERN_WARNING MYNAM ": %s: >> Attempting target reset! (sc=%p)\n",
	       hd->ioc->name, SCpnt);

	spin_unlock_irq(host_lock);
	if (mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
		SCpnt->device->channel, SCpnt->device->id,
		0, 0, 5 /* 5 second timeout */)
@@ -1830,12 +1828,10 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
		 		hd->ioc->name, SCpnt);
		hd->tmPending = 0;
		hd->tmState = TM_STATE_NONE;
		spin_lock_irq(host_lock);
		return FAILED;
	}
	spin_lock_irq(host_lock);
	return SUCCESS;

	return SUCCESS;
}

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+0 −3
Original line number Diff line number Diff line
@@ -636,8 +636,6 @@ zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
	struct zfcp_unit *unit = (struct zfcp_unit *) scpnt->device->hostdata;
	struct Scsi_Host *scsi_host = scpnt->device->host;

	spin_unlock_irq(scsi_host->host_lock);

	if (!unit) {
		ZFCP_LOG_NORMAL("bug: Tried reset for nonexistent unit\n");
		retval = SUCCESS;
@@ -680,7 +678,6 @@ zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
		retval = SUCCESS;
	}
 out:
	spin_lock_irq(scsi_host->host_lock);
	return retval;
}

+0 −2
Original line number Diff line number Diff line
@@ -1225,8 +1225,6 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
	}

	DO_UNLOCK(flags);

	spin_lock_irq(shpnt->host_lock);
	return ret;
}

Loading