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

Changed files
+69 -49
drivers
+3 -3
drivers/scsi/fcoe/fcoe_ctlr.c
··· 754 754 case ELS_LOGO: 755 755 if (fip->mode == FIP_MODE_VN2VN) { 756 756 if (fip->state != FIP_ST_VNMP_UP) 757 - return -EINVAL; 757 + goto drop; 758 758 if (ntoh24(fh->fh_d_id) == FC_FID_FLOGI) 759 - return -EINVAL; 759 + goto drop; 760 760 } else { 761 761 if (fip->state != FIP_ST_ENABLED) 762 762 return 0; ··· 799 799 fip->send(fip, skb); 800 800 return -EINPROGRESS; 801 801 drop: 802 - kfree_skb(skb); 803 802 LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n", 804 803 op, ntoh24(fh->fh_d_id)); 804 + kfree_skb(skb); 805 805 return -EINVAL; 806 806 } 807 807 EXPORT_SYMBOL(fcoe_ctlr_els_send);
+1
drivers/scsi/libfc/fc_rport.c
··· 2164 2164 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", 2165 2165 fc_rport_state(rdata)); 2166 2166 2167 + rdata->flags &= ~FC_RP_STARTED; 2167 2168 fc_rport_enter_delete(rdata, RPORT_EV_STOP); 2168 2169 mutex_unlock(&rdata->rp_mutex); 2169 2170 kref_put(&rdata->kref, fc_rport_destroy);
+8 -8
drivers/scsi/mpt3sas/mpt3sas_base.c
··· 3343 3343 spinlock_t *writeq_lock) 3344 3344 { 3345 3345 unsigned long flags; 3346 - __u64 data_out = b; 3347 3346 3348 3347 spin_lock_irqsave(writeq_lock, flags); 3349 - writel((u32)(data_out), addr); 3350 - writel((u32)(data_out >> 32), (addr + 4)); 3348 + __raw_writel((u32)(b), addr); 3349 + __raw_writel((u32)(b >> 32), (addr + 4)); 3351 3350 mmiowb(); 3352 3351 spin_unlock_irqrestore(writeq_lock, flags); 3353 3352 } ··· 3366 3367 static inline void 3367 3368 _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) 3368 3369 { 3369 - writeq(b, addr); 3370 + __raw_writeq(b, addr); 3371 + mmiowb(); 3370 3372 } 3371 3373 #else 3372 3374 static inline void ··· 5268 5268 5269 5269 /* send message 32-bits at a time */ 5270 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 5272 if ((_base_wait_for_doorbell_ack(ioc, 5))) 5273 5273 failed = 1; 5274 5274 } ··· 5289 5289 } 5290 5290 5291 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 5293 & MPI2_DOORBELL_DATA_MASK); 5294 5294 writel(0, &ioc->chip->HostInterruptStatus); 5295 5295 if ((_base_wait_for_doorbell_int(ioc, 5))) { ··· 5298 5298 ioc->name, __LINE__); 5299 5299 return -EFAULT; 5300 5300 } 5301 - reply[1] = (u16)(readl(&ioc->chip->Doorbell) 5301 + reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell) 5302 5302 & MPI2_DOORBELL_DATA_MASK); 5303 5303 writel(0, &ioc->chip->HostInterruptStatus); 5304 5304 ··· 5312 5312 if (i >= reply_bytes/2) /* overflow case */ 5313 5313 readl(&ioc->chip->Doorbell); 5314 5314 else 5315 - reply[i] = (u16)(readl(&ioc->chip->Doorbell) 5315 + reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell) 5316 5316 & MPI2_DOORBELL_DATA_MASK); 5317 5317 writel(0, &ioc->chip->HostInterruptStatus); 5318 5318 }
+1 -1
drivers/scsi/qedi/qedi_main.c
··· 888 888 ipv6_en = !!(block->generic.ctrl_flags & 889 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 892 block->target[index].target_name.byte); 893 893 894 894 tgt->ipv6_en = ipv6_en;
+27 -26
drivers/scsi/qla2xxx/qla_iocb.c
··· 2130 2130 req_cnt = 1; 2131 2131 handle = 0; 2132 2132 2133 - if (!sp) 2134 - goto skip_cmd_array; 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) 2133 + if (sp && (sp->type != SRB_SCSI_CMD)) { 2134 + /* Adjust entry-counts as needed. */ 2158 2135 req_cnt = sp->iocbs; 2136 + } 2159 2137 2160 - skip_cmd_array: 2161 2138 /* Check for room on request queue. */ 2162 2139 if (req->cnt < req_cnt + 2) { 2163 2140 if (qpair->use_shadow_reg) ··· 2160 2183 if (req->cnt < req_cnt + 2) 2161 2184 goto queuing_error; 2162 2185 2186 + if (sp) { 2187 + /* Check for room in outstanding command list. */ 2188 + handle = req->current_outstanding_cmd; 2189 + for (index = 1; index < req->num_outstanding_cmds; index++) { 2190 + handle++; 2191 + if (handle == req->num_outstanding_cmds) 2192 + handle = 1; 2193 + if (!req->outstanding_cmds[handle]) 2194 + break; 2195 + } 2196 + if (index == req->num_outstanding_cmds) { 2197 + ql_log(ql_log_warn, vha, 0x700b, 2198 + "No room on outstanding cmd array.\n"); 2199 + goto queuing_error; 2200 + } 2201 + 2202 + /* Prep command array. */ 2203 + req->current_outstanding_cmd = handle; 2204 + req->outstanding_cmds[handle] = sp; 2205 + sp->handle = handle; 2206 + } 2207 + 2163 2208 /* Prep packet */ 2164 2209 req->cnt -= req_cnt; 2165 2210 pkt = req->ring_ptr; ··· 2193 2194 pkt->entry_count = req_cnt; 2194 2195 pkt->handle = handle; 2195 2196 } 2197 + 2198 + return pkt; 2196 2199 2197 2200 queuing_error: 2198 2201 qpair->tgt_counters.num_alloc_iocb_failed++;
+21 -8
drivers/scsi/sr.c
··· 523 523 static int sr_block_open(struct block_device *bdev, fmode_t mode) 524 524 { 525 525 struct scsi_cd *cd; 526 + struct scsi_device *sdev; 526 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 535 check_disk_change(bdev); 529 536 530 537 mutex_lock(&sr_mutex); 531 - cd = scsi_cd_get(bdev->bd_disk); 532 - if (cd) { 533 - ret = cdrom_open(&cd->cdi, bdev, mode); 534 - if (ret) 535 - scsi_cd_put(cd); 536 - } 538 + ret = cdrom_open(&cd->cdi, bdev, mode); 537 539 mutex_unlock(&sr_mutex); 540 + 541 + scsi_autopm_put_device(sdev); 542 + if (ret) 543 + scsi_cd_put(cd); 544 + 545 + out: 538 546 return ret; 539 547 } 540 548 ··· 570 562 if (ret) 571 563 goto out; 572 564 565 + scsi_autopm_get_device(sdev); 566 + 573 567 /* 574 568 * Send SCSI addressing ioctls directly to mid level, send other 575 569 * ioctls to cdrom/block level. ··· 580 570 case SCSI_IOCTL_GET_IDLUN: 581 571 case SCSI_IOCTL_GET_BUS_NUMBER: 582 572 ret = scsi_ioctl(sdev, cmd, argp); 583 - goto out; 573 + goto put; 584 574 } 585 575 586 576 ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); 587 577 if (ret != -ENOSYS) 588 - goto out; 578 + goto put; 589 579 590 580 ret = scsi_ioctl(sdev, cmd, argp); 581 + 582 + put: 583 + scsi_autopm_put_device(sdev); 591 584 592 585 out: 593 586 mutex_unlock(&sr_mutex);
+8 -3
drivers/scsi/vmw_pvscsi.c
··· 561 561 (btstat == BTSTAT_SUCCESS || 562 562 btstat == BTSTAT_LINKED_COMMAND_COMPLETED || 563 563 btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) { 564 - cmd->result = (DID_OK << 16) | sdstat; 565 - if (sdstat == SAM_STAT_CHECK_CONDITION && cmd->sense_buffer) 566 - cmd->result |= (DRIVER_SENSE << 24); 564 + if (sdstat == SAM_STAT_COMMAND_TERMINATED) { 565 + cmd->result = (DID_RESET << 16); 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 572 } else 568 573 switch (btstat) { 569 574 case BTSTAT_SUCCESS: