Commit 0b33ce72 authored by Linus Torvalds's avatar Linus Torvalds

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
parents 74d83ec2 d0b7a909
...@@ -699,13 +699,13 @@ static void _aac_probe_container1(void * context, struct fib * fibptr) ...@@ -699,13 +699,13 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
int status; int status;
dresp = (struct aac_mount *) fib_data(fibptr); dresp = (struct aac_mount *) fib_data(fibptr);
if (!(fibptr->dev->supplement_adapter_info.supported_options2 & if (!aac_supports_2T(fibptr->dev)) {
AAC_OPTION_VARIABLE_BLOCK_SIZE))
dresp->mnt[0].capacityhigh = 0; dresp->mnt[0].capacityhigh = 0;
if ((le32_to_cpu(dresp->status) != ST_OK) || if ((le32_to_cpu(dresp->status) == ST_OK) &&
(le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) { (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) {
_aac_probe_container2(context, fibptr); _aac_probe_container2(context, fibptr);
return; return;
}
} }
scsicmd = (struct scsi_cmnd *) context; scsicmd = (struct scsi_cmnd *) context;
......
...@@ -2701,6 +2701,11 @@ static inline int aac_is_src(struct aac_dev *dev) ...@@ -2701,6 +2701,11 @@ static inline int aac_is_src(struct aac_dev *dev)
return 0; 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); char * get_container_type(unsigned type);
extern int numacb; extern int numacb;
extern char aac_driver_version[]; extern char aac_driver_version[];
......
...@@ -906,12 +906,14 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd) ...@@ -906,12 +906,14 @@ static int aac_eh_dev_reset(struct scsi_cmnd *cmd)
bus = aac_logical_to_phys(scmd_channel(cmd)); bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd); cid = scmd_id(cmd);
info = &aac->hba_map[bus][cid];
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
info->devtype != AAC_DEVTYPE_NATIVE_RAW)
return FAILED; 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; return FAILED;
pr_err("%s: Host adapter reset request. SCSI hang ?\n", pr_err("%s: Host adapter reset request. SCSI hang ?\n",
...@@ -962,12 +964,14 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd) ...@@ -962,12 +964,14 @@ static int aac_eh_target_reset(struct scsi_cmnd *cmd)
bus = aac_logical_to_phys(scmd_channel(cmd)); bus = aac_logical_to_phys(scmd_channel(cmd));
cid = scmd_id(cmd); cid = scmd_id(cmd);
info = &aac->hba_map[bus][cid];
if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS || if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS)
info->devtype != AAC_DEVTYPE_NATIVE_RAW)
return FAILED; 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; return FAILED;
pr_err("%s: Host adapter reset request. SCSI hang ?\n", pr_err("%s: Host adapter reset request. SCSI hang ?\n",
......
...@@ -740,6 +740,8 @@ static void aac_send_iop_reset(struct aac_dev *dev) ...@@ -740,6 +740,8 @@ static void aac_send_iop_reset(struct aac_dev *dev)
aac_set_intx_mode(dev); aac_set_intx_mode(dev);
src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK); src_writel(dev, MUnit.IDR, IOP_SRC_RESET_MASK);
msleep(5000);
} }
static void aac_send_hardware_soft_reset(struct aac_dev *dev) static void aac_send_hardware_soft_reset(struct aac_dev *dev)
......
...@@ -6131,6 +6131,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) ...@@ -6131,6 +6131,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
"Extents and RPI headers enabled.\n"); "Extents and RPI headers enabled.\n");
} }
mempool_free(mboxq, phba->mbox_mem_pool); mempool_free(mboxq, phba->mbox_mem_pool);
rc = -EIO;
goto out_free_bsmbx; goto out_free_bsmbx;
} }
......
...@@ -580,7 +580,8 @@ int scsi_check_sense(struct scsi_cmnd *scmd) ...@@ -580,7 +580,8 @@ int scsi_check_sense(struct scsi_cmnd *scmd)
if (sshdr.asc == 0x20 || /* Invalid command operation code */ if (sshdr.asc == 0x20 || /* Invalid command operation code */
sshdr.asc == 0x21 || /* Logical block address out of range */ sshdr.asc == 0x21 || /* Logical block address out of range */
sshdr.asc == 0x24 || /* Invalid field in cdb */ 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); set_host_byte(scmd, DID_TARGET_FAILURE);
} }
return SUCCESS; return SUCCESS;
......
...@@ -2739,7 +2739,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, ...@@ -2739,7 +2739,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
list_for_each_entry(rport, &fc_host->rports, peers) { 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)) { (rport->channel == channel)) {
switch (fc_host->tgtid_bind_type) { switch (fc_host->tgtid_bind_type) {
...@@ -2876,7 +2877,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, ...@@ -2876,7 +2877,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
memcpy(&rport->port_name, &ids->port_name, memcpy(&rport->port_name, &ids->port_name,
sizeof(rport->port_name)); sizeof(rport->port_name));
rport->port_id = ids->port_id; rport->port_id = ids->port_id;
rport->roles = ids->roles;
rport->port_state = FC_PORTSTATE_ONLINE; rport->port_state = FC_PORTSTATE_ONLINE;
rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT; rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
...@@ -2885,15 +2885,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, ...@@ -2885,15 +2885,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
fci->f->dd_fcrport_size); fci->f->dd_fcrport_size);
spin_unlock_irqrestore(shost->host_lock, flags); spin_unlock_irqrestore(shost->host_lock, flags);
if (ids->roles & FC_PORT_ROLE_FCP_TARGET) { fc_remote_port_rolechg(rport, ids->roles);
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);
}
return rport; return rport;
} }
} }
......
...@@ -3689,7 +3689,7 @@ iscsi_if_rx(struct sk_buff *skb) ...@@ -3689,7 +3689,7 @@ iscsi_if_rx(struct sk_buff *skb)
uint32_t group; uint32_t group;
nlh = nlmsg_hdr(skb); nlh = nlmsg_hdr(skb);
if (nlh->nlmsg_len < sizeof(*nlh) || if (nlh->nlmsg_len < sizeof(*nlh) + sizeof(*ev) ||
skb->len < nlh->nlmsg_len) { skb->len < nlh->nlmsg_len) {
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment