aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ata/libata-eh.c11
-rw-r--r--include/linux/libata.h1
2 files changed, 12 insertions, 0 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index c0e9a42e6ae7..1f84e40fa6ae 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2063,6 +2063,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
2063 ata_prereset_fn_t prereset, ata_reset_fn_t softreset, 2063 ata_prereset_fn_t prereset, ata_reset_fn_t softreset,
2064 ata_reset_fn_t hardreset, ata_postreset_fn_t postreset) 2064 ata_reset_fn_t hardreset, ata_postreset_fn_t postreset)
2065{ 2065{
2066 struct ata_port *ap = link->ap;
2066 struct ata_eh_context *ehc = &link->eh_context; 2067 struct ata_eh_context *ehc = &link->eh_context;
2067 unsigned int *classes = ehc->classes; 2068 unsigned int *classes = ehc->classes;
2068 int verbose = !(ehc->i.flags & ATA_EHI_QUIET); 2069 int verbose = !(ehc->i.flags & ATA_EHI_QUIET);
@@ -2071,9 +2072,14 @@ int ata_eh_reset(struct ata_link *link, int classify,
2071 unsigned long deadline; 2072 unsigned long deadline;
2072 unsigned int action; 2073 unsigned int action;
2073 ata_reset_fn_t reset; 2074 ata_reset_fn_t reset;
2075 unsigned long flags;
2074 int rc; 2076 int rc;
2075 2077
2076 /* about to reset */ 2078 /* about to reset */
2079 spin_lock_irqsave(ap->lock, flags);
2080 ap->pflags |= ATA_PFLAG_RESETTING;
2081 spin_unlock_irqrestore(ap->lock, flags);
2082
2077 ata_eh_about_to_do(link, NULL, ehc->i.action & ATA_EH_RESET_MASK); 2083 ata_eh_about_to_do(link, NULL, ehc->i.action & ATA_EH_RESET_MASK);
2078 2084
2079 /* Determine which reset to use and record in ehc->i.action. 2085 /* Determine which reset to use and record in ehc->i.action.
@@ -2231,6 +2237,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
2231 out: 2237 out:
2232 /* clear hotplug flag */ 2238 /* clear hotplug flag */
2233 ehc->i.flags &= ~ATA_EHI_HOTPLUGGED; 2239 ehc->i.flags &= ~ATA_EHI_HOTPLUGGED;
2240
2241 spin_lock_irqsave(ap->lock, flags);
2242 ap->pflags &= ~ATA_PFLAG_RESETTING;
2243 spin_unlock_irqrestore(ap->lock, flags);
2244
2234 return rc; 2245 return rc;
2235} 2246}
2236 2247
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 751aabc21a3e..529af9fbed53 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -210,6 +210,7 @@ enum {
210 ATA_PFLAG_UNLOADING = (1 << 5), /* module is unloading */ 210 ATA_PFLAG_UNLOADING = (1 << 5), /* module is unloading */
211 ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */ 211 ATA_PFLAG_SCSI_HOTPLUG = (1 << 6), /* SCSI hotplug scheduled */
212 ATA_PFLAG_INITIALIZING = (1 << 7), /* being initialized, don't touch */ 212 ATA_PFLAG_INITIALIZING = (1 << 7), /* being initialized, don't touch */
213 ATA_PFLAG_RESETTING = (1 << 8), /* reset in progress */
213 214
214 ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ 215 ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */
215 ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ 216 ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */