linux/drivers/scsi/aacraid
Meelis Roos 00c20cdc79 scsi: aacraid: fix shutdown crash when init fails
When aacraid init fails with "AAC0: adapter self-test failed.", shutdown
leads to UBSAN warning and then oops:

[154316.118423] ================================================================================
[154316.118508] UBSAN: Undefined behaviour in drivers/scsi/scsi_lib.c:2328:27
[154316.118566] member access within null pointer of type 'struct Scsi_Host'
[154316.118631] CPU: 2 PID: 14530 Comm: reboot Tainted: G        W        4.15.0-dirty #89
[154316.118701] Hardware name: Hewlett Packard HP NetServer/HP System Board, BIOS 4.06.46 PW 06/25/2003
[154316.118774] Call Trace:
[154316.118848]  dump_stack+0x48/0x65
[154316.118916]  ubsan_epilogue+0xe/0x40
[154316.118976]  __ubsan_handle_type_mismatch+0xfb/0x180
[154316.119043]  scsi_block_requests+0x20/0x30
[154316.119135]  aac_shutdown+0x18/0x40 [aacraid]
[154316.119196]  pci_device_shutdown+0x33/0x50
[154316.119269]  device_shutdown+0x18a/0x390
[...]
[154316.123435] BUG: unable to handle kernel NULL pointer dereference at 000000f4
[154316.123515] IP: scsi_block_requests+0xa/0x30

This is because aac_shutdown() does

        struct Scsi_Host *shost = pci_get_drvdata(dev);
        scsi_block_requests(shost);

and that assumes shost has been assigned with pci_set_drvdata().

However, pci_set_drvdata(pdev, shost) is done in aac_probe_one() far
after bailing out with error from calling the init function
((*aac_drivers[index].init)(aac)), and when the init function fails, no
error is returned from aac_probe_one() so PCI layer assumes there is
driver attached, and tries to shut it down later.

Fix it by returning error from aac_probe_one() when card-specific init
function fails.

This fixes reboot on my HP NetRAID-4M with dead battery.

Signed-off-by: Meelis Roos <mroos@linux.ee>
Reviewed-by: Dave Carroll <david.carroll@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2018-02-13 21:35:40 -05:00
..
aachba.c scsi: aacraid: Get correct lun count 2018-01-10 23:25:11 -05:00
aacraid.h scsi: aacraid: Delay for rescan worker needs to be 10 seconds 2018-01-10 23:25:12 -05:00
commctrl.c scsi: aacraid: Fix ioctl reset hang 2018-01-03 23:26:41 -05:00
comminit.c scsi: aacraid: Move code to wait for IO completion to shutdown func 2018-01-03 23:26:42 -05:00
commsup.c scsi: aacraid: Remove unused rescan variable 2018-01-03 23:26:43 -05:00
dpcsup.c scsi: aacraid: Update copyrights 2017-02-03 10:35:04 -05:00
linit.c scsi: aacraid: fix shutdown crash when init fails 2018-02-13 21:35:40 -05:00
Makefile
nark.c scsi: aacraid: Update copyrights 2017-02-03 10:35:04 -05:00
rkt.c scsi: aacraid: Update copyrights 2017-02-03 10:35:04 -05:00
rx.c scsi: aacraid: pci_alloc_consistent() failures on ARM64 2017-04-26 18:28:06 -04:00
sa.c scsi: aacraid: Fix driver oops with dead battery 2018-01-04 01:03:41 -05:00
src.c scsi: aacraid: Add a small delay after IOP reset 2017-09-27 21:42:14 -04:00
TODO