• Joe Lawrence's avatar
    [SCSI] scsi_transport_sas: move bsg destructor into sas_rphy_remove · 6aa6caff
    Joe Lawrence authored
    The recent change in sysfs, bcdde7e2
    "sysfs: make __sysfs_remove_dir() recursive" revealed an asymmetric
    rphy device creation/deletion sequence in scsi_transport_sas:
    
      modprobe mpt2sas
        sas_rphy_add
          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
        sas_rphy_delete
          sas_rphy_remove
            device_del B
            device_del C
            device_del A
              sysfs_remove_group     recursive sysfs dir removal
          sas_rphy_free
            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: default avatarJoe Lawrence <joe.lawrence@stratus.com>
    Acked-by: default avatarDan Williams <dan.j.williams@intel.com>
    Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
    6aa6caff
scsi_transport_sas.c 51.9 KB