On Tue, Feb 21, 2017 at 01:27:08PM +0100, Hannes Reinecke wrote:
> ioctl passthrough commands require a SCSIIO smid, but cannot
> easily integrate with the block layer. But the driver already
> has reserved some SCSIIO smids and we're only ever allowing
> one ioctl command at a time we can use the first reserved smid
> for ioctl commands.
> 
> Signed-off-by: Hannes Reinecke <h...@suse.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c | 11 ++++++++---
>  drivers/scsi/mpt3sas/mpt3sas_ctl.c  | 10 ++--------
>  2 files changed, 10 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
> b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index 3f9148c..0875e58 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -2432,7 +2432,9 @@ struct scsiio_tracker *
>               ioc->scsi_lookup[i].cb_idx = 0xFF;
>               ioc->scsi_lookup[i].scmd = NULL;
>               ioc->scsi_lookup[i].direct_io = 0;
> -             list_add(&ioc->scsi_lookup[i].tracker_list, &ioc->free_list);
> +             if (i < ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT)
> +                     list_add(&ioc->scsi_lookup[i].tracker_list,
> +                              &ioc->free_list);
>               spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
>  
>               _base_recovery_check(ioc);
> @@ -5174,8 +5176,11 @@ struct scsiio_tracker *
>               ioc->scsi_lookup[i].smid = smid;
>               ioc->scsi_lookup[i].scmd = NULL;
>               ioc->scsi_lookup[i].direct_io = 0;
> -             list_add_tail(&ioc->scsi_lookup[i].tracker_list,
> -                 &ioc->free_list);
> +             if (i < ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT)
> +                     list_add_tail(&ioc->scsi_lookup[i].tracker_list,
> +                                   &ioc->free_list);
> +             else
> +                     INIT_LIST_HEAD(&ioc->lookup[i].tracker_list);

Why the INIT_LIST_HEAD?  We never do a list_empty check on tracker_list,
so it's rather pointless.

> +             smid = ioc->scsiio_depth - ioc->host->reserved_cmds;

ioc->host->reserved_cmds is never set at this point.  But given that only
the smids < ioc->scsiio_depth are used it's doing the right thing
if you just remove the "- ioc->host->reserved_cmds" entirely.

Otherwise this looks fine to me.

Reply via email to