Skip to content

Commit 793bf19

Browse files
TJ Adamsdamien-lemoal
authored andcommitted
ata: libata-core: Allow capacity transition to zero for locked drives
Commit 91842ed ("ata: libata-core: Set capacity to zero for a security locked drive") introduced setting the device capacity (n_sectors) to zero in ata_dev_configure() if the drive is security locked. However, during runtime revalidation, ata_dev_revalidate() compares the new capacity (now 0) with the old capacity (>0) and detects a mismatch. Since it does not consider the locked status, it returns -ENODEV. This revalidation failure can occur when doing a reset of the PHY (e.g. hard reset) for a controller that has I/Os in flight. The timed out I/Os trigger the SCSI Error Handling (EH) path, which in turn invokes libata device revalidation. If the drive is locked at runtime (e.g. it lost power during reset and relocked), revalidation sees the capacity transition to zero and fails, eventually disabling the device. Fix this by allowing the capacity transition to zero in ata_dev_revalidate() if the drive is reported as security locked by ata_id_is_locked(). Fixes: 91842ed ("ata: libata-core: Set capacity to zero for a security locked drive") Cc: stable@vger.kernel.org Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Terrence Adams <tadamsjr@google.com> Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
1 parent 917d0a4 commit 793bf19

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

drivers/ata/libata-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3992,7 +3992,7 @@ int ata_dev_revalidate(struct ata_device *dev, unsigned int new_class,
39923992

39933993
/* verify n_sectors hasn't changed */
39943994
if (dev->class != ATA_DEV_ATA || !n_sectors ||
3995-
dev->n_sectors == n_sectors)
3995+
dev->n_sectors == n_sectors || ata_id_is_locked(dev->id))
39963996
return 0;
39973997

39983998
/* n_sectors has changed */

0 commit comments

Comments
 (0)