On Mon, Sep 11, 2023 at 01:02:00PM +0900, Damien Le Moal wrote: > 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: 720ba12620ee ("[PATCH] libata-hp: update unload-unplug") > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> Tested-by: Chia-Lin Kao (AceLan) <acelan.kao@xxxxxxxxxxxxx>