aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-08-12 15:52:05 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-08-12 15:52:05 -0400
commit921195d3568cb0e4f16efe456b663ae047b075fa (patch)
tree3ad7a13d5b5faae2d0ba7e5c96bc98c6613c6f6e
parentb5b1404d0815894de0690de8a1ab58269e56eae6 (diff)
parente95153b64d03c2b6e8d62e51bdcc33fcad6e0856 (diff)
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley: "Eight fixes. The most important one is the mpt3sas fix which makes the driver work again on big endian systems. The rest are mostly minor error path or checker issues and the vmw_scsi one fixes a performance problem" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: vmw_pvscsi: Return DID_RESET for status SAM_STAT_COMMAND_TERMINATED scsi: sr: Avoid that opening a CD-ROM hangs with runtime power management enabled scsi: mpt3sas: Swap I/O memory read value back to cpu endianness scsi: fcoe: clear FC_RP_STARTED flags when receiving a LOGO scsi: fcoe: drop frames in ELS LOGO error path scsi: fcoe: fix use-after-free in fcoe_ctlr_els_send scsi: qedi: Fix a potential buffer overflow scsi: qla2xxx: Fix memory leak for allocating abort IOCB
-rw-r--r--drivers/scsi/fcoe/fcoe_ctlr.c6
-rw-r--r--drivers/scsi/libfc/fc_rport.c1
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_base.c16
-rw-r--r--drivers/scsi/qedi/qedi_main.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_iocb.c53
-rw-r--r--drivers/scsi/sr.c29
-rw-r--r--drivers/scsi/vmw_pvscsi.c11
7 files changed, 69 insertions, 49 deletions
diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c
index ea23c8dffc25..ffec695e0bfb 100644
--- a/drivers/scsi/fcoe/fcoe_ctlr.c
+++ b/drivers/scsi/fcoe/fcoe_ctlr.c
@@ -754,9 +754,9 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport,
754 case ELS_LOGO: 754 case ELS_LOGO:
755 if (fip->mode == FIP_MODE_VN2VN) { 755 if (fip->mode == FIP_MODE_VN2VN) {
756 if (fip->state != FIP_ST_VNMP_UP) 756 if (fip->state != FIP_ST_VNMP_UP)
757 return -EINVAL; 757 goto drop;
758 if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI) 758 if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI)
759 return -EINVAL; 759 goto drop;
760 } else { 760 } else {
761 if (fip->state != FIP_ST_ENABLED) 761 if (fip->state != FIP_ST_ENABLED)
762 return 0; 762 return 0;
@@ -799,9 +799,9 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport,
799 fip->send(fip, skb); 799 fip->send(fip, skb);
800 return -EINPROGRESS; 800 return -EINPROGRESS;
801drop: 801drop:
802 kfree_skb(skb);
803 LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n", 802 LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n",
804 op, ntoh24(fh->fh_d_id)); 803 op, ntoh24(fh->fh_d_id));
804 kfree_skb(skb);
805 return -EINVAL; 805 return -EINVAL;
806} 806}
807EXPORT_SYMBOL(fcoe_ctlr_els_send); 807EXPORT_SYMBOL(fcoe_ctlr_els_send);
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 31d31aad3de1..89b1f1af2fd4 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -2164,6 +2164,7 @@ static void fc_rport_recv_logo_req(struct fc_lport *lport, struct fc_frame *fp)
2164 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", 2164 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n",
2165 fc_rport_state(rdata)); 2165 fc_rport_state(rdata));
2166 2166
2167 rdata->flags &= ~FC_RP_STARTED;
2167 fc_rport_enter_delete(rdata, RPORT_EV_STOP); 2168 fc_rport_enter_delete(rdata, RPORT_EV_STOP);
2168 mutex_unlock(&rdata->rp_mutex); 2169 mutex_unlock(&rdata->rp_mutex);
2169 kref_put(&rdata->kref, fc_rport_destroy); 2170 kref_put(&rdata->kref, fc_rport_destroy);
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 569392d0d4c9..e44c91edf92d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -3343,11 +3343,10 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
3343 spinlock_t *writeq_lock) 3343 spinlock_t *writeq_lock)
3344{ 3344{
3345 unsigned long flags; 3345 unsigned long flags;
3346 __u64 data_out = b;
3347 3346
3348 spin_lock_irqsave(writeq_lock, flags); 3347 spin_lock_irqsave(writeq_lock, flags);
3349 writel((u32)(data_out), addr); 3348 __raw_writel((u32)(b), addr);
3350 writel((u32)(data_out >> 32), (addr + 4)); 3349 __raw_writel((u32)(b >> 32), (addr + 4));
3351 mmiowb(); 3350 mmiowb();
3352 spin_unlock_irqrestore(writeq_lock, flags); 3351 spin_unlock_irqrestore(writeq_lock, flags);
3353} 3352}
@@ -3367,7 +3366,8 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
3367static inline void 3366static inline void
3368_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) 3367_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
3369{ 3368{
3370 writeq(b, addr); 3369 __raw_writeq(b, addr);
3370 mmiowb();
3371} 3371}
3372#else 3372#else
3373static inline void 3373static inline void
@@ -5268,7 +5268,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
5268 5268
5269 /* send message 32-bits at a time */ 5269 /* send message 32-bits at a time */
5270 for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) { 5270 for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) {
5271 writel((u32)(request[i]), &ioc->chip->Doorbell); 5271 writel(cpu_to_le32(request[i]), &ioc->chip->Doorbell);
5272 if ((_base_wait_for_doorbell_ack(ioc, 5))) 5272 if ((_base_wait_for_doorbell_ack(ioc, 5)))
5273 failed = 1; 5273 failed = 1;
5274 } 5274 }
@@ -5289,7 +5289,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
5289 } 5289 }
5290 5290
5291 /* read the first two 16-bits, it gives the total length of the reply */ 5291 /* read the first two 16-bits, it gives the total length of the reply */
5292 reply[0] = (u16)(readl(&ioc->chip->Doorbell) 5292 reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5293 & MPI2_DOORBELL_DATA_MASK); 5293 & MPI2_DOORBELL_DATA_MASK);
5294 writel(0, &ioc->chip->HostInterruptStatus); 5294 writel(0, &ioc->chip->HostInterruptStatus);
5295 if ((_base_wait_for_doorbell_int(ioc, 5))) { 5295 if ((_base_wait_for_doorbell_int(ioc, 5))) {
@@ -5298,7 +5298,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
5298 ioc->name, __LINE__); 5298 ioc->name, __LINE__);
5299 return -EFAULT; 5299 return -EFAULT;
5300 } 5300 }
5301 reply[1] = (u16)(readl(&ioc->chip->Doorbell) 5301 reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5302 & MPI2_DOORBELL_DATA_MASK); 5302 & MPI2_DOORBELL_DATA_MASK);
5303 writel(0, &ioc->chip->HostInterruptStatus); 5303 writel(0, &ioc->chip->HostInterruptStatus);
5304 5304
@@ -5312,7 +5312,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
5312 if (i >= reply_bytes/2) /* overflow case */ 5312 if (i >= reply_bytes/2) /* overflow case */
5313 readl(&ioc->chip->Doorbell); 5313 readl(&ioc->chip->Doorbell);
5314 else 5314 else
5315 reply[i] = (u16)(readl(&ioc->chip->Doorbell) 5315 reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5316 & MPI2_DOORBELL_DATA_MASK); 5316 & MPI2_DOORBELL_DATA_MASK);
5317 writel(0, &ioc->chip->HostInterruptStatus); 5317 writel(0, &ioc->chip->HostInterruptStatus);
5318 } 5318 }
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 091ec1207bea..cff83b9457f7 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -888,7 +888,7 @@ static void qedi_get_boot_tgt_info(struct nvm_iscsi_block *block,
888 ipv6_en = !!(block->generic.ctrl_flags & 888 ipv6_en = !!(block->generic.ctrl_flags &
889 NVM_ISCSI_CFG_GEN_IPV6_ENABLED); 889 NVM_ISCSI_CFG_GEN_IPV6_ENABLED);
890 890
891 snprintf(tgt->iscsi_name, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n", 891 snprintf(tgt->iscsi_name, sizeof(tgt->iscsi_name), "%s\n",
892 block->target[index].target_name.byte); 892 block->target[index].target_name.byte);
893 893
894 tgt->ipv6_en = ipv6_en; 894 tgt->ipv6_en = ipv6_en;
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
index a91cca52b5d5..dd93a22fe843 100644
--- a/drivers/scsi/qla2xxx/qla_iocb.c
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
@@ -2130,34 +2130,11 @@ __qla2x00_alloc_iocbs(struct qla_qpair *qpair, srb_t *sp)
2130 req_cnt = 1; 2130 req_cnt = 1;
2131 handle = 0; 2131 handle = 0;
2132 2132
2133 if (!sp) 2133 if (sp && (sp->type != SRB_SCSI_CMD)) {
2134 goto skip_cmd_array; 2134 /* Adjust entry-counts as needed. */
2135
2136 /* Check for room in outstanding command list. */
2137 handle = req->current_outstanding_cmd;
2138 for (index = 1; index < req->num_outstanding_cmds; index++) {
2139 handle++;
2140 if (handle == req->num_outstanding_cmds)
2141 handle = 1;
2142 if (!req->outstanding_cmds[handle])
2143 break;
2144 }
2145 if (index == req->num_outstanding_cmds) {
2146 ql_log(ql_log_warn, vha, 0x700b,
2147 "No room on outstanding cmd array.\n");
2148 goto queuing_error;
2149 }
2150
2151 /* Prep command array. */
2152 req->current_outstanding_cmd = handle;
2153 req->outstanding_cmds[handle] = sp;
2154 sp->handle = handle;
2155
2156 /* Adjust entry-counts as needed. */
2157 if (sp->type != SRB_SCSI_CMD)
2158 req_cnt = sp->iocbs; 2135 req_cnt = sp->iocbs;
2136 }
2159 2137
2160skip_cmd_array:
2161 /* Check for room on request queue. */ 2138 /* Check for room on request queue. */
2162 if (req->cnt < req_cnt + 2) { 2139 if (req->cnt < req_cnt + 2) {
2163 if (qpair->use_shadow_reg) 2140 if (qpair->use_shadow_reg)
@@ -2183,6 +2160,28 @@ skip_cmd_array:
2183 if (req->cnt < req_cnt + 2) 2160 if (req->cnt < req_cnt + 2)
2184 goto queuing_error; 2161 goto queuing_error;
2185 2162
2163 if (sp) {
2164 /* Check for room in outstanding command list. */
2165 handle = req->current_outstanding_cmd;
2166 for (index = 1; index < req->num_outstanding_cmds; index++) {
2167 handle++;
2168 if (handle == req->num_outstanding_cmds)
2169 handle = 1;
2170 if (!req->outstanding_cmds[handle])
2171 break;
2172 }
2173 if (index == req->num_outstanding_cmds) {
2174 ql_log(ql_log_warn, vha, 0x700b,
2175 "No room on outstanding cmd array.\n");
2176 goto queuing_error;
2177 }
2178
2179 /* Prep command array. */
2180 req->current_outstanding_cmd = handle;
2181 req->outstanding_cmds[handle] = sp;
2182 sp->handle = handle;
2183 }
2184
2186 /* Prep packet */ 2185 /* Prep packet */
2187 req->cnt -= req_cnt; 2186 req->cnt -= req_cnt;
2188 pkt = req->ring_ptr; 2187 pkt = req->ring_ptr;
@@ -2195,6 +2194,8 @@ skip_cmd_array:
2195 pkt->handle = handle; 2194 pkt->handle = handle;
2196 } 2195 }
2197 2196
2197 return pkt;
2198
2198queuing_error: 2199queuing_error:
2199 qpair->tgt_counters.num_alloc_iocb_failed++; 2200 qpair->tgt_counters.num_alloc_iocb_failed++;
2200 return pkt; 2201 return pkt;
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 3f3cb72e0c0c..d0389b20574d 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -523,18 +523,26 @@ static int sr_init_command(struct scsi_cmnd *SCpnt)
523static int sr_block_open(struct block_device *bdev, fmode_t mode) 523static int sr_block_open(struct block_device *bdev, fmode_t mode)
524{ 524{
525 struct scsi_cd *cd; 525 struct scsi_cd *cd;
526 struct scsi_device *sdev;
526 int ret = -ENXIO; 527 int ret = -ENXIO;
527 528
529 cd = scsi_cd_get(bdev->bd_disk);
530 if (!cd)
531 goto out;
532
533 sdev = cd->device;
534 scsi_autopm_get_device(sdev);
528 check_disk_change(bdev); 535 check_disk_change(bdev);
529 536
530 mutex_lock(&sr_mutex); 537 mutex_lock(&sr_mutex);
531 cd = scsi_cd_get(bdev->bd_disk); 538 ret = cdrom_open(&cd->cdi, bdev, mode);
532 if (cd) {
533 ret = cdrom_open(&cd->cdi, bdev, mode);
534 if (ret)
535 scsi_cd_put(cd);
536 }
537 mutex_unlock(&sr_mutex); 539 mutex_unlock(&sr_mutex);
540
541 scsi_autopm_put_device(sdev);
542 if (ret)
543 scsi_cd_put(cd);
544
545out:
538 return ret; 546 return ret;
539} 547}
540 548
@@ -562,6 +570,8 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
562 if (ret) 570 if (ret)
563 goto out; 571 goto out;
564 572
573 scsi_autopm_get_device(sdev);
574
565 /* 575 /*
566 * Send SCSI addressing ioctls directly to mid level, send other 576 * Send SCSI addressing ioctls directly to mid level, send other
567 * ioctls to cdrom/block level. 577 * ioctls to cdrom/block level.
@@ -570,15 +580,18 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
570 case SCSI_IOCTL_GET_IDLUN: 580 case SCSI_IOCTL_GET_IDLUN:
571 case SCSI_IOCTL_GET_BUS_NUMBER: 581 case SCSI_IOCTL_GET_BUS_NUMBER:
572 ret = scsi_ioctl(sdev, cmd, argp); 582 ret = scsi_ioctl(sdev, cmd, argp);
573 goto out; 583 goto put;
574 } 584 }
575 585
576 ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); 586 ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg);
577 if (ret != -ENOSYS) 587 if (ret != -ENOSYS)
578 goto out; 588 goto put;
579 589
580 ret = scsi_ioctl(sdev, cmd, argp); 590 ret = scsi_ioctl(sdev, cmd, argp);
581 591
592put:
593 scsi_autopm_put_device(sdev);
594
582out: 595out:
583 mutex_unlock(&sr_mutex); 596 mutex_unlock(&sr_mutex);
584 return ret; 597 return ret;
diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c
index 777e5f1e52d1..0cd947f78b5b 100644
--- a/drivers/scsi/vmw_pvscsi.c
+++ b/drivers/scsi/vmw_pvscsi.c
@@ -561,9 +561,14 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
561 (btstat == BTSTAT_SUCCESS || 561 (btstat == BTSTAT_SUCCESS ||
562 btstat == BTSTAT_LINKED_COMMAND_COMPLETED || 562 btstat == BTSTAT_LINKED_COMMAND_COMPLETED ||
563 btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) { 563 btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) {
564 cmd->result = (DID_OK << 16) | sdstat; 564 if (sdstat == SAM_STAT_COMMAND_TERMINATED) {
565 if (sdstat == SAM_STAT_CHECK_CONDITION && cmd->sense_buffer) 565 cmd->result = (DID_RESET << 16);
566 cmd->result |= (DRIVER_SENSE << 24); 566 } else {
567 cmd->result = (DID_OK << 16) | sdstat;
568 if (sdstat == SAM_STAT_CHECK_CONDITION &&
569 cmd->sense_buffer)
570 cmd->result |= (DRIVER_SENSE << 24);
571 }
567 } else 572 } else
568 switch (btstat) { 573 switch (btstat) {
569 case BTSTAT_SUCCESS: 574 case BTSTAT_SUCCESS: