From: Damien Le Moal Date: Thu, 5 Sep 2024 02:00:59 +0000 (+0900) Subject: ata: libata-scsi: Improve ata_scsi_handle_link_detach() X-Git-Tag: v6.12-rc1~127^2~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a16951510fae8fa9b934673404c4fc990d124ccd;p=thirdparty%2Fkernel%2Flinux.git ata: libata-scsi: Improve ata_scsi_handle_link_detach() A struct ata_device flags should always be set and cleared with the device port locked. Testing for a flag should thus also be done while holding the device port lock. In accordance to this principle, modify ata_scsi_handle_link_detach() to test and clear the ATA_DFLAG_DETACHED flag while holding the device port lock. Signed-off-by: Damien Le Moal Reviewed-by: Niklas Cassel --- diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 3a442f564b0d0..6bd7ab27fcbb2 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -4605,10 +4605,12 @@ static void ata_scsi_handle_link_detach(struct ata_link *link) ata_for_each_dev(dev, link, ALL) { unsigned long flags; - if (!(dev->flags & ATA_DFLAG_DETACHED)) + spin_lock_irqsave(ap->lock, flags); + if (!(dev->flags & ATA_DFLAG_DETACHED)) { + spin_unlock_irqrestore(ap->lock, flags); continue; + } - spin_lock_irqsave(ap->lock, flags); dev->flags &= ~ATA_DFLAG_DETACHED; spin_unlock_irqrestore(ap->lock, flags);