[SCSI] mpt2sas : Broadcast Primative AEN bug fix
Bug fix in the broadcast primative async event code where the driver would stop sending tm queries after the first queury was completed. This was due driver not reseting the tm_cmds.status field back to MPT2_CMD_NOT_USED after completing a task management request. An addtional fix adding sanity check to insure sas_device->starget set to NULL. During multipath testing fail over/fail back, the mid layer was holding onto sdev longer than the fail back period, thus starget was getting set to NULL for device being added. Signed-off-by: Eric Moore <eric.moore@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
f0f9cc1fb8
commit
8901cbb45e
|
@ -516,12 +516,8 @@ _scsih_sas_device_add(struct MPT2SAS_ADAPTER *ioc,
|
||||||
handle = sas_device->handle;
|
handle = sas_device->handle;
|
||||||
parent_handle = sas_device->parent_handle;
|
parent_handle = sas_device->parent_handle;
|
||||||
sas_address = sas_device->sas_address;
|
sas_address = sas_device->sas_address;
|
||||||
if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) {
|
if (!mpt2sas_transport_port_add(ioc, handle, parent_handle))
|
||||||
_scsih_sas_device_remove(ioc, sas_device);
|
_scsih_sas_device_remove(ioc, sas_device);
|
||||||
} else if (!sas_device->starget) {
|
|
||||||
mpt2sas_transport_port_remove(ioc, sas_address, parent_handle);
|
|
||||||
_scsih_sas_device_remove(ioc, sas_device);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1203,7 +1199,9 @@ scsih_target_destroy(struct scsi_target *starget)
|
||||||
rphy = dev_to_rphy(starget->dev.parent);
|
rphy = dev_to_rphy(starget->dev.parent);
|
||||||
sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
|
sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
|
||||||
rphy->identify.sas_address);
|
rphy->identify.sas_address);
|
||||||
if (sas_device)
|
if (sas_device && (sas_device->starget == starget) &&
|
||||||
|
(sas_device->id == starget->id) &&
|
||||||
|
(sas_device->channel == starget->channel))
|
||||||
sas_device->starget = NULL;
|
sas_device->starget = NULL;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||||
|
@ -3924,7 +3922,7 @@ _scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
||||||
|
|
||||||
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
||||||
MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30);
|
MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30);
|
||||||
termination_count += le32_to_cpu(mpi_reply->TerminationCount);
|
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
|
|
||||||
if ((mpi_reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) &&
|
if ((mpi_reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) &&
|
||||||
(mpi_reply->ResponseCode ==
|
(mpi_reply->ResponseCode ==
|
||||||
|
@ -3934,10 +3932,10 @@ _scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
||||||
MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, smid, 30);
|
MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 30);
|
||||||
|
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
||||||
termination_count += le32_to_cpu(mpi_reply->TerminationCount);
|
termination_count += le32_to_cpu(mpi_reply->TerminationCount);
|
||||||
}
|
}
|
||||||
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
|
||||||
ioc->broadcast_aen_busy = 0;
|
ioc->broadcast_aen_busy = 0;
|
||||||
mutex_unlock(&ioc->tm_cmds.mutex);
|
mutex_unlock(&ioc->tm_cmds.mutex);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue