Commit aac173e9 authored by David Jeffery's avatar David Jeffery Committed by Martin K. Petersen

scsi: vmw_pvscsi: return SUCCESS for successful command aborts

The vmw_pvscsi driver reports most successful aborts as FAILED to the
scsi error handler.  This is do to a misunderstanding of how
completion_done() works and its interaction with a successful wait using
wait_for_completion_timeout().  The vmw_pvscsi driver is expecting
completion_done() to always return true if complete() has been called on
the completion structure.  But completion_done() returns true after
complete() has been called only if no function like
wait_for_completion_timeout() has seen the completion and cleared it as
part of successfully waiting for the completion.

Instead of using completion_done(), vmw_pvscsi should just use the
return value from wait_for_completion_timeout() to know if the wait
timed out or not.

[mkp: bumped driver version per request]
Signed-off-by: default avatarDavid Jeffery <djeffery@redhat.com>
Reviewed-by: default avatarLaurence Oberman <loberman@redhat.com>
Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
Acked-by: default avatarJim Gill <jgill@vmware.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 6d3a56ed
...@@ -793,6 +793,7 @@ static int pvscsi_abort(struct scsi_cmnd *cmd) ...@@ -793,6 +793,7 @@ static int pvscsi_abort(struct scsi_cmnd *cmd)
unsigned long flags; unsigned long flags;
int result = SUCCESS; int result = SUCCESS;
DECLARE_COMPLETION_ONSTACK(abort_cmp); DECLARE_COMPLETION_ONSTACK(abort_cmp);
int done;
scmd_printk(KERN_DEBUG, cmd, "task abort on host %u, %p\n", scmd_printk(KERN_DEBUG, cmd, "task abort on host %u, %p\n",
adapter->host->host_no, cmd); adapter->host->host_no, cmd);
...@@ -824,10 +825,10 @@ static int pvscsi_abort(struct scsi_cmnd *cmd) ...@@ -824,10 +825,10 @@ static int pvscsi_abort(struct scsi_cmnd *cmd)
pvscsi_abort_cmd(adapter, ctx); pvscsi_abort_cmd(adapter, ctx);
spin_unlock_irqrestore(&adapter->hw_lock, flags); spin_unlock_irqrestore(&adapter->hw_lock, flags);
/* Wait for 2 secs for the completion. */ /* Wait for 2 secs for the completion. */
wait_for_completion_timeout(&abort_cmp, msecs_to_jiffies(2000)); done = wait_for_completion_timeout(&abort_cmp, msecs_to_jiffies(2000));
spin_lock_irqsave(&adapter->hw_lock, flags); spin_lock_irqsave(&adapter->hw_lock, flags);
if (!completion_done(&abort_cmp)) { if (!done) {
/* /*
* Failed to abort the command, unmark the fact that it * Failed to abort the command, unmark the fact that it
* was requested to be aborted. * was requested to be aborted.
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <linux/types.h> #include <linux/types.h>
#define PVSCSI_DRIVER_VERSION_STRING "1.0.6.0-k" #define PVSCSI_DRIVER_VERSION_STRING "1.0.7.0-k"
#define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128 #define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment