On Fri, 2017-06-23 at 15:02 +0200, Hannes Reinecke wrote:
> diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c
> index 227dd2c..187bfaf 100644
> --- a/drivers/scsi/eata.c
> +++ b/drivers/scsi/eata.c
> @@ -507,7 +507,7 @@
>  static int eata2x_release(struct Scsi_Host *);
>  static int eata2x_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
>  static int eata2x_eh_abort(struct scsi_cmnd *);
> -static int eata2x_eh_host_reset(struct scsi_cmnd *);
> +static int eata2x_eh_host_reset(struct Scsi_Host *);
>  static int eata2x_bios_param(struct scsi_device *, struct block_device *,
>                            sector_t, int *);
>  static int eata2x_slave_configure(struct scsi_device *);
> @@ -1896,21 +1896,16 @@ static int eata2x_eh_abort(struct scsi_cmnd *SCarg)
>       panic("%s: abort, mbox %d, invalid cp_stat.\n", ha->board_name, i);
>  }
>  
> -static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
> +static int eata2x_eh_host_reset(struct Scsi_Host *shost)
>  {
>       unsigned int i, time, k, c, limit = 0;
> -     int arg_done = 0;
>       struct scsi_cmnd *SCpnt;
> -     struct Scsi_Host *shost = SCarg->device->host;
>       struct hostdata *ha = (struct hostdata *)shost->hostdata;
>  
> -     scmd_printk(KERN_INFO, SCarg, "reset, enter.\n");
> +     shost_printk(KERN_INFO, shost, "reset, enter.\n");
>  
>       spin_lock_irq(shost->host_lock);
>  
> -     if (SCarg->host_scribble == NULL)
> -             printk("%s: reset, inactive.\n", ha->board_name);
> -
>       if (ha->in_reset) {
>               printk("%s: reset, exit, already in reset.\n", ha->board_name);
>               spin_unlock_irq(shost->host_lock);
> @@ -1967,9 +1962,6 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
>               if (SCpnt->scsi_done == NULL)
>                       panic("%s: reset, mbox %d, SCpnt->scsi_done == NULL.\n",
>                             ha->board_name, i);
> -
> -             if (SCpnt == SCarg)
> -                     arg_done = 1;
>       }
>  
>       if (do_dma(shost->io_port, 0, RESET_PIO)) {

Please isolate the "arg_done" removal into a separate patch.

> @@ -865,23 +858,6 @@ static int __ips_eh_reset(struct scsi_cmnd *SC)
>       if (!ha->active)
>               return (FAILED);
>  
> -     /* See if the command is on the copp queue */
> -     item = ha->copp_waitlist.head;
> -     while ((item) && (item->scsi_cmd != SC))
> -             item = item->next;
> -
> -     if (item) {
> -             /* Found it */
> -             ips_removeq_copp(&ha->copp_waitlist, item);
> -             return (SUCCESS);
> -     }
> -
> -     /* See if the command is on the wait queue */
> -     if (ips_removeq_wait(&ha->scb_waitlist, SC)) {
> -             /* command not sent yet */
> -             return (SUCCESS);
> -     }
> -
>       /* An explanation for the casual observer:                              
> */
>       /* Part of the function of a RAID controller is automatic error         
> */
>       /* detection and recovery.  As such, the only problem that physically   
> */

Shouldn't this change be isolated into a separate patch too?

> diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
> index 3c63c29..906570a 100644
> --- a/drivers/scsi/megaraid.c
> +++ b/drivers/scsi/megaraid.c
> @@ -1887,13 +1887,13 @@ static DEF_SCSI_QCMD(megaraid_queue)
>  
>  
>  static int
> -megaraid_reset(struct scsi_cmnd *cmd)
> +megaraid_reset(struct Scsi_Host *shost)
>  {
>       adapter_t       *adapter;
>       megacmd_t       mc;
>       int             rval;
>  
> -     adapter = (adapter_t *)cmd->device->host->hostdata;
> +     adapter = (adapter_t *)shost->hostdata;
>  
>  #if MEGA_HAVE_CLUSTERING
>       mc.cmd = MEGA_CLUSTER_CMD;
> @@ -1909,7 +1909,7 @@ static DEF_SCSI_QCMD(megaraid_queue)
>  
>       spin_lock_irq(&adapter->lock);
>  
> -     rval =  megaraid_abort_and_reset(adapter, cmd, SCB_RESET);
> +     rval =  megaraid_abort_and_reset(adapter, NULL, SCB_RESET);
>  
>       /*
>        * This is required here to complete any completed requests
> @@ -1948,7 +1948,7 @@ static DEF_SCSI_QCMD(megaraid_queue)
>  
>               scb = list_entry(pos, scb_t, list);
>  
> -             if (scb->cmd == cmd) { /* Found command */
> +             if (!cmd || scb->cmd == cmd) { /* Found command */
>  
>                       scb->state |= aor;
>  
> @@ -1977,7 +1977,7 @@ static DEF_SCSI_QCMD(megaraid_queue)
>                                       "%s-[%x], driver owner\n",
>                                       (aor==SCB_ABORT) ? "ABORTING":"RESET",
>                                       scb->idx);
> -
> +                             cmd = scb->cmd;
>                               mega_free_scb(adapter, scb);

This looks weird. Assigning scb->cmd to cmd will cause 
megaraid_abort_and_reset()
to abort or reset the first command on pending_list if the cmd argument is NULL.
If the cmd argument is NULL, shouldn't all commands on pending_list be aborted 
or
reset?

> -static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
> +static int megasas_reset_bus_host(struct Scsi_Host *shost)
>  {
>       int ret;
>       struct megasas_instance *instance;
>  
> -     instance = (struct megasas_instance *)scmd->device->host->hostdata;
> +     instance = (struct megasas_instance *)shost->hostdata;
>  
> -     scmd_printk(KERN_INFO, scmd,
> +     shost_printk(KERN_INFO, shost,
>               "Controller reset is requested due to IO timeout\n"
> -             "SCSI command pointer: (%p)\t SCSI host state: %d\t"
> +             "SCSI host state: %d\t"
>               " SCSI host busy: %d\t FW outstanding: %d\n",
> -             scmd, scmd->device->host->shost_state,
> -             atomic_read((atomic_t *)&scmd->device->host->host_busy),
> +             shost->shost_state,
> +             atomic_read((atomic_t *)&shost->host_busy),
>               atomic_read(&instance->fw_outstanding));

Since host_busy already has type atomic_t and since you have to touch this
code anyway, how about leaving out the (atomic_t *) cast?

> --- a/drivers/scsi/qla1280.c
> +++ b/drivers/scsi/qla1280.c
> @@ -1047,13 +1047,28 @@ static void qla1280_mailbox_timeout(unsigned long 
> __data)
>   *     Reset the specified adapter (both channels)
>   **************************************************************************/
>  static int
> -qla1280_eh_adapter_reset(struct scsi_cmnd *cmd)
> +qla1280_eh_adapter_reset(struct Scsi_Host *shost)
>  {
>       int rc;
> +     struct scsi_qla_host *ha = (struct scsi_qla_host *)shost->hostdata;
>  
> -     spin_lock_irq(cmd->device->host->host_lock);
> -     rc = qla1280_error_action(cmd, ADAPTER_RESET);
> -     spin_unlock_irq(cmd->device->host->host_lock);
> +     spin_lock_irq(shost->host_lock);
> +     if (qla1280_verbose) {
> +             printk(KERN_INFO
> +                    "scsi(%ld): Issued ADAPTER RESET\n",
> +                    ha->host_no);
> +             printk(KERN_INFO "scsi(%ld): I/O processing will "
> +                    "continue automatically\n", ha->host_no);
> +     }
> +     ha->flags.reset_active = 1;
> +
> +     if (qla1280_abort_isp(ha) != 0) {       /* it's dead */
> +             rc = FAILED;
> +     }
> +
> +     ha->flags.reset_active = 0;
> +
> +     spin_unlock_irq(shost->host_lock);
>  
>       return rc;
>  }

This change introduces some code duplication. Have you considered to isolate
the ADAPTER_RESET code from qla1280_error_action() into a new function in a
separate patch such that that new function can be called here instead of
duplicating the ADAPTER_RESET code?

Bart.

Reply via email to