Pull SCSI fixes from James Bottomley: "All fixes for drivers. The core change in the error handler is simply to translate an ALUA specific sense code into a retry the ALUA components can handle and won't impact any other devices" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: error: alua: I/O errors for ALUA state transitions scsi: storvsc: Increase the timeouts to storvsc_timeout scsi: s390: zfcp: Ensure synchronous unit_add scsi: iscsi: Fix incorrect error path labels for flashnode operations scsi: mvsas: Fix typos in per-phy comments and SAS cmd port registers scsi: core: ufs: Fix a hang in the error handler
Unified · Split
| @@ -449,6 +449,8 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, · 448 unmodified lines | ||
| 449 | 449 | if (kstrtoull(buf, 0, (unsigned long long *) &fcp_lun)) |
| 450 | 450 | return -EINVAL; |
| 451 | 451 | |
| 452 | + flush_work(&port->rport_work); | |
| 453 | + | |
| 452 | 454 | retval = zfcp_unit_add(port, fcp_lun); |
| 453 | 455 | if (retval) |
| 454 | 456 | return retval; |
| @@ -215,7 +215,7 @@ enum hw_register_bits { · 214 unmodified lines | ||
| 215 | 215 | |
| 216 | 216 | /* MVS_Px_INT_STAT, MVS_Px_INT_MASK (per-phy events) */ |
| 217 | 217 | PHYEV_DEC_ERR = (1U << 24), /* Phy Decoding Error */ |
| 218 | − PHYEV_DCDR_ERR = (1U << 23), /* STP Deocder Error */ | |
| 218 | + PHYEV_DCDR_ERR = (1U << 23), /* STP Decoder Error */ | |
| 219 | 219 | PHYEV_CRC_ERR = (1U << 22), /* STP CRC Error */ |
| 220 | 220 | PHYEV_UNASSOC_FIS = (1U << 19), /* unassociated FIS rx'd */ |
| 221 | 221 | PHYEV_AN = (1U << 18), /* SATA async notification */ |
| @@ -347,7 +347,7 @@ enum sas_cmd_port_registers { · 125 unmodified lines | ||
| 347 | 347 | CMD_SATA_PORT_MEM_CTL0 = 0x158, /* SATA Port Memory Control 0 */ |
| 348 | 348 | CMD_SATA_PORT_MEM_CTL1 = 0x15c, /* SATA Port Memory Control 1 */ |
| 349 | 349 | CMD_XOR_MEM_BIST_CTL = 0x160, /* XOR Memory BIST Control */ |
| 350 | − CMD_XOR_MEM_BIST_STAT = 0x164, /* XOR Memroy BIST Status */ | |
| 350 | + CMD_XOR_MEM_BIST_STAT = 0x164, /* XOR Memory BIST Status */ | |
| 351 | 351 | CMD_DMA_MEM_BIST_CTL = 0x168, /* DMA Memory BIST Control */ |
| 352 | 352 | CMD_DMA_MEM_BIST_STAT = 0x16c, /* DMA Memory BIST Status */ |
| 353 | 353 | CMD_PORT_MEM_BIST_CTL = 0x170, /* Port Memory BIST Control */ |
| @@ -665,7 +665,8 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd) · 664 unmodified lines | ||
| 665 | 665 | * if the device is in the process of becoming ready, we |
| 666 | 666 | * should retry. |
| 667 | 667 | */ |
| 668 | − if ((sshdr.asc == 0x04) && (sshdr.ascq == 0x01)) | |
| 668 | + if ((sshdr.asc == 0x04) && | |
| 669 | + (sshdr.ascq == 0x01 || sshdr.ascq == 0x0a)) | |
| 669 | 670 | return NEEDS_RETRY; |
| 670 | 671 | /* |
| 671 | 672 | * if the device is not started, we need to wake |
| @@ -3499,7 +3499,7 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, · 3498 unmodified lines | ||
| 3499 | 3499 | pr_err("%s could not find host no %u\n", |
| 3500 | 3500 | __func__, ev->u.new_flashnode.host_no); |
| 3501 | 3501 | err = -ENODEV; |
| 3502 | − goto put_host; | |
| 3502 | + goto exit_new_fnode; | |
| 3503 | 3503 | } |
| 3504 | 3504 | |
| 3505 | 3505 | index = transport->new_flashnode(shost, data, len); |
| @@ -3509,7 +3509,6 @@ static int iscsi_new_flashnode(struct iscsi_transport *transport, · 3 unmodified lines | ||
| 3509 | 3509 | else |
| 3510 | 3510 | err = -EIO; |
| 3511 | 3511 | |
| 3512 | −put_host: | |
| 3513 | 3512 | scsi_host_put(shost); |
| 3514 | 3513 | |
| 3515 | 3514 | exit_new_fnode: |
| @@ -3534,7 +3533,7 @@ static int iscsi_del_flashnode(struct iscsi_transport *transport, · 18 unmodified lines | ||
| 3534 | 3533 | pr_err("%s could not find host no %u\n", |
| 3535 | 3534 | __func__, ev->u.del_flashnode.host_no); |
| 3536 | 3535 | err = -ENODEV; |
| 3537 | − goto put_host; | |
| 3536 | + goto exit_del_fnode; | |
| 3538 | 3537 | } |
| 3539 | 3538 | |
| 3540 | 3539 | idx = ev->u.del_flashnode.flashnode_idx; |
| @@ -3576,7 +3575,7 @@ static int iscsi_login_flashnode(struct iscsi_transport *transport, · 35 unmodified lines | ||
| 3576 | 3575 | pr_err("%s could not find host no %u\n", |
| 3577 | 3576 | __func__, ev->u.login_flashnode.host_no); |
| 3578 | 3577 | err = -ENODEV; |
| 3579 | − goto put_host; | |
| 3578 | + goto exit_login_fnode; | |
| 3580 | 3579 | } |
| 3581 | 3580 | |
| 3582 | 3581 | idx = ev->u.login_flashnode.flashnode_idx; |
| @@ -3628,7 +3627,7 @@ static int iscsi_logout_flashnode(struct iscsi_transport *transport, · 45 unmodified lines | ||
| 3628 | 3627 | pr_err("%s could not find host no %u\n", |
| 3629 | 3628 | __func__, ev->u.logout_flashnode.host_no); |
| 3630 | 3629 | err = -ENODEV; |
| 3631 | − goto put_host; | |
| 3630 | + goto exit_logout_fnode; | |
| 3632 | 3631 | } |
| 3633 | 3632 | |
| 3634 | 3633 | idx = ev->u.logout_flashnode.flashnode_idx; |
| @@ -3678,7 +3677,7 @@ static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport, · 43 unmodified lines | ||
| 3678 | 3677 | pr_err("%s could not find host no %u\n", |
| 3679 | 3678 | __func__, ev->u.logout_flashnode.host_no); |
| 3680 | 3679 | err = -ENODEV; |
| 3681 | − goto put_host; | |
| 3680 | + goto exit_logout_sid; | |
| 3682 | 3681 | } |
| 3683 | 3682 | |
| 3684 | 3683 | session = iscsi_session_lookup(ev->u.logout_flashnode_sid.sid); |
| @@ -362,7 +362,7 @@ MODULE_PARM_DESC(ring_avail_percent_lowater, · 361 unmodified lines | ||
| 362 | 362 | /* |
| 363 | 363 | * Timeout in seconds for all devices managed by this driver. |
| 364 | 364 | */ |
| 365 | −static int storvsc_timeout = 180; | |
| 365 | +static const int storvsc_timeout = 180; | |
| 366 | 366 | |
| 367 | 367 | #if IS_ENABLED(CONFIG_SCSI_FC_ATTRS) |
| 368 | 368 | static struct scsi_transport_template *fc_transport_template; |
| @@ -768,7 +768,7 @@ static void handle_multichannel_storage(struct hv_device *device, int max_chns) · 399 unmodified lines | ||
| 768 | 768 | return; |
| 769 | 769 | } |
| 770 | 770 | |
| 771 | − t = wait_for_completion_timeout(&request->wait_event, 10*HZ); | |
| 771 | + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); | |
| 772 | 772 | if (t == 0) { |
| 773 | 773 | dev_err(dev, "Failed to create sub-channel: timed out\n"); |
| 774 | 774 | return; |
| @@ -833,7 +833,7 @@ static int storvsc_execute_vstor_op(struct hv_device *device, · 58 unmodified lines | ||
| 833 | 833 | if (ret != 0) |
| 834 | 834 | return ret; |
| 835 | 835 | |
| 836 | − t = wait_for_completion_timeout(&request->wait_event, 5*HZ); | |
| 836 | + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); | |
| 837 | 837 | if (t == 0) |
| 838 | 838 | return -ETIMEDOUT; |
| 839 | 839 | |
| @@ -1350,6 +1350,8 @@ static int storvsc_connect_to_vsp(struct hv_device *device, u32 ring_size, · 510 unmodified lines | ||
| 1350 | 1350 | return ret; |
| 1351 | 1351 | |
| 1352 | 1352 | ret = storvsc_channel_init(device, is_fc); |
| 1353 | + if (ret) | |
| 1354 | + vmbus_close(device->channel); | |
| 1353 | 1355 | |
| 1354 | 1356 | return ret; |
| 1355 | 1357 | } |
| @@ -1668,7 +1670,7 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) · 312 unmodified lines | ||
| 1668 | 1670 | if (ret != 0) |
| 1669 | 1671 | return FAILED; |
| 1670 | 1672 | |
| 1671 | − t = wait_for_completion_timeout(&request->wait_event, 5*HZ); | |
| 1673 | + t = wait_for_completion_timeout(&request->wait_event, storvsc_timeout * HZ); | |
| 1672 | 1674 | if (t == 0) |
| 1673 | 1675 | return TIMEOUT_ERROR; |
| 1674 | 1676 | |
| @@ -6623,9 +6623,14 @@ static void ufshcd_err_handler(struct work_struct *work) · 6622 unmodified lines | ||
| 6623 | 6623 | up(&hba->host_sem); |
| 6624 | 6624 | return; |
| 6625 | 6625 | } |
| 6626 | − ufshcd_set_eh_in_progress(hba); | |
| 6627 | 6626 | spin_unlock_irqrestore(hba->host->host_lock, flags); |
| 6627 | + | |
| 6628 | 6628 | ufshcd_err_handling_prepare(hba); |
| 6629 | + | |
| 6630 | + spin_lock_irqsave(hba->host->host_lock, flags); | |
| 6631 | + ufshcd_set_eh_in_progress(hba); | |
| 6632 | + spin_unlock_irqrestore(hba->host->host_lock, flags); | |
| 6633 | + | |
| 6629 | 6634 | /* Complete requests that have door-bell cleared by h/w */ |
| 6630 | 6635 | ufshcd_complete_requests(hba, false); |
| 6631 | 6636 | spin_lock_irqsave(hba->host->host_lock, flags); |