libata: fix infinite EH waiting bug
PATCH 1/1 libata: fix infinite EH waiting bug
When EH gives up after repeated exceptions, it doesn't't clear the PENDING bit on exit which leaves PENDING bit set without EH actually scheduled. This makes ata_port_wait_eh() to wait forever makes rmmod hang on such port. Fix it by clearing the flag.
Signed-off-by Tejun Heo <[email protected]>
--- drivers/ata/libata-eh.c | 1 + 1 file changed, 1 insertion(+)
drivers/ata/libata-eh.c +1 -0
@@ -336,6 +336,7 @@ void ata_scsi_error(struct Scsi_Host *host) }ata_port_printk (ap,KERN_ERR ,"EH pending after %d " "tries, giving up\n" ,ATA_EH_MAX_REPEAT ); + ap->pflags &= ~ATA_PFLAG_EH_PENDING ; }/* this run is complete, make sure EH info is clear */
Jeff Garzik
AppliedQuoted 15 lines · Tejun Heo
When EH gives up after repeated exceptions, it doesn't't clear the PENDING bit on exit which leaves PENDING bit set without EH actually scheduled. This makes
ata_port_wait_eh()to wait forever makes rmmod hang on such port. Fix it by clearing the flag.Signed-off-by Tejun Heo <[email protected]>--- drivers/ata/libata-eh.c | 1 + 1 file changed, 1 insertion(+)drivers/ata/libata-eh.c +0
-0
drivers/ata/libata-eh.c void ata_scsi_error(struct Scsi_Host *host) · line 341
Quoted 6 lines
drivers/ata/libata-eh.c +1
-0@@ -336,6 +336,7 @@ void ata_scsi_error(struct Scsi_Host *host) }ata_port_printk (ap,KERN_ERR ,"EH pending after %d " "tries, giving up\n" ,ATA_EH_MAX_REPEAT ); + ap->pflags &= ~ATA_PFLAG_EH_PENDING ; }
applied