summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorBud Brown <bud.brown@redhat.com>2011-03-23 20:47:11 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-14 16:52:47 -0700
commit22c6c0e68cebc09d32e53d4034805d130f500df5 (patch)
tree87a11e5dd39e01b3fffc76de23d4ee3375017a6a /drivers/block
parent5a586ee1524d194a8e779cd6c0bceb2b3aab3c38 (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>
Diffstat (limited to 'drivers/block')
-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 1d95db254069..b8901fff9f8c 100644
--- a/drivers/block/cciss.h
+++ b/drivers/block/cciss.h
@@ -181,6 +181,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;