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:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user