diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2017-04-12 10:29:17 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2017-04-12 10:29:17 -0400 |
commit | 0e1bfea999daa27c801b19617a6ef8b8ec4adc75 (patch) | |
tree | 891abcb5f7c1607a868486be63c9918d5242ec79 | |
parent | 0917ac4f5346d01cee1d568ff5dc0b99be02829e (diff) | |
parent | 785a470496d8e0a32e3d39f376984eb2c98ca5b3 (diff) |
Merge remote-tracking branch 'mkp-scsi/4.11/scsi-fixes' into fixes
-rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 11 | ||||
-rw-r--r-- | drivers/scsi/aacraid/commsup.c | 3 | ||||
-rw-r--r-- | drivers/scsi/ipr.c | 7 | ||||
-rw-r--r-- | drivers/scsi/qedf/qedf_fip.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qedf/qedf_main.c | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 7 | ||||
-rw-r--r-- | drivers/scsi/sd.c | 23 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 6 |
8 files changed, 49 insertions, 12 deletions
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index d036a806f31c..d281492009fb 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
@@ -1690,9 +1690,6 @@ struct aac_dev | |||
1690 | #define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \ | 1690 | #define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \ |
1691 | (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) | 1691 | (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) |
1692 | 1692 | ||
1693 | #define aac_adapter_check_health(dev) \ | ||
1694 | (dev)->a_ops.adapter_check_health(dev) | ||
1695 | |||
1696 | #define aac_adapter_restart(dev, bled, reset_type) \ | 1693 | #define aac_adapter_restart(dev, bled, reset_type) \ |
1697 | ((dev)->a_ops.adapter_restart(dev, bled, reset_type)) | 1694 | ((dev)->a_ops.adapter_restart(dev, bled, reset_type)) |
1698 | 1695 | ||
@@ -2615,6 +2612,14 @@ static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor) | |||
2615 | return capacity; | 2612 | return capacity; |
2616 | } | 2613 | } |
2617 | 2614 | ||
2615 | static inline int aac_adapter_check_health(struct aac_dev *dev) | ||
2616 | { | ||
2617 | if (unlikely(pci_channel_offline(dev->pdev))) | ||
2618 | return -1; | ||
2619 | |||
2620 | return (dev)->a_ops.adapter_check_health(dev); | ||
2621 | } | ||
2622 | |||
2618 | /* SCp.phase values */ | 2623 | /* SCp.phase values */ |
2619 | #define AAC_OWNER_MIDLEVEL 0x101 | 2624 | #define AAC_OWNER_MIDLEVEL 0x101 |
2620 | #define AAC_OWNER_LOWLEVEL 0x102 | 2625 | #define AAC_OWNER_LOWLEVEL 0x102 |
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index c8172f16cf33..1f4918355fdb 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
@@ -1873,7 +1873,8 @@ int aac_check_health(struct aac_dev * aac) | |||
1873 | spin_unlock_irqrestore(&aac->fib_lock, flagv); | 1873 | spin_unlock_irqrestore(&aac->fib_lock, flagv); |
1874 | 1874 | ||
1875 | if (BlinkLED < 0) { | 1875 | if (BlinkLED < 0) { |
1876 | printk(KERN_ERR "%s: Host adapter dead %d\n", aac->name, BlinkLED); | 1876 | printk(KERN_ERR "%s: Host adapter is dead (or got a PCI error) %d\n", |
1877 | aac->name, BlinkLED); | ||
1877 | goto out; | 1878 | goto out; |
1878 | } | 1879 | } |
1879 | 1880 | ||
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index b29afafc2885..5d5e272fd815 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -6293,7 +6293,12 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, | |||
6293 | break; | 6293 | break; |
6294 | case IPR_IOASC_MED_DO_NOT_REALLOC: /* prevent retries */ | 6294 | case IPR_IOASC_MED_DO_NOT_REALLOC: /* prevent retries */ |
6295 | case IPR_IOASA_IR_DUAL_IOA_DISABLED: | 6295 | case IPR_IOASA_IR_DUAL_IOA_DISABLED: |
6296 | scsi_cmd->result |= (DID_PASSTHROUGH << 16); | 6296 | /* |
6297 | * exception: do not set DID_PASSTHROUGH on CHECK CONDITION | ||
6298 | * so SCSI mid-layer and upper layers handle it accordingly. | ||
6299 | */ | ||
6300 | if (scsi_cmd->result != SAM_STAT_CHECK_CONDITION) | ||
6301 | scsi_cmd->result |= (DID_PASSTHROUGH << 16); | ||
6297 | break; | 6302 | break; |
6298 | case IPR_IOASC_BUS_WAS_RESET: | 6303 | case IPR_IOASC_BUS_WAS_RESET: |
6299 | case IPR_IOASC_BUS_WAS_RESET_BY_OTHER: | 6304 | case IPR_IOASC_BUS_WAS_RESET_BY_OTHER: |
diff --git a/drivers/scsi/qedf/qedf_fip.c b/drivers/scsi/qedf/qedf_fip.c index ed58b9104f58..e10b91cc3c62 100644 --- a/drivers/scsi/qedf/qedf_fip.c +++ b/drivers/scsi/qedf/qedf_fip.c | |||
@@ -99,7 +99,8 @@ static void qedf_fcoe_process_vlan_resp(struct qedf_ctx *qedf, | |||
99 | qedf_set_vlan_id(qedf, vid); | 99 | qedf_set_vlan_id(qedf, vid); |
100 | 100 | ||
101 | /* Inform waiter that it's ok to call fcoe_ctlr_link up() */ | 101 | /* Inform waiter that it's ok to call fcoe_ctlr_link up() */ |
102 | complete(&qedf->fipvlan_compl); | 102 | if (!completion_done(&qedf->fipvlan_compl)) |
103 | complete(&qedf->fipvlan_compl); | ||
103 | } | 104 | } |
104 | } | 105 | } |
105 | 106 | ||
diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c index 8e2a160490e6..cceddd995a4b 100644 --- a/drivers/scsi/qedf/qedf_main.c +++ b/drivers/scsi/qedf/qedf_main.c | |||
@@ -2803,6 +2803,7 @@ static int __qedf_probe(struct pci_dev *pdev, int mode) | |||
2803 | atomic_set(&qedf->num_offloads, 0); | 2803 | atomic_set(&qedf->num_offloads, 0); |
2804 | qedf->stop_io_on_error = false; | 2804 | qedf->stop_io_on_error = false; |
2805 | pci_set_drvdata(pdev, qedf); | 2805 | pci_set_drvdata(pdev, qedf); |
2806 | init_completion(&qedf->fipvlan_compl); | ||
2806 | 2807 | ||
2807 | QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, | 2808 | QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_INFO, |
2808 | "QLogic FastLinQ FCoE Module qedf %s, " | 2809 | "QLogic FastLinQ FCoE Module qedf %s, " |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index f28d38e93439..1a0bf7ef0233 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -1160,8 +1160,13 @@ static inline | |||
1160 | uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) | 1160 | uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) |
1161 | { | 1161 | { |
1162 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 1162 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
1163 | struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82; | ||
1163 | 1164 | ||
1164 | return ((RD_REG_DWORD(®->host_status)) == ISP_REG_DISCONNECT); | 1165 | if (IS_P3P_TYPE(ha)) |
1166 | return ((RD_REG_DWORD(®82->host_int)) == ISP_REG_DISCONNECT); | ||
1167 | else | ||
1168 | return ((RD_REG_DWORD(®->host_status)) == | ||
1169 | ISP_REG_DISCONNECT); | ||
1165 | } | 1170 | } |
1166 | 1171 | ||
1167 | /************************************************************************** | 1172 | /************************************************************************** |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index fb9b4d29af0b..fe0f7997074e 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -2102,6 +2102,22 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
2102 | 2102 | ||
2103 | #define READ_CAPACITY_RETRIES_ON_RESET 10 | 2103 | #define READ_CAPACITY_RETRIES_ON_RESET 10 |
2104 | 2104 | ||
2105 | /* | ||
2106 | * Ensure that we don't overflow sector_t when CONFIG_LBDAF is not set | ||
2107 | * and the reported logical block size is bigger than 512 bytes. Note | ||
2108 | * that last_sector is a u64 and therefore logical_to_sectors() is not | ||
2109 | * applicable. | ||
2110 | */ | ||
2111 | static bool sd_addressable_capacity(u64 lba, unsigned int sector_size) | ||
2112 | { | ||
2113 | u64 last_sector = (lba + 1ULL) << (ilog2(sector_size) - 9); | ||
2114 | |||
2115 | if (sizeof(sector_t) == 4 && last_sector > U32_MAX) | ||
2116 | return false; | ||
2117 | |||
2118 | return true; | ||
2119 | } | ||
2120 | |||
2105 | static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | 2121 | static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, |
2106 | unsigned char *buffer) | 2122 | unsigned char *buffer) |
2107 | { | 2123 | { |
@@ -2167,7 +2183,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
2167 | return -ENODEV; | 2183 | return -ENODEV; |
2168 | } | 2184 | } |
2169 | 2185 | ||
2170 | if ((sizeof(sdkp->capacity) == 4) && (lba >= 0xffffffffULL)) { | 2186 | if (!sd_addressable_capacity(lba, sector_size)) { |
2171 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " | 2187 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " |
2172 | "kernel compiled with support for large block " | 2188 | "kernel compiled with support for large block " |
2173 | "devices.\n"); | 2189 | "devices.\n"); |
@@ -2256,7 +2272,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp, | |||
2256 | return sector_size; | 2272 | return sector_size; |
2257 | } | 2273 | } |
2258 | 2274 | ||
2259 | if ((sizeof(sdkp->capacity) == 4) && (lba == 0xffffffff)) { | 2275 | if (!sd_addressable_capacity(lba, sector_size)) { |
2260 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " | 2276 | sd_printk(KERN_ERR, sdkp, "Too big for this kernel. Use a " |
2261 | "kernel compiled with support for large block " | 2277 | "kernel compiled with support for large block " |
2262 | "devices.\n"); | 2278 | "devices.\n"); |
@@ -2956,7 +2972,8 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2956 | q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); | 2972 | q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks); |
2957 | rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); | 2973 | rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks); |
2958 | } else | 2974 | } else |
2959 | rw_max = BLK_DEF_MAX_SECTORS; | 2975 | rw_max = min_not_zero(logical_to_sectors(sdp, dev_max), |
2976 | (sector_t)BLK_DEF_MAX_SECTORS); | ||
2960 | 2977 | ||
2961 | /* Combine with controller limits */ | 2978 | /* Combine with controller limits */ |
2962 | q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); | 2979 | q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 0b29b9329b1c..a8f630213a1a 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -836,6 +836,7 @@ static void get_capabilities(struct scsi_cd *cd) | |||
836 | unsigned char *buffer; | 836 | unsigned char *buffer; |
837 | struct scsi_mode_data data; | 837 | struct scsi_mode_data data; |
838 | struct scsi_sense_hdr sshdr; | 838 | struct scsi_sense_hdr sshdr; |
839 | unsigned int ms_len = 128; | ||
839 | int rc, n; | 840 | int rc, n; |
840 | 841 | ||
841 | static const char *loadmech[] = | 842 | static const char *loadmech[] = |
@@ -862,10 +863,11 @@ static void get_capabilities(struct scsi_cd *cd) | |||
862 | scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr); | 863 | scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr); |
863 | 864 | ||
864 | /* ask for mode page 0x2a */ | 865 | /* ask for mode page 0x2a */ |
865 | rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128, | 866 | rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len, |
866 | SR_TIMEOUT, 3, &data, NULL); | 867 | SR_TIMEOUT, 3, &data, NULL); |
867 | 868 | ||
868 | if (!scsi_status_is_good(rc)) { | 869 | if (!scsi_status_is_good(rc) || data.length > ms_len || |
870 | data.header_length + data.block_descriptor_length > data.length) { | ||
869 | /* failed, drive doesn't have capabilities mode page */ | 871 | /* failed, drive doesn't have capabilities mode page */ |
870 | cd->cdi.speed = 1; | 872 | cd->cdi.speed = 1; |
871 | cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R | | 873 | cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R | |