Re: [PATCH v2 09/44] aacraid: Move the SCSI pointer to private command data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Feb 8, 2022, at 9:24 AM, Bart Van Assche <bvanassche@xxxxxxx> wrote:
> 
> Set .cmd_size in the SCSI host template instead of using the SCSI pointer
> from struct scsi_cmnd. This patch prepares for removal of the SCSI pointer
> from struct scsi_cmnd.
> 
> Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx>
> ---
> drivers/scsi/aacraid/aachba.c   | 43 ++++++++++++++++++---------------
> drivers/scsi/aacraid/aacraid.h  | 24 ++++++++++++++----
> drivers/scsi/aacraid/comminit.c |  2 +-
> drivers/scsi/aacraid/linit.c    | 21 ++++++++--------
> 4 files changed, 54 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index b04d039da276..81462f4ddb90 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -338,7 +338,7 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
> 		aac_fib_complete(fibptr);
> 		return 0;
> 	}
> -	scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_MIDLEVEL;
> 	device = scsicmd->device;
> 	if (unlikely(!device)) {
> 		dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
> @@ -592,7 +592,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
> 
> 	aac_fib_init(cmd_fibcontext);
> 	dinfo = (struct aac_get_name *) fib_data(cmd_fibcontext);
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 
> 	dinfo->command = cpu_to_le32(VM_ContainerConfig);
> 	dinfo->type = cpu_to_le32(CT_READ_NAME);
> @@ -634,14 +634,15 @@ static void _aac_probe_container2(void * context, struct fib * fibptr)
> {
> 	struct fsa_dev_info *fsa_dev_ptr;
> 	int (*callback)(struct scsi_cmnd *);
> -	struct scsi_cmnd * scsicmd = (struct scsi_cmnd *)context;
> +	struct scsi_cmnd *scsicmd = context;
> +	struct aac_cmd_priv *cmd_priv = aac_priv(scsicmd);
> 	int i;
> 
> 
> 	if (!aac_valid_context(scsicmd, fibptr))
> 		return;
> 
> -	scsicmd->SCp.Status = 0;
> +	cmd_priv->status = 0;
> 	fsa_dev_ptr = fibptr->dev->fsa_dev;
> 	if (fsa_dev_ptr) {
> 		struct aac_mount * dresp = (struct aac_mount *) fib_data(fibptr);
> @@ -679,12 +680,12 @@ static void _aac_probe_container2(void * context, struct fib * fibptr)
> 		}
> 		if ((fsa_dev_ptr->valid & 1) == 0)
> 			fsa_dev_ptr->valid = 0;
> -		scsicmd->SCp.Status = le32_to_cpu(dresp->count);
> +		cmd_priv->status = le32_to_cpu(dresp->count);
> 	}
> 	aac_fib_complete(fibptr);
> 	aac_fib_free(fibptr);
> -	callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr);
> -	scsicmd->SCp.ptr = NULL;
> +	callback = cmd_priv->callback;
> +	cmd_priv->callback = NULL;
> 	(*callback)(scsicmd);
> 	return;
> }
> @@ -722,7 +723,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
> 
> 	dinfo->count = cpu_to_le32(scmd_id(scsicmd));
> 	dinfo->type = cpu_to_le32(FT_FILESYS);
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 
> 	status = aac_fib_send(ContainerCommand,
> 			  fibptr,
> @@ -743,6 +744,7 @@ static void _aac_probe_container1(void * context, struct fib * fibptr)
> 
> static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(struct scsi_cmnd *))
> {
> +	struct aac_cmd_priv *cmd_priv = aac_priv(scsicmd);
> 	struct fib * fibptr;
> 	int status = -ENOMEM;
> 
> @@ -761,8 +763,8 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
> 
> 		dinfo->count = cpu_to_le32(scmd_id(scsicmd));
> 		dinfo->type = cpu_to_le32(FT_FILESYS);
> -		scsicmd->SCp.ptr = (char *)callback;
> -		scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +		cmd_priv->callback = callback;
> +		cmd_priv->owner = AAC_OWNER_FIRMWARE;
> 
> 		status = aac_fib_send(ContainerCommand,
> 			  fibptr,
> @@ -778,7 +780,7 @@ static int _aac_probe_container(struct scsi_cmnd * scsicmd, int (*callback)(stru
> 			return 0;
> 
> 		if (status < 0) {
> -			scsicmd->SCp.ptr = NULL;
> +			cmd_priv->callback = NULL;
> 			aac_fib_complete(fibptr);
> 			aac_fib_free(fibptr);
> 		}
> @@ -817,6 +819,7 @@ static void aac_probe_container_scsi_done(struct scsi_cmnd *scsi_cmnd)
> int aac_probe_container(struct aac_dev *dev, int cid)
> {
> 	struct scsi_cmnd *scsicmd = kzalloc(sizeof(*scsicmd), GFP_KERNEL);
> +	struct aac_cmd_priv *cmd_priv = aac_priv(scsicmd);
> 	struct scsi_device *scsidev = kzalloc(sizeof(*scsidev), GFP_KERNEL);
> 	int status;
> 
> @@ -835,7 +838,7 @@ int aac_probe_container(struct aac_dev *dev, int cid)
> 		while (scsicmd->device == scsidev)
> 			schedule();
> 	kfree(scsidev);
> -	status = scsicmd->SCp.Status;
> +	status = cmd_priv->status;
> 	kfree(scsicmd);
> 	return status;
> }
> @@ -1128,7 +1131,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
> 	dinfo->command = cpu_to_le32(VM_ContainerConfig);
> 	dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID);
> 	dinfo->cid = cpu_to_le32(scmd_id(scsicmd));
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 
> 	status = aac_fib_send(ContainerCommand,
> 		  cmd_fibcontext,
> @@ -2486,7 +2489,7 @@ static int aac_read(struct scsi_cmnd * scsicmd)
> 	 *	Alocate and initialize a Fib
> 	 */
> 	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 	status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
> 
> 	/*
> @@ -2577,7 +2580,7 @@ static int aac_write(struct scsi_cmnd * scsicmd)
> 	 *	Allocate and initialize a Fib then setup a BlockWrite command
> 	 */
> 	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 	status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
> 
> 	/*
> @@ -2660,7 +2663,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
> 	synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
> 	synchronizecmd->count =
> 	     cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 
> 	/*
> 	 *	Now send the Fib to the adapter
> @@ -2736,7 +2739,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
> 	pmcmd->cid = cpu_to_le32(sdev_id(sdev));
> 	pmcmd->parm = (scsicmd->cmnd[1] & 1) ?
> 		cpu_to_le32(CT_PM_UNIT_IMMEDIATE) : 0;
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 
> 	/*
> 	 *	Now send the Fib to the adapter
> @@ -3695,7 +3698,7 @@ void aac_hba_callback(void *context, struct fib *fibptr)
> 	aac_fib_complete(fibptr);
> 
> 	if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF)
> -		scsicmd->SCp.sent_command = 1;
> +		aac_priv(scsicmd)->sent_command = 1;
> 	else
> 		aac_scsi_done(scsicmd);
> }
> @@ -3725,7 +3728,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
> 	 *	Allocate and initialize a Fib then setup a BlockWrite command
> 	 */
> 	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 	status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
> 
> 	/*
> @@ -3769,7 +3772,7 @@ static int aac_send_hba_fib(struct scsi_cmnd *scsicmd)
> 	if (!cmd_fibcontext)
> 		return -1;
> 
> -	scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
> +	aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE;
> 	status = aac_adapter_hba(cmd_fibcontext, scsicmd);
> 
> 	/*
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 3733df77bc65..f849e7c9d428 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -29,6 +29,7 @@
> #include <linux/completion.h>
> #include <linux/pci.h>
> #include <scsi/scsi_host.h>
> +#include <scsi/scsi_cmnd.h>
> 
> /*------------------------------------------------------------------------------
>  *              D E F I N E S
> @@ -2673,11 +2674,24 @@ static inline void aac_cancel_rescan_worker(struct aac_dev *dev)
> 	cancel_delayed_work_sync(&dev->src_reinit_aif_worker);
> }
> 
> -/* SCp.phase values */
> -#define AAC_OWNER_MIDLEVEL	0x101
> -#define AAC_OWNER_LOWLEVEL	0x102
> -#define AAC_OWNER_ERROR_HANDLER	0x103
> -#define AAC_OWNER_FIRMWARE	0x106
> +enum aac_cmd_owner {
> +	AAC_OWNER_MIDLEVEL	= 0x101,
> +	AAC_OWNER_LOWLEVEL	= 0x102,
> +	AAC_OWNER_ERROR_HANDLER	= 0x103,
> +	AAC_OWNER_FIRMWARE	= 0x106,
> +};
> +
> +struct aac_cmd_priv {
> +	int			(*callback)(struct scsi_cmnd *);
> +	int			status;
> +	enum aac_cmd_owner	owner;
> +	bool			sent_command;
> +};
> +
> +static inline struct aac_cmd_priv *aac_priv(struct scsi_cmnd *cmd)
> +{
> +	return scsi_cmd_priv(cmd);
> +}
> 
> void aac_safw_rescan_worker(struct work_struct *work);
> void aac_src_reinit_aif_worker(struct work_struct *work);
> diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
> index 355b16f0b145..940a6deab38f 100644
> --- a/drivers/scsi/aacraid/comminit.c
> +++ b/drivers/scsi/aacraid/comminit.c
> @@ -276,7 +276,7 @@ static bool wait_for_io_iter(struct scsi_cmnd *cmd, void *data, bool rsvd)
> {
> 	int *active = data;
> 
> -	if (cmd->SCp.phase == AAC_OWNER_FIRMWARE)
> +	if (aac_priv(cmd)->owner == AAC_OWNER_FIRMWARE)
> 		*active = *active + 1;
> 	return true;
> }
> diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
> index a911252075a6..b91b72b923ec 100644
> --- a/drivers/scsi/aacraid/linit.c
> +++ b/drivers/scsi/aacraid/linit.c
> @@ -241,10 +241,9 @@ static struct aac_driver_ident aac_drivers[] = {
> static int aac_queuecommand(struct Scsi_Host *shost,
> 			    struct scsi_cmnd *cmd)
> {
> -	int r = 0;
> -	cmd->SCp.phase = AAC_OWNER_LOWLEVEL;
> -	r = (aac_scsi_cmd(cmd) ? FAILED : 0);
> -	return r;
> +	aac_priv(cmd)->owner = AAC_OWNER_LOWLEVEL;
> +
> +	return aac_scsi_cmd(cmd) ? FAILED : 0;
> }
> 
> /**
> @@ -638,7 +637,7 @@ static bool fib_count_iter(struct scsi_cmnd *scmnd, void *data, bool reserved)
> {
> 	struct fib_count_data *fib_count = data;
> 
> -	switch (scmnd->SCp.phase) {
> +	switch (aac_priv(scmnd)->owner) {
> 	case AAC_OWNER_FIRMWARE:
> 		fib_count->fwcnt++;
> 		break;
> @@ -680,6 +679,7 @@ static int get_num_of_incomplete_fibs(struct aac_dev *aac)
> 
> static int aac_eh_abort(struct scsi_cmnd* cmd)
> {
> +	struct aac_cmd_priv *cmd_priv = aac_priv(cmd);
> 	struct scsi_device * dev = cmd->device;
> 	struct Scsi_Host * host = dev->host;
> 	struct aac_dev * aac = (struct aac_dev *)host->hostdata;
> @@ -732,7 +732,7 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
> 		tmf->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE);
> 
> 		fib->hbacmd_size = sizeof(*tmf);
> -		cmd->SCp.sent_command = 0;
> +		cmd_priv->sent_command = 0;
> 
> 		status = aac_hba_send(HBA_IU_TYPE_SCSI_TM_REQ, fib,
> 				  (fib_callback) aac_hba_callback,
> @@ -744,7 +744,7 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
> 		}
> 		/* Wait up to 15 secs for completion */
> 		for (count = 0; count < 15; ++count) {
> -			if (cmd->SCp.sent_command) {
> +			if (cmd_priv->sent_command) {
> 				ret = SUCCESS;
> 				break;
> 			}
> @@ -784,7 +784,7 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
> 				(fib->callback_data == cmd)) {
> 					fib->flags |=
> 						FIB_CONTEXT_FLAG_TIMED_OUT;
> -					cmd->SCp.phase =
> +					cmd_priv->owner =
> 						AAC_OWNER_ERROR_HANDLER;
> 					ret = SUCCESS;
> 				}
> @@ -811,7 +811,7 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
> 					(command->device == cmd->device)) {
> 					fib->flags |=
> 						FIB_CONTEXT_FLAG_TIMED_OUT;
> -					command->SCp.phase =
> +					aac_priv(command)->owner =
> 						AAC_OWNER_ERROR_HANDLER;
> 					if (command == cmd)
> 						ret = SUCCESS;
> @@ -1058,7 +1058,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)
> 			if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||
> 			    info->devtype != AAC_DEVTYPE_NATIVE_RAW) {
> 				fib->flags |= FIB_CONTEXT_FLAG_EH_RESET;
> -				cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
> +				aac_priv(cmd)->owner = AAC_OWNER_ERROR_HANDLER;
> 			}
> 		}
> 	}
> @@ -1507,6 +1507,7 @@ static struct scsi_host_template aac_driver_template = {
> #endif
> 	.emulated			= 1,
> 	.no_write_same			= 1,
> +	.cmd_size			= sizeof(struct aac_cmd_priv),
> };
> 
> static void __aac_shutdown(struct aac_dev * aac)

Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx>

--
Himanshu Madhani	 Oracle Linux Engineering





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux