• Damien Le Moal's avatar
    ata: libata-core: Fix port and device removal · 84d76529
    Damien Le Moal authored
    Whenever an ATA adapter driver is removed (e.g. rmmod),
    ata_port_detach() is called repeatedly for all the adapter ports to
    remove (unload) the devices attached to the port and delete the port
    device itself. Removing of devices is done using libata EH with the
    ATA_PFLAG_UNLOADING port flag set. This causes libata EH to execute
    ata_eh_unload() which disables all devices attached to the port.
    
    ata_port_detach() finishes by calling scsi_remove_host() to remove the
    scsi host associated with the port. This function will trigger the
    removal of all scsi devices attached to the host and in the case of
    disks, calls to sd_shutdown() which will flush the device write cache
    and stop the device. However, given that the devices were already
    disabled by ata_eh_unload(), the synchronize write cache command and
    start stop unit commands fail. E.g. running "rmmod ahci" with first
    removing sd_mod results in error messages like:
    
    ata13.00: disable device
    sd 0:0:0:0: [sda] Synchronizing SCSI cache
    sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
    sd 0:0:0:0: [sda] Stopping disk
    sd 0:0:0:0: [sda] Start/Stop Unit failed: Result: hostbyte=DID_BAD_TARGET driverbyte=DRIVER_OK
    
    Fix this by removing all scsi devices of the ata devices connected to
    the port before scheduling libata EH to disable the ATA devices.
    
    Fixes: 720ba126 ("[PATCH] libata-hp: update unload-unplug")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Reviewed-by: default avatarNiklas Cassel <niklas.cassel@wdc.com>
    Tested-by: default avatarChia-Lin Kao (AceLan) <acelan.kao@canonical.com>
    Tested-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    84d76529
libata-core.c 168 KB