|
@@ -3276,8 +3276,8 @@ fc_scsi_scan_rport(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * fc_block_scsi_eh - Block SCSI eh thread for blocked fc_rport
|
|
|
- * @cmnd: SCSI command that scsi_eh is trying to recover
|
|
|
+ * fc_block_rport() - Block SCSI eh thread for blocked fc_rport.
|
|
|
+ * @rport: Remote port that scsi_eh is trying to recover.
|
|
|
*
|
|
|
* This routine can be called from a FC LLD scsi_eh callback. It
|
|
|
* blocks the scsi_eh thread until the fc_rport leaves the
|
|
@@ -3289,10 +3289,9 @@ fc_scsi_scan_rport(struct work_struct *work)
|
|
|
* FAST_IO_FAIL if the fast_io_fail_tmo fired, this should be
|
|
|
* passed back to scsi_eh.
|
|
|
*/
|
|
|
-int fc_block_scsi_eh(struct scsi_cmnd *cmnd)
|
|
|
+int fc_block_rport(struct fc_rport *rport)
|
|
|
{
|
|
|
- struct Scsi_Host *shost = cmnd->device->host;
|
|
|
- struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
|
|
|
+ struct Scsi_Host *shost = rport_to_shost(rport);
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
@@ -3309,6 +3308,28 @@ int fc_block_scsi_eh(struct scsi_cmnd *cmnd)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(fc_block_rport);
|
|
|
+
|
|
|
+/**
|
|
|
+ * fc_block_scsi_eh - Block SCSI eh thread for blocked fc_rport
|
|
|
+ * @cmnd: SCSI command that scsi_eh is trying to recover
|
|
|
+ *
|
|
|
+ * This routine can be called from a FC LLD scsi_eh callback. It
|
|
|
+ * blocks the scsi_eh thread until the fc_rport leaves the
|
|
|
+ * FC_PORTSTATE_BLOCKED, or the fast_io_fail_tmo fires. This is
|
|
|
+ * necessary to avoid the scsi_eh failing recovery actions for blocked
|
|
|
+ * rports which would lead to offlined SCSI devices.
|
|
|
+ *
|
|
|
+ * Returns: 0 if the fc_rport left the state FC_PORTSTATE_BLOCKED.
|
|
|
+ * FAST_IO_FAIL if the fast_io_fail_tmo fired, this should be
|
|
|
+ * passed back to scsi_eh.
|
|
|
+ */
|
|
|
+int fc_block_scsi_eh(struct scsi_cmnd *cmnd)
|
|
|
+{
|
|
|
+ struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
|
|
|
+
|
|
|
+ return fc_block_rport(rport);
|
|
|
+}
|
|
|
EXPORT_SYMBOL(fc_block_scsi_eh);
|
|
|
|
|
|
/**
|