summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBud Brown <bud.brown@redhat.com>2011-03-23 20:47:11 +0100
committerJens Axboe <jaxboe@fusionio.com>2011-03-23 20:47:11 +0100
commit1ddd5049545e0aa1a0ed19bca4d9c9c3ce1ac8a2 (patch)
tree886479fd40af9249da1076a137536fbcfa32edbf
parentf0ff1357ce391265edbf844792da7da9a694f4bd (diff)
downloadlinux-3.10-1ddd5049545e0aa1a0ed19bca4d9c9c3ce1ac8a2.tar.gz
linux-3.10-1ddd5049545e0aa1a0ed19bca4d9c9c3ce1ac8a2.tar.bz2
linux-3.10-1ddd5049545e0aa1a0ed19bca4d9c9c3ce1ac8a2.zip
cciss: fix lost command issue
Under certain workloads a command may seem to get lost. IOW, the Smart Array thinks all commands have been completed but we still have commands in our completion queue. This may lead to system instability, filesystems going read-only, or even panics depending on the affected filesystem. We add an extra read to force the write to complete. Testing shows this extra read avoids the problem. Signed-off-by: Mike Miller <mike.miller@hp.com> Cc: stable@kernel.org Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
-rw-r--r--drivers/block/cciss.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h
index 579f7491849..554bbd907d1 100644
--- a/drivers/block/cciss.h
+++ b/drivers/block/cciss.h
@@ -222,6 +222,7 @@ static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c)
h->ctlr, c->busaddr);
#endif /* CCISS_DEBUG */
writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET);
+ readl(h->vaddr + SA5_REQUEST_PORT_OFFSET);
h->commands_outstanding++;
if ( h->commands_outstanding > h->max_outstanding)
h->max_outstanding = h->commands_outstanding;