diff options
-rw-r--r-- | drivers/ata/libata-eh.c | 11 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
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 */ |