[PATCH Trusty SRU] [SCSI] scsi_transport_sas: move bsg destructor into sas_rphy_remove

tim.gardner at canonical.com tim.gardner at canonical.com
Mon Sep 15 12:57:48 UTC 2014

From: Joe Lawrence <joe.lawrence at stratus.com>

BugLink: http://bugs.launchpad.net/bugs/1368991

The recent change in sysfs, bcdde7e221a8750f9b62b6d0bd31b72ea4ad9309
"sysfs: make __sysfs_remove_dir() recursive" revealed an asymmetric
rphy device creation/deletion sequence in scsi_transport_sas:

  modprobe mpt2sas
      device_add A               rphy->dev
      device_add B               sas_device transport class
      device_add C               sas_end_device transport class
      device_add D               bsg class

  rmmod mpt2sas
        device_del B
        device_del C
        device_del A
          sysfs_remove_group     recursive sysfs dir removal
        device_del D             warning

  where device A is the parent of B, C, and D.

When sas_rphy_free tries to unregister the bsg request queue (device D
above), the ensuing sysfs cleanup discovers that its sysfs group has
already been removed and emits a warning, "sysfs group... not found for
kobject 'end_device-X:0'".

Since bsg creation is a side effect of sas_rphy_add, move its
complementary removal call into sas_rphy_remove. This imposes the
following tear-down order for the devices above: D, B, C, A.

Note the sas_device and sas_end_device transport class devices (B and C
above) are created and destroyed both via the list match traversal in
attribute_container_device_trigger, so the order in which they are
handled is fixed. This is fine as long as they are deleted before their
parent device.

Signed-off-by: Joe Lawrence <joe.lawrence at stratus.com>
Acked-by: Dan Williams <dan.j.williams at intel.com>
Signed-off-by: James Bottomley <JBottomley at Parallels.com>
(cherry picked from commit 6aa6caff30f5dcb9e55b03b9710c30b83750cae5)
Signed-off-by: Tim Gardner <tim.gardner at canonical.com>

Kamal - this appears to have missed 3.13 stable

 drivers/scsi/scsi_transport_sas.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c
index 1b68142..c341f85 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -1621,8 +1621,6 @@ void sas_rphy_free(struct sas_rphy *rphy)
-	sas_bsg_remove(shost, rphy);
@@ -1681,6 +1679,7 @@ sas_rphy_remove(struct sas_rphy *rphy)
+	sas_bsg_remove(NULL, rphy);

More information about the kernel-team mailing list