Skip to content

Commit

Permalink
[SCSI] mpt2sas: Fix for deadlock between hot plug worker threads and …
Browse files Browse the repository at this point in the history
…host reset context

This is due to driver reporting a device missing to the OS then the OS sending
a SYNC_CACHE request to driver while the IO queues are locked due to host reset.

To fix the issue, the driver will be waking up the port enable context
immediately when the driver receives the reply message, instead of waiting
on the hot plug worker threads.

Signed-off-by: Nagalakshmi Nandigama <nagalakshmi.nandigama@lsi.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
  • Loading branch information
nagalakshmi.nandigama@lsi.com authored and James Bottomley committed Oct 30, 2011
1 parent f3db032 commit 918134e
Showing 1 changed file with 18 additions and 12 deletions.
30 changes: 18 additions & 12 deletions drivers/scsi/mpt2sas/mpt2sas_scsih.c
Original file line number Diff line number Diff line change
Expand Up @@ -3059,6 +3059,7 @@ _scsih_tm_tr_send(struct MPT2SAS_ADAPTER *ioc, u16 handle)
"handle(0x%04x), sas_addr(0x%016llx)\n", ioc->name, handle,
(unsigned long long)sas_address));
_scsih_ublock_io_device(ioc, handle);
sas_target_priv_data->handle = MPT2SAS_INVALID_DEVICE_HANDLE;
}

smid = mpt2sas_base_get_smid_hpr(ioc, ioc->tm_tr_cb_idx);
Expand Down Expand Up @@ -5201,6 +5202,9 @@ _scsih_remove_device(struct MPT2SAS_ADAPTER *ioc,
if (sas_device_backup.starget && sas_device_backup.starget->hostdata) {
sas_target_priv_data = sas_device_backup.starget->hostdata;
sas_target_priv_data->deleted = 1;
_scsih_ublock_io_device(ioc, sas_device_backup.handle);
sas_target_priv_data->handle =
MPT2SAS_INVALID_DEVICE_HANDLE;
}

_scsih_ublock_io_device(ioc, sas_device_backup.handle);
Expand Down Expand Up @@ -5354,7 +5358,7 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
_scsih_sas_topology_change_event_debug(ioc, event_data);
#endif

if (ioc->shost_recovery || ioc->remove_host || ioc->pci_error_recovery)
if (ioc->remove_host || ioc->pci_error_recovery)
return;

if (!ioc->sas_hba.num_phys)
Expand Down Expand Up @@ -5415,6 +5419,9 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
switch (reason_code) {
case MPI2_EVENT_SAS_TOPO_RC_PHY_CHANGED:

if (ioc->shost_recovery)
break;

if (link_rate == prev_link_rate)
break;

Expand All @@ -5428,6 +5435,9 @@ _scsih_sas_topology_change_event(struct MPT2SAS_ADAPTER *ioc,
break;
case MPI2_EVENT_SAS_TOPO_RC_TARG_ADDED:

if (ioc->shost_recovery)
break;

mpt2sas_transport_update_links(ioc, sas_address,
handle, phy_number, link_rate);

Expand Down Expand Up @@ -7091,7 +7101,13 @@ mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
_scsih_search_responding_sas_devices(ioc);
_scsih_search_responding_raid_devices(ioc);
_scsih_search_responding_expanders(ioc);
if (!ioc->is_driver_loading) {
_scsih_prep_device_scan(ioc);
_scsih_search_responding_sas_devices(ioc);
_scsih_search_responding_raid_devices(ioc);
_scsih_search_responding_expanders(ioc);
_scsih_error_recovery_delete_devices(ioc);
}
break;
}
}
Expand Down Expand Up @@ -7126,17 +7142,7 @@ _firmware_event_work(struct work_struct *work)
_scsih_scan_for_devices_after_reset(ioc);
break;
case MPT2SAS_PORT_ENABLE_COMPLETE:
if (!ioc->is_driver_loading && ioc->shost_recovery) {
_scsih_prep_device_scan(ioc);
_scsih_search_responding_sas_devices(ioc);
_scsih_search_responding_raid_devices(ioc);
_scsih_search_responding_expanders(ioc);
}

if (ioc->start_scan)
ioc->start_scan = 0;
else
complete(&ioc->port_enable_done);
ioc->start_scan = 0;



Expand Down

0 comments on commit 918134e

Please sign in to comment.