diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-24 02:44:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-24 02:44:47 -0400 |
commit | be6e8c76047408561452dd7c48576bbf420cb09d (patch) | |
tree | 6cb24241819265878e7f04e3c6f24e6109cc86c6 | |
parent | 320437af954cbe66478f1f5e8b34cb5a8d072191 (diff) | |
parent | 10c580e4239df5c3344ca00322eca86ab2de880b (diff) |
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI fixes from James Bottomley:
"This is a set of two fixes which cause oopses (Buslogic, qla2xxx) and
one fix which may cause a hang because of request miscounting (sd)"
* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
[SCSI] sd: call blk_pm_runtime_init before add_disk
[SCSI] qla2xxx: Fix request queue null dereference.
[SCSI] BusLogic: Fix an oops when intializing multimaster adapter
-rw-r--r-- | drivers/scsi/BusLogic.c | 16 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 9 | ||||
-rw-r--r-- | drivers/scsi/sd.c | 2 |
4 files changed, 19 insertions, 10 deletions
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index feab3a5e50b5..757eb0716d45 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c | |||
@@ -696,7 +696,7 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) | |||
696 | while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC, | 696 | while ((pci_device = pci_get_device(PCI_VENDOR_ID_BUSLOGIC, |
697 | PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER, | 697 | PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER, |
698 | pci_device)) != NULL) { | 698 | pci_device)) != NULL) { |
699 | struct blogic_adapter *adapter = adapter; | 699 | struct blogic_adapter *host_adapter = adapter; |
700 | struct blogic_adapter_info adapter_info; | 700 | struct blogic_adapter_info adapter_info; |
701 | enum blogic_isa_ioport mod_ioaddr_req; | 701 | enum blogic_isa_ioport mod_ioaddr_req; |
702 | unsigned char bus; | 702 | unsigned char bus; |
@@ -744,9 +744,9 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) | |||
744 | known and enabled, note that the particular Standard ISA I/O | 744 | known and enabled, note that the particular Standard ISA I/O |
745 | Address should not be probed. | 745 | Address should not be probed. |
746 | */ | 746 | */ |
747 | adapter->io_addr = io_addr; | 747 | host_adapter->io_addr = io_addr; |
748 | blogic_intreset(adapter); | 748 | blogic_intreset(host_adapter); |
749 | if (blogic_cmd(adapter, BLOGIC_INQ_PCI_INFO, NULL, 0, | 749 | if (blogic_cmd(host_adapter, BLOGIC_INQ_PCI_INFO, NULL, 0, |
750 | &adapter_info, sizeof(adapter_info)) == | 750 | &adapter_info, sizeof(adapter_info)) == |
751 | sizeof(adapter_info)) { | 751 | sizeof(adapter_info)) { |
752 | if (adapter_info.isa_port < 6) | 752 | if (adapter_info.isa_port < 6) |
@@ -762,7 +762,7 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) | |||
762 | I/O Address assigned at system initialization. | 762 | I/O Address assigned at system initialization. |
763 | */ | 763 | */ |
764 | mod_ioaddr_req = BLOGIC_IO_DISABLE; | 764 | mod_ioaddr_req = BLOGIC_IO_DISABLE; |
765 | blogic_cmd(adapter, BLOGIC_MOD_IOADDR, &mod_ioaddr_req, | 765 | blogic_cmd(host_adapter, BLOGIC_MOD_IOADDR, &mod_ioaddr_req, |
766 | sizeof(mod_ioaddr_req), NULL, 0); | 766 | sizeof(mod_ioaddr_req), NULL, 0); |
767 | /* | 767 | /* |
768 | For the first MultiMaster Host Adapter enumerated, | 768 | For the first MultiMaster Host Adapter enumerated, |
@@ -779,12 +779,12 @@ static int __init blogic_init_mm_probeinfo(struct blogic_adapter *adapter) | |||
779 | 779 | ||
780 | fetch_localram.offset = BLOGIC_AUTOSCSI_BASE + 45; | 780 | fetch_localram.offset = BLOGIC_AUTOSCSI_BASE + 45; |
781 | fetch_localram.count = sizeof(autoscsi_byte45); | 781 | fetch_localram.count = sizeof(autoscsi_byte45); |
782 | blogic_cmd(adapter, BLOGIC_FETCH_LOCALRAM, | 782 | blogic_cmd(host_adapter, BLOGIC_FETCH_LOCALRAM, |
783 | &fetch_localram, sizeof(fetch_localram), | 783 | &fetch_localram, sizeof(fetch_localram), |
784 | &autoscsi_byte45, | 784 | &autoscsi_byte45, |
785 | sizeof(autoscsi_byte45)); | 785 | sizeof(autoscsi_byte45)); |
786 | blogic_cmd(adapter, BLOGIC_GET_BOARD_ID, NULL, 0, &id, | 786 | blogic_cmd(host_adapter, BLOGIC_GET_BOARD_ID, NULL, 0, |
787 | sizeof(id)); | 787 | &id, sizeof(id)); |
788 | if (id.fw_ver_digit1 == '5') | 788 | if (id.fw_ver_digit1 == '5') |
789 | force_scan_order = | 789 | force_scan_order = |
790 | autoscsi_byte45.force_scan_order; | 790 | autoscsi_byte45.force_scan_order; |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 2ef497ebadc0..ee5c1833eb73 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -20,7 +20,7 @@ | |||
20 | * | Device Discovery | 0x2095 | 0x2020-0x2022, | | 20 | * | Device Discovery | 0x2095 | 0x2020-0x2022, | |
21 | * | | | 0x2011-0x2012, | | 21 | * | | | 0x2011-0x2012, | |
22 | * | | | 0x2016 | | 22 | * | | | 0x2016 | |
23 | * | Queue Command and IO tracing | 0x3058 | 0x3006-0x300b | | 23 | * | Queue Command and IO tracing | 0x3059 | 0x3006-0x300b | |
24 | * | | | 0x3027-0x3028 | | 24 | * | | | 0x3027-0x3028 | |
25 | * | | | 0x303d-0x3041 | | 25 | * | | | 0x303d-0x3041 | |
26 | * | | | 0x302d,0x3033 | | 26 | * | | | 0x302d,0x3033 | |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index df1b30ba938c..ff9c86b1a0d8 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -1957,6 +1957,15 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt) | |||
1957 | que = MSW(sts->handle); | 1957 | que = MSW(sts->handle); |
1958 | req = ha->req_q_map[que]; | 1958 | req = ha->req_q_map[que]; |
1959 | 1959 | ||
1960 | /* Check for invalid queue pointer */ | ||
1961 | if (req == NULL || | ||
1962 | que >= find_first_zero_bit(ha->req_qid_map, ha->max_req_queues)) { | ||
1963 | ql_dbg(ql_dbg_io, vha, 0x3059, | ||
1964 | "Invalid status handle (0x%x): Bad req pointer. req=%p, " | ||
1965 | "que=%u.\n", sts->handle, req, que); | ||
1966 | return; | ||
1967 | } | ||
1968 | |||
1960 | /* Validate handle. */ | 1969 | /* Validate handle. */ |
1961 | if (handle < req->num_outstanding_cmds) | 1970 | if (handle < req->num_outstanding_cmds) |
1962 | sp = req->outstanding_cmds[handle]; | 1971 | sp = req->outstanding_cmds[handle]; |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index e62d17d41d4e..5693f6d7eddb 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -2854,6 +2854,7 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
2854 | gd->events |= DISK_EVENT_MEDIA_CHANGE; | 2854 | gd->events |= DISK_EVENT_MEDIA_CHANGE; |
2855 | } | 2855 | } |
2856 | 2856 | ||
2857 | blk_pm_runtime_init(sdp->request_queue, dev); | ||
2857 | add_disk(gd); | 2858 | add_disk(gd); |
2858 | if (sdkp->capacity) | 2859 | if (sdkp->capacity) |
2859 | sd_dif_config_host(sdkp); | 2860 | sd_dif_config_host(sdkp); |
@@ -2862,7 +2863,6 @@ static void sd_probe_async(void *data, async_cookie_t cookie) | |||
2862 | 2863 | ||
2863 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", | 2864 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", |
2864 | sdp->removable ? "removable " : ""); | 2865 | sdp->removable ? "removable " : ""); |
2865 | blk_pm_runtime_init(sdp->request_queue, dev); | ||
2866 | scsi_autopm_put_device(sdp); | 2866 | scsi_autopm_put_device(sdp); |
2867 | put_device(&sdkp->dev); | 2867 | put_device(&sdkp->dev); |
2868 | } | 2868 | } |