Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
"Nine changes, eight to drivers (qla2xxx, hpsa, lpfc, alua, ch,
53c710[x2], target) and one core change that tries to close a race
between sysfs delete and module removal"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: lpfc: remove left-over BUILD_NVME defines
scsi: core: try to get module before removing device
scsi: hpsa: add missing hunks in reset-patch
scsi: target: core: Do not overwrite CDB byte 1
scsi: ch: Make it possible to open a ch device multiple times again
scsi: fix kconfig dependency warning related to 53C700_LE_ON_BE
scsi: sni_53c710: fix compilation error
scsi: scsi_dh_alua: handle RTPG sense code correctly during state transitions
scsi: qla2xxx: fix a potential NULL pointer dereference

+36 -36
+1 -1
drivers/scsi/Kconfig
··· 898 898 899 899 config 53C700_LE_ON_BE 900 900 bool 901 - depends on SCSI_LASI700 901 + depends on SCSI_LASI700 || SCSI_SNI_53C710 902 902 default y 903 903 904 904 config SCSI_STEX
-1
drivers/scsi/ch.c
··· 579 579 scsi_changer *ch = file->private_data; 580 580 581 581 scsi_device_put(ch->device); 582 - ch->device = NULL; 583 582 file->private_data = NULL; 584 583 kref_put(&ch->ref, ch_destroy); 585 584 return 0;
+16 -5
drivers/scsi/device_handler/scsi_dh_alua.c
··· 512 512 unsigned int tpg_desc_tbl_off; 513 513 unsigned char orig_transition_tmo; 514 514 unsigned long flags; 515 + bool transitioning_sense = false; 515 516 516 517 if (!pg->expiry) { 517 518 unsigned long transition_tmo = ALUA_FAILOVER_TIMEOUT * HZ; ··· 573 572 goto retry; 574 573 } 575 574 /* 576 - * Retry on ALUA state transition or if any 577 - * UNIT ATTENTION occurred. 575 + * If the array returns with 'ALUA state transition' 576 + * sense code here it cannot return RTPG data during 577 + * transition. So set the state to 'transitioning' directly. 578 578 */ 579 579 if (sense_hdr.sense_key == NOT_READY && 580 - sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) 581 - err = SCSI_DH_RETRY; 582 - else if (sense_hdr.sense_key == UNIT_ATTENTION) 580 + sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) { 581 + transitioning_sense = true; 582 + goto skip_rtpg; 583 + } 584 + /* 585 + * Retry on any other UNIT ATTENTION occurred. 586 + */ 587 + if (sense_hdr.sense_key == UNIT_ATTENTION) 583 588 err = SCSI_DH_RETRY; 584 589 if (err == SCSI_DH_RETRY && 585 590 pg->expiry != 0 && time_before(jiffies, pg->expiry)) { ··· 673 666 off = 8 + (desc[7] * 4); 674 667 } 675 668 669 + skip_rtpg: 676 670 spin_lock_irqsave(&pg->lock, flags); 671 + if (transitioning_sense) 672 + pg->state = SCSI_ACCESS_STATE_TRANSITIONING; 673 + 677 674 sdev_printk(KERN_INFO, sdev, 678 675 "%s: port group %02x state %c %s supports %c%c%c%c%c%c%c\n", 679 676 ALUA_DH_NAME, pg->group_id, print_alua_state(pg->state),
+4
drivers/scsi/hpsa.c
··· 5477 5477 return SCSI_MLQUEUE_HOST_BUSY; 5478 5478 } 5479 5479 5480 + c->device = dev; 5481 + 5480 5482 enqueue_cmd_and_start_io(h, c); 5481 5483 /* the cmd'll come back via intr handler in complete_scsi_command() */ 5482 5484 return 0; ··· 5550 5548 hpsa_cmd_init(h, c->cmdindex, c); 5551 5549 c->cmd_type = CMD_SCSI; 5552 5550 c->scsi_cmd = cmd; 5551 + c->device = dev; 5553 5552 rc = hpsa_scsi_ioaccel_raid_map(h, c); 5554 5553 if (rc < 0) /* scsi_dma_map failed. */ 5555 5554 rc = SCSI_MLQUEUE_HOST_BUSY; ··· 5558 5555 hpsa_cmd_init(h, c->cmdindex, c); 5559 5556 c->cmd_type = CMD_SCSI; 5560 5557 c->scsi_cmd = cmd; 5558 + c->device = dev; 5561 5559 rc = hpsa_scsi_ioaccel_direct_map(h, c); 5562 5560 if (rc < 0) /* scsi_dma_map failed. */ 5563 5561 rc = SCSI_MLQUEUE_HOST_BUSY;
-2
drivers/scsi/lpfc/lpfc_init.c
··· 9055 9055 } 9056 9056 } 9057 9057 9058 - #if defined(BUILD_NVME) 9059 9058 /* Clear NVME stats */ 9060 9059 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { 9061 9060 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) { ··· 9062 9063 sizeof(phba->sli4_hba.hdwq[idx].nvme_cstat)); 9063 9064 } 9064 9065 } 9065 - #endif 9066 9066 9067 9067 /* Clear SCSI stats */ 9068 9068 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_FCP) {
-2
drivers/scsi/lpfc/lpfc_scsi.c
··· 528 528 list_del_init(&psb->list); 529 529 psb->exch_busy = 0; 530 530 psb->status = IOSTAT_SUCCESS; 531 - #ifdef BUILD_NVME 532 531 if (psb->cur_iocbq.iocb_flag == LPFC_IO_NVME) { 533 532 qp->abts_nvme_io_bufs--; 534 533 spin_unlock(&qp->abts_io_buf_list_lock); ··· 535 536 lpfc_sli4_nvme_xri_aborted(phba, axri, psb); 536 537 return; 537 538 } 538 - #endif 539 539 qp->abts_scsi_io_bufs--; 540 540 spin_unlock(&qp->abts_io_buf_list_lock); 541 541
+4
drivers/scsi/qla2xxx/qla_os.c
··· 3224 3224 req->req_q_in, req->req_q_out, rsp->rsp_q_in, rsp->rsp_q_out); 3225 3225 3226 3226 ha->wq = alloc_workqueue("qla2xxx_wq", 0, 0); 3227 + if (unlikely(!ha->wq)) { 3228 + ret = -ENOMEM; 3229 + goto probe_failed; 3230 + } 3227 3231 3228 3232 if (ha->isp_ops->initialize_adapter(base_vha)) { 3229 3233 ql_log(ql_log_fatal, base_vha, 0x00d6,
+10 -1
drivers/scsi/scsi_sysfs.c
··· 730 730 const char *buf, size_t count) 731 731 { 732 732 struct kernfs_node *kn; 733 + struct scsi_device *sdev = to_scsi_device(dev); 734 + 735 + /* 736 + * We need to try to get module, avoiding the module been removed 737 + * during delete. 738 + */ 739 + if (scsi_device_get(sdev)) 740 + return -ENODEV; 733 741 734 742 kn = sysfs_break_active_protection(&dev->kobj, &attr->attr); 735 743 WARN_ON_ONCE(!kn); ··· 752 744 * state into SDEV_DEL. 753 745 */ 754 746 device_remove_file(dev, attr); 755 - scsi_remove_device(to_scsi_device(dev)); 747 + scsi_remove_device(sdev); 756 748 if (kn) 757 749 sysfs_unbreak_active_protection(kn); 750 + scsi_device_put(sdev); 758 751 return count; 759 752 }; 760 753 static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete);
+1 -3
drivers/scsi/sni_53c710.c
··· 66 66 67 67 base = res->start; 68 68 hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL); 69 - if (!hostdata) { 70 - dev_printk(KERN_ERR, dev, "Failed to allocate host data\n"); 69 + if (!hostdata) 71 70 return -ENOMEM; 72 - } 73 71 74 72 hostdata->dev = &dev->dev; 75 73 dma_set_mask(&dev->dev, DMA_BIT_MASK(32));
-21
drivers/target/target_core_device.c
··· 1075 1075 unsigned int size; 1076 1076 1077 1077 /* 1078 - * Clear a lun set in the cdb if the initiator talking to use spoke 1079 - * and old standards version, as we can't assume the underlying device 1080 - * won't choke up on it. 1081 - */ 1082 - switch (cdb[0]) { 1083 - case READ_10: /* SBC - RDProtect */ 1084 - case READ_12: /* SBC - RDProtect */ 1085 - case READ_16: /* SBC - RDProtect */ 1086 - case SEND_DIAGNOSTIC: /* SPC - SELF-TEST Code */ 1087 - case VERIFY: /* SBC - VRProtect */ 1088 - case VERIFY_16: /* SBC - VRProtect */ 1089 - case WRITE_VERIFY: /* SBC - VRProtect */ 1090 - case WRITE_VERIFY_12: /* SBC - VRProtect */ 1091 - case MAINTENANCE_IN: /* SPC - Parameter Data Format for SA RTPG */ 1092 - break; 1093 - default: 1094 - cdb[1] &= 0x1f; /* clear logical unit number */ 1095 - break; 1096 - } 1097 - 1098 - /* 1099 1078 * For REPORT LUNS we always need to emulate the response, for everything 1100 1079 * else, pass it up. 1101 1080 */