drivers/ata/libata-eh.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
If a device is hot-unplugged or otherwise disappears during error handling,
ata_eh_reset() may fail with -ENODEV. Currently, the error handler will
continue to retry the reset operation up to max_tries times.
Prevent unnecessary reset retries by exiting the loop early when
ata_eh_reset() returns -ENODEV.
Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
---
drivers/ata/libata-eh.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 23be85418b3b..e97a842005e9 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -3171,7 +3171,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
sata_scr_read(link, SCR_STATUS, &sstatus))
rc = -ERESTART;
- if (try >= max_tries) {
+ if (try >= max_tries || rc == -ENODEV) {
/*
* Thaw host port even if reset failed, so that the port
* can be retried on the next phy event. This risks
--
2.53.0.1185.g05d4b7b318-goog
On Wed, Apr 01, 2026 at 06:11:01PM -0700, Igor Pylypiv wrote: > If a device is hot-unplugged or otherwise disappears during error handling, > ata_eh_reset() may fail with -ENODEV. Currently, the error handler will > continue to retry the reset operation up to max_tries times. > > Prevent unnecessary reset retries by exiting the loop early when > ata_eh_reset() returns -ENODEV. ata_do_reset() ? The loop is inside ata_eh_reset(), so it sounds a bit weird to exit the loop early if the function itself returns -ENODEV. I guess you could also write it like: Prevent unnecessary reset retries by exiting the loop early when a callee in ata_eh_reset() returns -ENODEV. Kind regards, Niklas
On Thu, Apr 02, 2026 at 10:55:41AM +0200, Niklas Cassel wrote: > On Wed, Apr 01, 2026 at 06:11:01PM -0700, Igor Pylypiv wrote: > > If a device is hot-unplugged or otherwise disappears during error handling, > > ata_eh_reset() may fail with -ENODEV. Currently, the error handler will > > continue to retry the reset operation up to max_tries times. > > > > Prevent unnecessary reset retries by exiting the loop early when > > ata_eh_reset() returns -ENODEV. > > ata_do_reset() ? > > The loop is inside ata_eh_reset(), so it sounds a bit weird to exit > the loop early if the function itself returns -ENODEV. > Thank you for catching this, Niklas! Yes, it should be ata_do_reset(). I'll send a V2 to fix the function name. Thanks, Igor > > I guess you could also write it like: > Prevent unnecessary reset retries by exiting the loop early when > a callee in ata_eh_reset() returns -ENODEV. > > > Kind regards, > Niklas
On 2026/04/02 10:11, Igor Pylypiv wrote: > If a device is hot-unplugged or otherwise disappears during error handling, > ata_eh_reset() may fail with -ENODEV. Currently, the error handler will > continue to retry the reset operation up to max_tries times. > > Prevent unnecessary reset retries by exiting the loop early when > ata_eh_reset() returns -ENODEV. > > Signed-off-by: Igor Pylypiv <ipylypiv@google.com> Looks good. Reviewed-by: Damien Le Moal <dlemoal@kernel.org> -- Damien Le Moal Western Digital Research
© 2016 - 2026 Red Hat, Inc.