diff options
author | Tejun Heo <tj@kernel.org> | 2015-02-09 07:54:41 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2015-02-09 07:54:41 -0500 |
commit | b12aa1f25e1da7e23fa44f646ac46e41366cfc6c (patch) | |
tree | 465be1cfceaa37861f5629821e1be2559ba39cfb /drivers/ata/libata-sff.c | |
parent | f627cfdeb7d07df7d7ad2e6ebe59f25d8af4212e (diff) | |
parent | 09c32aaa3683cbcb6c2787a42f87630dff37d2a5 (diff) | |
download | lwn-b12aa1f25e1da7e23fa44f646ac46e41366cfc6c.tar.gz lwn-b12aa1f25e1da7e23fa44f646ac46e41366cfc6c.zip |
Merge branch 'for-3.19-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata into for-3.20
09c32aaa3683 ("ahci_xgene: Fix the dma state machine lockup for the
ATA_CMD_SMART PIO mode command.") missed 3.19 release. Fold it into
for-3.20.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index db90aa35cb71..2e86e3b85266 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -1333,7 +1333,19 @@ void ata_sff_flush_pio_task(struct ata_port *ap) DPRINTK("ENTER\n"); cancel_delayed_work_sync(&ap->sff_pio_task); + + /* + * We wanna reset the HSM state to IDLE. If we do so without + * grabbing the port lock, critical sections protected by it which + * expect the HSM state to stay stable may get surprised. For + * example, we may set IDLE in between the time + * __ata_sff_port_intr() checks for HSM_ST_IDLE and before it calls + * ata_sff_hsm_move() causing ata_sff_hsm_move() to BUG(). + */ + spin_lock_irq(ap->lock); ap->hsm_task_state = HSM_ST_IDLE; + spin_unlock_irq(ap->lock); + ap->sff_pio_task_link = NULL; if (ata_msg_ctl(ap)) |