> -----Original Message-----
> From: Hannes Reinecke [mailto:h...@suse.de]
> Sent: Wednesday, 01 October, 2014 1:23 AM
> To: James Bottomley
> Cc: Christoph Hellwig; linux-scsi@vger.kernel.org; Elliott, Robert (Server
> Storage); Hannes Reinecke
> Subject: [PATCH 24/24] scsi_error: document scsi_try_to_abort_cmd
> 
> scsi_try_to_abort_cmd() should only return
> SUCCESS or FAILED. So document that in the
> function description and simplify the
> logging message.
> 
> Suggested-by: Christoph Hellwig <h...@infradead.org>
> Cc: Robert Elliott <elli...@hp.com>
> Signed-off-by: Hannes Reinecke <h...@suse.de>
> ---
>  drivers/scsi/scsi_error.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
> index a41ef5b..75dd203 100644
> --- a/drivers/scsi/scsi_error.c
> +++ b/drivers/scsi/scsi_error.c
> @@ -157,8 +157,7 @@ scmd_eh_abort_handler(struct work_struct *work)
>               } else {
>                       SCSI_LOG_ERROR_RECOVERY(3,
>                               scmd_printk(KERN_INFO, scmd,
> -                                         "scmd %p abort failed, rtn %d\n",
> -                                         scmd, rtn));
> +                                         "scmd %p abort failed\n", scmd));
>               }
>       }
> 
> @@ -869,7 +868,22 @@ static int scsi_try_bus_device_reset(struct scsi_cmnd
> *scmd)
>       return rtn;
>  }
> 
> -static int scsi_try_to_abort_cmd(struct scsi_host_template *hostt, struct
> scsi_cmnd *scmd)
> +/**
> + * scsi_try_to_abort_cmd - Ask host to abort a SCSI command
> + * @scmd:    SCSI cmd used to send a target reset
> + *
> + * Return value:
> + *   SUCCESS or FAILED
> + *
> + * Notes:
> + *    SUCCESS does not necessarily indicate that the command
> + *    has been aborted; it only indicates that the LLDDs
> + *    has cleared all references to that command.
> + *    LLDDs should return FAILED only if an abort was required
> + *    but could not be executed.
> + */
> +static int scsi_try_to_abort_cmd(struct scsi_host_template *hostt,
> +                              struct scsi_cmnd *scmd)
>  {
>       if (!hostt->eh_abort_handler)
>               return FAILED;

Since the rest of that function is just:
        return hostt->eh_abort_handler(scmd);

this relies on the LLD to use only those values:
#define SUCCESS         0x2002
#define FAILED          0x2003

which is hard to ensure.

Randomly picking on one, megaraid.c registers this
function:
        .eh_abort_handler               = megaraid_abort,

megaraid_abort returns the return code from 
megaraid_abort_and_reset, which returns TRUE or FALSE, 
not SUCCESS and FAILED.

Printing the return value helps expose such problems
(if the code path is exercised).

---
Rob Elliott    HP Server Storage




--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to