Tejun Heo
1a112d10f0
libata: introduce ata_host->n_tags to avoid oops on SAS controllers
1871ee134b ("libata: support the ata host which implements a queue
depth less than 32") directly used ata_port->scsi_host->can_queue from
ata_qc_new() to determine the number of tags supported by the host;
unfortunately, SAS controllers doing SATA don't initialize ->scsi_host
leading to the following oops.
BUG: unable to handle kernel NULL pointer dereference at 0000000000000058
IP: [<ffffffff814e0618>] ata_qc_new_init+0x188/0x1b0
PGD 0
Oops: 0002 [#1] SMP
Modules linked in: isci libsas scsi_transport_sas mgag200 drm_kms_helper ttm
CPU: 1 PID: 518 Comm: udevd Not tainted 3.16.0-rc6+ #62
Hardware name: Intel Corporation S2600CO/S2600CO, BIOS SE5C600.86B.02.02.0002.122320131210 12/23/2013
task: ffff880c1a00b280 ti: ffff88061a000000 task.ti: ffff88061a000000
RIP: 0010:[<ffffffff814e0618>] [<ffffffff814e0618>] ata_qc_new_init+0x188/0x1b0
RSP: 0018:ffff88061a003ae8 EFLAGS: 00010012
RAX: 0000000000000001 RBX: ffff88000241ca80 RCX: 00000000000000fa
RDX: 0000000000000020 RSI: 0000000000000020 RDI: ffff8806194aa298
RBP: ffff88061a003ae8 R08: ffff8806194a8000 R09: 0000000000000000
R10: 0000000000000000 R11: ffff88000241ca80 R12: ffff88061ad58200
R13: ffff8806194aa298 R14: ffffffff814e67a0 R15: ffff8806194a8000
FS: 00007f3ad7fe3840(0000) GS:ffff880627620000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000000000058 CR3: 000000061a118000 CR4: 00000000001407e0
Stack:
ffff88061a003b20 ffffffff814e96e1 ffff88000241ca80 ffff88061ad58200
ffff8800b6bf6000 ffff880c1c988000 ffff880619903850 ffff88061a003b68
ffffffffa0056ce1 ffff88061a003b48 0000000013d6e6f8 ffff88000241ca80
Call Trace:
[<ffffffff814e96e1>] ata_sas_queuecmd+0xa1/0x430
[<ffffffffa0056ce1>] sas_queuecommand+0x191/0x220 [libsas]
[<ffffffff8149afee>] scsi_dispatch_cmd+0x10e/0x300
[<ffffffff814a3bc5>] scsi_request_fn+0x2f5/0x550
[<ffffffff81317613>] __blk_run_queue+0x33/0x40
[<ffffffff8131781a>] queue_unplugged+0x2a/0x90
[<ffffffff8131ceb4>] blk_flush_plug_list+0x1b4/0x210
[<ffffffff8131d274>] blk_finish_plug+0x14/0x50
[<ffffffff8117eaa8>] __do_page_cache_readahead+0x198/0x1f0
[<ffffffff8117ee21>] force_page_cache_readahead+0x31/0x50
[<ffffffff8117ee7e>] page_cache_sync_readahead+0x3e/0x50
[<ffffffff81172ac6>] generic_file_read_iter+0x496/0x5a0
[<ffffffff81219897>] blkdev_read_iter+0x37/0x40
[<ffffffff811e307e>] new_sync_read+0x7e/0xb0
[<ffffffff811e3734>] vfs_read+0x94/0x170
[<ffffffff811e43c6>] SyS_read+0x46/0xb0
[<ffffffff811e33d1>] ? SyS_lseek+0x91/0xb0
[<ffffffff8171ee29>] system_call_fastpath+0x16/0x1b
Code: 00 00 00 88 50 29 83 7f 08 01 19 d2 83 e2 f0 83 ea 50 88 50 34 c6 81 1d 02 00 00 40 c6 81 17 02 00 00 00 5d c3 66 0f 1f 44 00 00 <89> 14 25 58 00 00 00
Fix it by introducing ata_host->n_tags which is initialized to
ATA_MAX_QUEUE - 1 in ata_host_init() for SAS controllers and set to
scsi_host_template->can_queue in ata_host_register() for !SAS ones.
As SAS hosts are never registered, this will give them the same
ATA_MAX_QUEUE - 1 as before. Note that we can't use
scsi_host->can_queue directly for SAS hosts anyway as they can go
higher than the libata maximum.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Mike Qiu <qiudayu@linux.vnet.ibm.com>
Reported-by: Jesse Brandeburg <jesse.brandeburg@gmail.com>
Reported-by: Peter Hurley <peter@hurleysoftware.com>
Reported-by: Peter Zijlstra <peterz@infradead.org>
Tested-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Fixes: 1871ee134b ("libata: support the ata host which implements a queue depth less than 32")
Cc: Kevin Hao <haokexin@gmail.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: stable@vger.kernel.org
|
2014-07-23 10:30:34 -04:00 |
| .. |
|
acard-ahci.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
ahci.c
|
ahci: add support for the Promise FastTrak TX8660 SATA HBA (ahci mode)
|
2014-07-18 18:00:50 -04:00 |
|
ahci.h
|
libahci: export ahci_qc_issue() and ahci_start_fix_rx()
|
2014-07-08 11:46:05 -04:00 |
|
ahci_da850.c
|
libahci_platform: add host_flags parameter in ahci_platform_init_host()
|
2014-05-14 13:07:10 -04:00 |
|
ahci_imx.c
|
ata: ahci_imx: warn when disabling ahci link
|
2014-06-24 17:58:14 -04:00 |
|
ahci_mvebu.c
|
libahci_platform: add host_flags parameter in ahci_platform_init_host()
|
2014-05-14 13:07:10 -04:00 |
|
ahci_platform.c
|
ahci: disable ncq feature for hisilicon sata
|
2014-06-24 16:54:23 -04:00 |
|
ahci_st.c
|
libahci_platform: add host_flags parameter in ahci_platform_init_host()
|
2014-05-14 13:07:10 -04:00 |
|
ahci_sunxi.c
|
libahci_platform: add host_flags parameter in ahci_platform_init_host()
|
2014-05-14 13:07:10 -04:00 |
|
ahci_xgene.c
|
ahci_xgene: fix the dma state machine lockup for the IDENTIFY DEVICE PIO mode command.
|
2014-07-08 11:46:05 -04:00 |
|
ata_generic.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
ata_piix.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
Kconfig
|
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
|
2014-06-09 14:58:36 -07:00 |
|
libahci.c
|
libahci: export ahci_qc_issue() and ahci_start_fix_rx()
|
2014-07-08 11:46:05 -04:00 |
|
libahci_platform.c
|
libahci_platform: Fail when PHY required but PHY support disabled
|
2014-06-17 12:10:59 -04:00 |
|
libata-acpi.c
|
ACPI and power management updates for 3.15-rc1
|
2014-04-01 12:48:54 -07:00 |
|
libata-core.c
|
libata: introduce ata_host->n_tags to avoid oops on SAS controllers
|
2014-07-23 10:30:34 -04:00 |
|
libata-eh.c
|
libata: EH should handle AMNF error condition as a media error
|
2014-07-15 11:13:57 -04:00 |
|
libata-pmp.c
|
ata: enable quirk from jmicron JMB350 for JMB394
|
2014-01-31 07:05:44 -05:00 |
|
libata-scsi.c
|
ata: SATL compliance for Inquiry Product Revision
|
2014-05-02 10:57:47 -04:00 |
|
libata-sff.c
|
libata-sff: remove dead code
|
2014-05-04 15:01:42 -04:00 |
|
libata-transport.c
|
libata: Fix display of sata speed
|
2013-10-27 07:43:25 -04:00 |
|
libata-transport.h
|
|
|
|
libata-zpodd.c
|
libata: zpodd: eliminate odd_can_poweroff
|
2014-03-14 11:23:47 -04:00 |
|
libata.h
|
ATA / ACPI: remove power dependent device handling
|
2013-10-17 15:38:53 +02:00 |
|
Makefile
|
ata: ahci_mvebu: new driver for Marvell Armada 380 AHCI interfaces
|
2014-05-04 15:28:59 -04:00 |
|
pata_acpi.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ali.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_amd.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_arasan_cf.c
|
pata_arasan_cf: fix ata_host_activate() failure handling
|
2014-04-14 13:50:03 -04:00 |
|
pata_artop.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_at32.c
|
ata: use dev_get_platdata()
|
2013-07-30 08:59:24 -04:00 |
|
pata_at91.c
|
pata_at91: fix ata_host_activate() failure handling
|
2014-04-02 13:17:31 -04:00 |
|
pata_atiixp.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_atp867x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_bf54x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cmd64x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cmd640.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cs5520.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cs5530.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cs5535.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cs5536.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_cypress.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_efar.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ep93xx.c
|
drivers/ata/pata_ep93xx.c: use signed int type for result of platform_get_irq()
|
2014-07-17 08:36:13 -04:00 |
|
pata_hpt3x2n.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
pata_hpt3x3.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_hpt37x.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
pata_hpt366.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_icside.c
|
|
|
|
pata_imx.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_isapnp.c
|
pata_isapnp: Don't use invalid I/O ports
|
2013-10-07 15:17:32 -04:00 |
|
pata_it821x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_it8213.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ixp4xx_cf.c
|
DMA-API: others: use dma_set_coherent_mask()
|
2013-10-31 14:49:07 +00:00 |
|
pata_jmicron.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_legacy.c
|
pata_legacy: Remove dead code
|
2014-03-11 08:30:53 -04:00 |
|
pata_macio.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_marvell.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_mpc52xx.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_mpiix.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_netcell.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ninja32.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ns87410.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_ns87415.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_octeon_cf.c
|
pata_octeon_cf: use devm_kzalloc() to allocate cf_port
|
2014-04-14 13:33:28 -04:00 |
|
pata_of_platform.c
|
|
|
|
pata_oldpiix.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_opti.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_optidma.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_palmld.c
|
|
|
|
pata_pcmcia.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
pata_pdc202xx_old.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_pdc2027x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_piccolo.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_platform.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
pata_pxa.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
pata_radisys.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_rb532_cf.c
|
|
|
|
pata_rdc.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_rz1000.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_samsung_cf.c
|
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
|
2014-06-09 14:58:36 -07:00 |
|
pata_sc1200.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_scc.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_sch.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_serverworks.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_sil680.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_sis.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_sl82c105.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_triflex.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pata_via.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
pdc_adma.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sata_dwc_460ex.c
|
ata: remove superfluous casts
|
2014-03-26 12:36:53 -04:00 |
|
sata_fsl.c
|
sata_fsl: remove check for CONFIG_MPC8315_DS
|
2014-05-21 15:36:22 -04:00 |
|
sata_highbank.c
|
ata: sata_highbank: remove superfluous cast
|
2014-03-26 11:42:01 -04:00 |
|
sata_inic162x.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_mv.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_nv.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_promise.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sata_promise.h
|
|
|
|
sata_qstor.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sata_rcar.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_sil.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_sil24.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_sis.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_svw.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sata_sx4.c
|
ata: remove superfluous casts
|
2014-03-26 12:36:53 -04:00 |
|
sata_uli.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sata_via.c
|
ata: use CONFIG_PM_SLEEP instead of CONFIG_PM where applicable in host drivers
|
2014-05-09 22:37:49 -04:00 |
|
sata_vsc.c
|
ata: delete non-required instances of include <linux/init.h>
|
2014-02-13 16:40:56 -05:00 |
|
sis.h
|
|
|