forked from Minki/linux
SCSI fixes on 20170930
Eight mostly minor fixes for recently discovered issues in drivers. Signed-off-by: James E.J. Bottomley <jejb@linux.vnet.ibm.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJZz2OGAAoJEAVr7HOZEZN4NTQQAL1avebL1Abau5ODtGTciJrZ I4QqUuJ0PGo9AKWIA/s34cY7kdPt2qhIoUJY0bLKdv8QtR5MDqfJ6c+2ianKenWm EkDKYBQ2csBqzH9VN0tEIPQhvLr7oxvCgEDjfvusxWoUX4AgSv2bMaxIpgs4GUxS hOH4fg/6A0HuhP/HjtYfd89DBdhhKOPU6oRx6YLF4ctlfZxAcALsvVjNAGaJzZX8 Bpv2K/xWOwb/UghjJvxv1wYZ+AL0BHAFVZilBFpyX+ClRhmU9d9SVYs43CbwSu+Y 41qIAYLJXrls6CSWJMTEo/+mhbPMQBS6Q3wSewOaNZXkx4comjJHpx/k2HsiVk7K ObN9eIXNzyby132pIIHc9ZRSpJRTr0/jjb9FetneZlLHaNabtIf67JA0j4fIoCEh Qb73uR030mCNvQ+xvK8DxF9UE1zQXnXiJWoIH9NrGtFtknQOmFlfFfmo/gMDI8w6 aYkxuHdqn2oFjKDuZOQ4zYa8ptcZAAml64gj2YiNiwgNosEpt9UMJ5WRknrGJ7po jHohzKyKkSykjOxgOL1Noh5d7AoWPtJ1Qbg+Leyg1WLnRGHTgAYYmv1LabOdMhbM SIMhNRBFQunCBKTyes/RB2Nykl1OXipnxIaRgSrRhsEiTOVutmyy7jr6BbZSB2vY XBpadk38SGSsZva+Sfk0 =v2G5 -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "Eight mostly minor fixes for recently discovered issues in drivers" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: ILLEGAL REQUEST + ASC==27 => target failure scsi: aacraid: Add a small delay after IOP reset scsi: scsi_transport_fc: Also check for NOTPRESENT in fc_remote_port_add() scsi: scsi_transport_fc: set scsi_target_id upon rescan scsi: scsi_transport_iscsi: fix the issue that iscsi_if_rx doesn't parse nlmsg properly scsi: aacraid: error: testing array offset 'bus' after use scsi: lpfc: Don't return internal MBXERR_ERROR code from probe function scsi: aacraid: Fix 2T+ drives on SmartIOC-2000
This commit is contained in:
commit
0b33ce72ea
@ -699,13 +699,13 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
|
||||
int status;
|
||||
|
||||
dresp = (struct aac_mount *) fib_data(fibptr);
|
||||
if (!(fibptr->dev->supplement_adapter_info.supported_options2 &
|
||||
AAC_OPTION_VARIABLE_BLOCK_SIZE))
|
||||
if (!aac_supports_2T(fibptr->dev)) {
|
||||
dresp->mnt[0].capacityhigh = 0;
|
||||
if ((le32_to_cpu(dresp->status) != ST_OK) ||
|
||||
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
|
||||
_aac_probe_container2(context, fibptr);
|
||||
return;
|
||||
if ((le32_to_cpu(dresp->status) == ST_OK) &&
|
||||
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
|
||||
_aac_probe_container2(context, fibptr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
scsicmd = (struct scsi_cmnd *) context;
|
||||
|
||||
|
@ -2701,6 +2701,11 @@ static inline int aac_is_src(struct aac_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int aac_supports_2T(struct aac_dev *dev)
|
||||
{
|
||||
return (dev->adapter_info.options & AAC_OPT_NEW_COMM_64);
|
||||
}
|
||||
|
||||
char * get_container_type(unsigned type);
|
||||
extern int numacb;
|
||||
extern char aac_driver_version[];
|
||||
|
@ -906,12 +906,14 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
|
||||
|
||||
bus = aac_logical_to_phys(scmd_channel(cmd));
|
||||
cid = scmd_id(cmd);
|
||||
info = &aac->hba_map[bus][cid];
|
||||
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
|
||||
info->devtype != AAC_DEVTYPE_NATIVE_RAW)
|
||||
|
||||
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
|
||||
return FAILED;
|
||||
|
||||
if (info->reset_state > 0)
|
||||
info = &aac->hba_map[bus][cid];
|
||||
|
||||
if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
|
||||
info->reset_state > 0)
|
||||
return FAILED;
|
||||
|
||||
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
|
||||
@ -962,12 +964,14 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
|
||||
|
||||
bus = aac_logical_to_phys(scmd_channel(cmd));
|
||||
cid = scmd_id(cmd);
|
||||
info = &aac->hba_map[bus][cid];
|
||||
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
|
||||
info->devtype != AAC_DEVTYPE_NATIVE_RAW)
|
||||
|
||||
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
|
||||
return FAILED;
|
||||
|
||||
if (info->reset_state > 0)
|
||||
info = &aac->hba_map[bus][cid];
|
||||
|
||||
if (info->devtype != AAC_DEVTYPE_NATIVE_RAW &&
|
||||
info->reset_state > 0)
|
||||
return FAILED;
|
||||
|
||||
pr_err("%s: Host adapter reset request. SCSI hang ?\n",
|
||||
|
@ -740,6 +740,8 @@ static void aac_send_iop_reset(struct aac_dev *dev)
|
||||
aac_set_intx_mode(dev);
|
||||
|
||||
src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
|
||||
|
||||
msleep(5000);
|
||||
}
|
||||
|
||||
static void aac_send_hardware_soft_reset(struct aac_dev *dev)
|
||||
|
@ -6131,6 +6131,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
|
||||
"Extents and RPI headers enabled.\n");
|
||||
}
|
||||
mempool_free(mboxq, phba->mbox_mem_pool);
|
||||
rc = -EIO;
|
||||
goto out_free_bsmbx;
|
||||
}
|
||||
|
||||
|
@ -580,7 +580,8 @@ int scsi_check_sense(struct scsi_cmnd *scmd)
|
||||
if (sshdr.asc == 0x20 || /* Invalid command operation code */
|
||||
sshdr.asc == 0x21 || /* Logical block address out of range */
|
||||
sshdr.asc == 0x24 || /* Invalid field in cdb */
|
||||
sshdr.asc == 0x26) { /* Parameter value invalid */
|
||||
sshdr.asc == 0x26 || /* Parameter value invalid */
|
||||
sshdr.asc == 0x27) { /* Write protected */
|
||||
set_host_byte(scmd, DID_TARGET_FAILURE);
|
||||
}
|
||||
return SUCCESS;
|
||||
|
@ -2739,7 +2739,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
|
||||
|
||||
list_for_each_entry(rport, &fc_host->rports, peers) {
|
||||
|
||||
if ((rport->port_state == FC_PORTSTATE_BLOCKED) &&
|
||||
if ((rport->port_state == FC_PORTSTATE_BLOCKED ||
|
||||
rport->port_state == FC_PORTSTATE_NOTPRESENT) &&
|
||||
(rport->channel == channel)) {
|
||||
|
||||
switch (fc_host->tgtid_bind_type) {
|
||||
@ -2876,7 +2877,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
|
||||
memcpy(&rport->port_name, &ids->port_name,
|
||||
sizeof(rport->port_name));
|
||||
rport->port_id = ids->port_id;
|
||||
rport->roles = ids->roles;
|
||||
rport->port_state = FC_PORTSTATE_ONLINE;
|
||||
rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
|
||||
|
||||
@ -2885,15 +2885,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
|
||||
fci->f->dd_fcrport_size);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
if (ids->roles & FC_PORT_ROLE_FCP_TARGET) {
|
||||
scsi_target_unblock(&rport->dev, SDEV_RUNNING);
|
||||
|
||||
/* initiate a scan of the target */
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
rport->flags |= FC_RPORT_SCAN_PENDING;
|
||||
scsi_queue_work(shost, &rport->scan_work);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
}
|
||||
fc_remote_port_rolechg(rport, ids->roles);
|
||||
return rport;
|
||||
}
|
||||
}
|
||||
|
@ -3689,7 +3689,7 @@ iscsi_if_rx(struct sk_buff *skb)
|
||||
uint32_t group;
|
||||
|
||||
nlh = nlmsg_hdr(skb);
|
||||
if (nlh->nlmsg_len < sizeof(*nlh) ||
|
||||
if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) ||
|
||||
skb->len < nlh->nlmsg_len) {
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user