|
@@ -102,10 +102,13 @@ static void zfcp_erp_action_dismiss_port(struct zfcp_port *port)
|
|
|
|
|
|
if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
|
|
|
zfcp_erp_action_dismiss(&port->erp_action);
|
|
|
- else
|
|
|
- shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
+ else {
|
|
|
+ spin_lock(port->adapter->scsi_host->host_lock);
|
|
|
+ __shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
if (sdev_to_zfcp(sdev)->port == port)
|
|
|
zfcp_erp_action_dismiss_lun(sdev);
|
|
|
+ spin_unlock(port->adapter->scsi_host->host_lock);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter)
|
|
@@ -592,9 +595,11 @@ static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear,
|
|
|
{
|
|
|
struct scsi_device *sdev;
|
|
|
|
|
|
- shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
+ spin_lock(port->adapter->scsi_host->host_lock);
|
|
|
+ __shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
if (sdev_to_zfcp(sdev)->port == port)
|
|
|
_zfcp_erp_lun_reopen(sdev, clear, id, 0);
|
|
|
+ spin_unlock(port->adapter->scsi_host->host_lock);
|
|
|
}
|
|
|
|
|
|
static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
|
|
@@ -1434,8 +1439,10 @@ void zfcp_erp_set_adapter_status(struct zfcp_adapter *adapter, u32 mask)
|
|
|
atomic_set_mask(common_mask, &port->status);
|
|
|
read_unlock_irqrestore(&adapter->port_list_lock, flags);
|
|
|
|
|
|
- shost_for_each_device(sdev, adapter->scsi_host)
|
|
|
+ spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
|
|
|
+ __shost_for_each_device(sdev, adapter->scsi_host)
|
|
|
atomic_set_mask(common_mask, &sdev_to_zfcp(sdev)->status);
|
|
|
+ spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1469,11 +1476,13 @@ void zfcp_erp_clear_adapter_status(struct zfcp_adapter *adapter, u32 mask)
|
|
|
}
|
|
|
read_unlock_irqrestore(&adapter->port_list_lock, flags);
|
|
|
|
|
|
- shost_for_each_device(sdev, adapter->scsi_host) {
|
|
|
+ spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
|
|
|
+ __shost_for_each_device(sdev, adapter->scsi_host) {
|
|
|
atomic_clear_mask(common_mask, &sdev_to_zfcp(sdev)->status);
|
|
|
if (clear_counter)
|
|
|
atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
|
|
|
}
|
|
|
+ spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1487,16 +1496,19 @@ void zfcp_erp_set_port_status(struct zfcp_port *port, u32 mask)
|
|
|
{
|
|
|
struct scsi_device *sdev;
|
|
|
u32 common_mask = mask & ZFCP_COMMON_FLAGS;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
atomic_set_mask(mask, &port->status);
|
|
|
|
|
|
if (!common_mask)
|
|
|
return;
|
|
|
|
|
|
- shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
+ spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
|
|
|
+ __shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
if (sdev_to_zfcp(sdev)->port == port)
|
|
|
atomic_set_mask(common_mask,
|
|
|
&sdev_to_zfcp(sdev)->status);
|
|
|
+ spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1511,6 +1523,7 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask)
|
|
|
struct scsi_device *sdev;
|
|
|
u32 common_mask = mask & ZFCP_COMMON_FLAGS;
|
|
|
u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
atomic_clear_mask(mask, &port->status);
|
|
|
|
|
@@ -1520,13 +1533,15 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask)
|
|
|
if (clear_counter)
|
|
|
atomic_set(&port->erp_counter, 0);
|
|
|
|
|
|
- shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
+ spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
|
|
|
+ __shost_for_each_device(sdev, port->adapter->scsi_host)
|
|
|
if (sdev_to_zfcp(sdev)->port == port) {
|
|
|
atomic_clear_mask(common_mask,
|
|
|
&sdev_to_zfcp(sdev)->status);
|
|
|
if (clear_counter)
|
|
|
atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
|
|
|
}
|
|
|
+ spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
|
|
|
}
|
|
|
|
|
|
/**
|