summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBud Brown <bud.brown@redhat.com>2011-03-23 20:47:11 +0100
committerAK <andi@firstfloor.org>2011-03-31 11:58:49 -0700
commitd6b391f4879ddcc92f3f46dca793aaaa2cb1a84e (patch)
tree8922bc3816c56031a842670ecd50d11b26e4b29d
parent7d90e50de05ac6589b9109039fa15b778522c62a (diff)
cciss: fix lost command issue
commit 1ddd5049545e0aa1a0ed19bca4d9c9c3ce1ac8a2 upstream. 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> Signed-off-by: Jens Axboe <jaxboe@fusionio.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> Signed-off-by: Andi Kleen <ak@linux.intel.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 c5d411174db0..37a2d4fb01d8 100644
--- a/drivers/block/cciss.h
+++ b/drivers/block/cciss.h
@@ -173,6 +173,7 @@ static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c)
printk("Sending %x - down to controller\n", 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;