[PATCH 2/2] scsi: isci: remove the SAS host after the SCSI host

From: Johannes Thumshirn
Date: Wed Mar 29 2017 - 05:42:56 EST


After commit bcdde7e ("sysfs: make __sysfs_remove_dir() recursive") changed the
removal path of kernfs to make it recursive we have to remove the SAS host
before the SCSI host or we will see sysfs warnings like the below when
triggering the the removal of the SAS HBA PCI device like with writing to the
sysfs pci remove file:

echo 1 > /sys/module/isci/drivers/pci:isci/<device>/remove

WARNING: CPU: 2 PID: 5 at fs/sysfs/group.c:241 sysfs_remove_group+0xc3/0xd0
sysfs group 'power' not found for kobject 'end_device-6:0'
CPU: 16 PID: 5884 Comm: echo Not tainted 4.11.0-rc3-libsas+ #504
Call Trace:
dump_stack+0x85/0xc2
__warn+0xc6/0xe0
warn_slowpath_fmt+0x4a/0x50
sysfs_remove_group+0xc3/0xd0
dpm_sysfs_remove+0x52/0x60
device_del+0x13c/0x360
? device_remove_file+0x14/0x20
attribute_container_class_device_del+0x15/0x20
transport_remove_classdev+0x4c/0x60
? transport_add_class_device+0x40/0x40
attribute_container_device_trigger+0xb3/0xc0
transport_remove_device+0x10/0x20
sas_port_delete+0x12d/0x160 [scsi_transport_sas]
sas_deform_port+0x1bf/0x1d0 [libsas]
sas_unregister_ports+0x36/0x50 [libsas]
sas_unregister_ha+0x1b/0x40 [libsas]
isci_unregister+0x2a/0x40 [isci]
isci_pci_remove+0x52/0xb0 [isci]
? __pm_runtime_resume+0x56/0x80
pci_device_remove+0x34/0xb0
device_release_driver_internal+0x158/0x210
device_release_driver+0xd/0x10
pci_stop_bus_device+0x85/0x90
pci_stop_and_remove_bus_device_locked+0x15/0x30
remove_store+0x59/0x70
dev_attr_store+0x13/0x20
sysfs_kf_write+0x40/0x50
kernfs_fop_write+0x130/0x1b0
__vfs_write+0x23/0x130
? rcu_read_lock_sched_held+0x6d/0x80
? rcu_sync_lockdep_assert+0x2a/0x50
? __sb_start_write+0xd7/0x1e0
? vfs_write+0x1a4/0x1f0
vfs_write+0xc6/0x1f0
SyS_write+0x44/0xa0
entry_SYSCALL_64_fastpath+0x23/0xc6

Signed-off-by: Johannes Thumshirn <jthumshirn@xxxxxxx>
---
drivers/scsi/isci/init.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index 0b5b5db..afa6b25 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -267,15 +267,22 @@ static int isci_register_sas_ha(struct isci_host *isci_host)
static void isci_unregister(struct isci_host *isci_host)
{
struct Scsi_Host *shost;
+ unsigned long flags;

if (!isci_host)
return;

shost = to_shost(isci_host);
- scsi_remove_host(shost);
+
+ spin_lock_irqsave(shost->host_lock, flags);
+ if (scsi_host_set_state(shost, SHOST_CANCEL))
+ WARN_ON(scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY));
+ spin_unlock_irqrestore(shost->host_lock, flags);
+
sas_unregister_ha(&isci_host->sas_ha);

sas_remove_host(shost);
+ scsi_remove_host(shost);
scsi_host_put(shost);
}

--
1.8.5.6