Jason Yan
2fa4a32613
scsi: libsas: dynamically allocate and free ata host
...
Commit 2623c7a5f2 ("libata: add refcounting to ata_host") v4.17+ introduced
refcounting to ata_host and will increase or decrease the refcount when
adding or deleting transport ATA port.
Now the ata host for libsas is embedded in domain_device, and the ->kref
member is not initialized. Afer we add ata transport class, ata_host_get()
will be called when adding transport ATA port and a warning will be
triggered as below:
refcount_t: increment on 0; use-after-free.
WARNING: CPU: 2 PID: 103 at
lib/refcount.c:153 refcount_inc+0x40/0x48 ...... Call trace:
refcount_inc+0x40/0x48
ata_host_get+0x10/0x18
ata_tport_add+0x40/0x120
ata_sas_tport_add+0xc/0x14
sas_ata_init+0x7c/0xc8
sas_discover_domain+0x380/0x53c
process_one_work+0x12c/0x288
worker_thread+0x58/0x3f0
kthread+0xfc/0x128
ret_from_fork+0x10/0x18
And also when removing transport ATA port ata_host_put() will be called and
another similar warning will be triggered. If the refcount decreased to
zero, the ata host will be freed. But this ata host is only part of
domain_device, it cannot be freed directly.
So we have to change this embedded static ata host to a dynamically
allocated ata host and initialize the ->kref member. To use ata_host_get()
and ata_host_put() in libsas, we need to move the declaration of these
functions to the public libata.h and export them.
Fixes: b6240a4df0 ("scsi: libsas: add transport class for ATA devices")
Signed-off-by: Jason Yan <yanaijie@huawei.com>
CC: John Garry <john.garry@huawei.com>
CC: Taras Kondratiuk <takondra@cisco.com>
CC: Tejun Heo <tj@kernel.org>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2018-06-19 22:02:25 -04:00
..
acard-ahci.c
libata: convert core and drivers to ->hw_tag usage
2018-05-11 13:10:43 -07:00
ahci.c
ahci: Add PCI ID for Cannon Lake PCH-LP AHCI
2018-05-24 07:03:32 -07:00
ahci.h
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-06-05 17:01:41 -07:00
ahci_brcm.c
ata: ahci_brcm: Recover from failures to identify devices
2018-01-17 07:52:29 -08:00
ahci_ceva.c
ata: ceva: Add SMMU support for SATA IP
2017-10-23 07:09:27 -07:00
ahci_da850.c
sata: ahci-da850: Fix some error handling paths in 'ahci_da850_probe()'
2017-08-16 07:38:27 -07:00
ahci_dm816.c
ata: ahci: add support for DaVinci DM816 SATA controller
2017-03-24 11:40:03 -04:00
ahci_imx.c
ahci: imx: add the imx8qm ahci sata support
2018-03-29 06:43:55 -07:00
ahci_mtk.c
ahci: mtk: Change driver name to ahci-mtk
2017-12-04 12:35:29 -08:00
ahci_mvebu.c
ata: ahci: mvebu: override ahci_stop_engine for mvebu AHCI
2018-04-26 11:25:15 -07:00
ahci_octeon.c
Delete redundant return value check of platform_get_resource()
2017-03-06 15:40:59 -05:00
ahci_platform.c
ata: ahci_platform: Add shutdown handler
2017-08-04 13:34:14 -07:00
ahci_qoriq.c
libahci: Allow drivers to override stop_engine
2018-04-26 11:25:04 -07:00
ahci_seattle.c
ahci_st.c
ahci_sunxi.c
ahci_tegra.c
ata: ahci_tegra: Add AHCI support for Tegra210
2018-03-14 08:24:21 -07:00
ahci_xgene.c
libahci: Allow drivers to override stop_engine
2018-04-26 11:25:04 -07:00
ata_generic.c
ata_piix.c
ata_piix: constify pci_bits
2018-01-08 06:15:41 -08:00
Kconfig
Merge branch 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-04-03 17:42:25 -07:00
libahci.c
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-06-05 17:01:41 -07:00
libahci_platform.c
Revert "ata: ahci-platform: add reset control support"
2018-04-09 15:10:50 -07:00
libata-acpi.c
libata-core.c
scsi: libsas: dynamically allocate and free ata host
2018-06-19 22:02:25 -04:00
libata-eh.c
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-06-05 17:01:41 -07:00
libata-pmp.c
treewide: kzalloc() -> kcalloc()
2018-06-12 16:19:22 -07:00
libata-scsi.c
SCSI misc on 20180610
2018-06-10 13:01:12 -07:00
libata-sff.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
libata-trace.c
libata-transport.c
libata: add refcounting to ata_host
2018-03-13 13:29:10 -07:00
libata-transport.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
libata-zpodd.c
libata: zpodd: small read overflow in eject_tray()
2018-05-29 06:48:54 -07:00
libata.h
scsi: libsas: dynamically allocate and free ata host
2018-06-19 22:02:25 -04:00
Makefile
Merge branch 'for-4.17' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-04-03 17:42:25 -07:00
pata_acpi.c
pata_ali.c
ata: Deprecate pci_get_bus_and_slot()
2018-01-11 17:23:23 -06:00
pata_amd.c
cs5536: add support for IDE controller variant
2017-08-11 10:35:07 -07:00
pata_arasan_cf.c
pata_arasan_cf: Delete an unnecessary variable initialisation in arasan_cf_probe()
2018-02-18 05:16:35 -08:00
pata_artop.c
ata: pata_artop: remove redundant initialization of pio
2017-09-18 20:24:21 -07:00
pata_atiixp.c
libata:pata_atiixp: Don't use unconnected secondary port on SB600
2018-01-08 04:02:02 -08:00
pata_atp867x.c
ata: mark expected switch fall-throughs
2017-10-23 07:06:09 -07:00
pata_bk3710.c
pata_bk3710: clarify license version and use SPDX header
2018-03-01 13:59:03 -08:00
pata_cmd64x.c
pata_cmd640.c
pata_cs5520.c
pata_cs5530.c
pata_cs5535.c
pata_cs5536.c
cs5536: add support for IDE controller variant
2017-08-11 10:35:07 -07:00
pata_cypress.c
pata_efar.c
pata_ep93xx.c
ata: ep93xx: cut drvdata assignment
2017-05-30 11:54:36 -04:00
pata_falcon.c
pata_falcon: clarify license version and use SPDX header
2018-03-01 13:58:17 -08:00
pata_ftide010.c
ata: ftide010: fix resource printing
2017-06-21 18:06:18 -04:00
pata_gayle.c
ata: add Amiga Gayle PATA controller driver
2018-03-19 07:41:36 -07:00
pata_hpt3x2n.c
pata_hpt3x3.c
pata_hpt37x.c
ata: hpt37x: Convert to use match_string() helper
2018-05-07 08:50:30 -07:00
pata_hpt366.c
pata_icside.c
pata_imx.c
pata_isapnp.c
pata_it821x.c
pata_it821x: Delete an error message for a failed memory allocation in it821x_firmware_command()
2018-02-18 05:26:07 -08:00
pata_it8213.c
pata_ixp4xx_cf.c
ata: pass queued command to ->sff_data_xfer method
2017-01-10 11:11:17 -05:00
pata_jmicron.c
pata_legacy.c
ata: pass queued command to ->sff_data_xfer method
2017-01-10 11:11:17 -05:00
pata_macio.c
pata_macio: Delete an error message for a failed memory allocation in two functions
2018-02-18 05:24:16 -08:00
pata_marvell.c
pata_mpc52xx.c
pata_mpc52xx: Delete an error message for a failed memory allocation in mpc52xx_ata_probe()
2018-02-18 05:23:25 -08:00
pata_mpiix.c
pata_netcell.c
pata_ninja32.c
pata_ns87410.c
pata_ns87415.c
pata_octeon_cf.c
pata_octeon_cf: use of_property_read_{bool|u32}()
2017-08-28 10:44:24 -07:00
pata_of_platform.c
ata: constify of_device_id structures
2017-03-06 15:18:01 -05:00
pata_oldpiix.c
pata_opti.c
pata_optidma.c
pata_palmld.c
pata_pcmcia.c
ata: pass queued command to ->sff_data_xfer method
2017-01-10 11:11:17 -05:00
pata_pdc202xx_old.c
pata_pdc2027x.c
ata: pata_pdc2027x: Replace mdelay with msleep
2018-01-25 07:28:31 -08:00
pata_piccolo.c
pata_platform.c
pata_pxa.c
pata_radisys.c
pata_rb532_cf.c
ata: rb532_cf: cut drvdata assignment
2017-05-30 11:54:37 -04:00
pata_rdc.c
ata: declare ata_port_info structures as const
2017-06-12 14:06:34 -04:00
pata_rz1000.c
pata_samsung_cf.c
pata_samsung_cf: Delete an error message for a failed memory allocation in pata_s3c_probe()
2018-02-18 05:20:38 -08:00
pata_sc1200.c
pata_sch.c
ata: declare ata_port_info structures as const
2017-06-12 14:06:34 -04:00
pata_serverworks.c
pata_sil680.c
pata_sis.c
pata_sl82c105.c
pata_triflex.c
pata_via.c
pdc_adma.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_dwc_460ex.c
libata: convert core and drivers to ->hw_tag usage
2018-05-11 13:10:43 -07:00
sata_fsl.c
sata_fsl: use the right type for tag bitshift
2018-05-14 08:14:21 -07:00
sata_gemini.c
ata: sata_gemini: Introduce explicit IDE pin control
2017-08-11 10:32:09 -07:00
sata_gemini.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
sata_highbank.c
libahci: Allow drivers to override stop_engine
2018-04-26 11:25:04 -07:00
sata_inic162x.c
ata: declare ata_port_info structures as const
2017-06-12 14:06:34 -04:00
sata_mv.c
treewide: devm_kzalloc() -> devm_kcalloc()
2018-06-12 16:19:22 -07:00
sata_nv.c
sata_nv: set host can_queue count appropriately
2018-05-11 13:10:43 -07:00
sata_promise.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_promise.h
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_qstor.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_rcar.c
ata: sata_rcar: Remove unused variable in sata_rcar_init_controller()
2018-02-13 06:39:38 -08:00
sata_sil.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_sil24.c
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata
2018-06-05 17:01:41 -07:00
sata_sis.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_svw.c
ata: Convert to using %pOF instead of full_name
2017-07-18 18:02:36 -04:00
sata_sx4.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_uli.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sata_via.c
sata_via: Enable optional hotplug on VT6420
2017-06-26 16:54:53 -04:00
sata_vsc.c
ata: update references for libata documentation
2017-05-16 11:25:59 -04:00
sis.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00