Re: [PATCH v2 24/44] libfc: Stop using the SCSI pointer

[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:
> 
> Move the fc_fcp_pkt pointer, the residual length and the SCSI status into
> the new data structure libfc_cmd_priv. This patch prepares for removal of
> the SCSI pointer from struct scsi_cmnd.
> 
> The libfc users have been identified as follows:
> 
> $ git grep -lw 'libfc_host_alloc' | grep -v /libfc
> drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> drivers/scsi/fcoe/fcoe.c
> drivers/scsi/fnic/fnic_main.c
> drivers/scsi/qedf/qedf_main.c
> 
> Cc: Hannes Reinecke <hare@xxxxxxx>
> Cc: Saurav Kashyap <skashyap@xxxxxxxxxxx>
> Cc: Javed Hasan <jhasan@xxxxxxxxxxx>
> Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx>
> ---
> drivers/scsi/bnx2fc/bnx2fc.h      | 10 ++++++++--
> drivers/scsi/bnx2fc/bnx2fc_fcoe.c |  1 +
> drivers/scsi/bnx2fc/bnx2fc_io.c   | 20 ++++++++++----------
> drivers/scsi/fcoe/fcoe.c          |  1 +
> drivers/scsi/fnic/fnic.h          |  1 +
> drivers/scsi/libfc/fc_fcp.c       | 26 +++++++++++---------------
> drivers/scsi/qedf/qedf.h          | 11 ++++++++++-
> drivers/scsi/qedf/qedf_io.c       | 16 ++++++++--------
> drivers/scsi/qedf/qedf_main.c     |  3 ++-
> include/scsi/libfc.h              | 11 +++++++++++
> 10 files changed, 63 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h
> index b4cea8b06ea1..08deed26c51e 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc.h
> +++ b/drivers/scsi/bnx2fc/bnx2fc.h
> @@ -137,8 +137,6 @@
> #define BNX2FC_FW_TIMEOUT		(3 * HZ)
> #define PORT_MAX			2
> 
> -#define CMD_SCSI_STATUS(Cmnd)		((Cmnd)->SCp.Status)
> -
> /* FC FCP Status */
> #define	FC_GOOD				0
> 
> @@ -493,7 +491,15 @@ struct bnx2fc_unsol_els {
> 	struct work_struct unsol_els_work;
> };
> 
> +struct bnx2fc_priv {
> +	struct libfc_cmd_priv libfc_data; /* must be the first member */
> +	struct bnx2fc_cmd *io_req;
> +};
> 
> +static inline struct bnx2fc_priv *bnx2fc_priv(struct scsi_cmnd *cmd)
> +{
> +	return scsi_cmd_priv(cmd);
> +}
> 
> struct bnx2fc_cmd *bnx2fc_cmd_alloc(struct bnx2fc_rport *tgt);
> struct bnx2fc_cmd *bnx2fc_elstm_alloc(struct bnx2fc_rport *tgt, int type);
> diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> index a826456c6075..2d5c71967ee3 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> @@ -2975,6 +2975,7 @@ static struct scsi_host_template bnx2fc_shost_template = {
> 	.track_queue_depth	= 1,
> 	.slave_configure	= bnx2fc_slave_configure,
> 	.shost_groups		= bnx2fc_host_groups,
> +	.cmd_size		= sizeof(struct bnx2fc_priv),
> };
> 
> static struct libfc_function_template bnx2fc_libfc_fcn_templ = {
> diff --git a/drivers/scsi/bnx2fc/bnx2fc_io.c b/drivers/scsi/bnx2fc/bnx2fc_io.c
> index b9114113ee73..a1d0f7d34466 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc_io.c
> +++ b/drivers/scsi/bnx2fc/bnx2fc_io.c
> @@ -204,7 +204,7 @@ static void bnx2fc_scsi_done(struct bnx2fc_cmd *io_req, int err_code)
> 		sc_cmd, host_byte(sc_cmd->result), sc_cmd->retries,
> 		sc_cmd->allowed);
> 	scsi_set_resid(sc_cmd, scsi_bufflen(sc_cmd));
> -	sc_cmd->SCp.ptr = NULL;
> +	bnx2fc_priv(sc_cmd)->io_req = NULL;
> 	scsi_done(sc_cmd);
> }
> 
> @@ -765,7 +765,7 @@ static int bnx2fc_initiate_tmf(struct scsi_cmnd *sc_cmd, u8 tm_flags)
> 	task = &(task_page[index]);
> 	bnx2fc_init_mp_task(io_req, task);
> 
> -	sc_cmd->SCp.ptr = (char *)io_req;
> +	bnx2fc_priv(sc_cmd)->io_req = io_req;
> 
> 	/* Obtain free SQ entry */
> 	spin_lock_bh(&tgt->tgt_lock);
> @@ -1147,7 +1147,7 @@ int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd)
> 	BNX2FC_TGT_DBG(tgt, "Entered bnx2fc_eh_abort\n");
> 
> 	spin_lock_bh(&tgt->tgt_lock);
> -	io_req = (struct bnx2fc_cmd *)sc_cmd->SCp.ptr;
> +	io_req = bnx2fc_priv(sc_cmd)->io_req;
> 	if (!io_req) {
> 		/* Command might have just completed */
> 		printk(KERN_ERR PFX "eh_abort: io_req is NULL\n");
> @@ -1572,7 +1572,7 @@ void bnx2fc_process_tm_compl(struct bnx2fc_cmd *io_req,
> 		printk(KERN_ERR PFX "tmf's fc_hdr r_ctl = 0x%x\n",
> 			fc_hdr->fh_r_ctl);
> 	}
> -	if (!sc_cmd->SCp.ptr) {
> +	if (!bnx2fc_priv(sc_cmd)->io_req) {
> 		printk(KERN_ERR PFX "tm_compl: SCp.ptr is NULL\n");
> 		return;
> 	}
> @@ -1609,7 +1609,7 @@ void bnx2fc_process_tm_compl(struct bnx2fc_cmd *io_req,
> 		return;
> 	}
> 
> -	sc_cmd->SCp.ptr = NULL;
> +	bnx2fc_priv(sc_cmd)->io_req = NULL;
> 	scsi_done(sc_cmd);
> 
> 	kref_put(&io_req->refcount, bnx2fc_cmd_release);
> @@ -1773,8 +1773,8 @@ static void bnx2fc_parse_fcp_rsp(struct bnx2fc_cmd *io_req,
> 		io_req->fcp_resid = fcp_rsp->fcp_resid;
> 
> 	io_req->scsi_comp_flags = rsp_flags;
> -	CMD_SCSI_STATUS(sc_cmd) = io_req->cdb_status =
> -				fcp_rsp->scsi_status_code;
> +	bnx2fc_priv(sc_cmd)->libfc_data.status = io_req->cdb_status =
> +		fcp_rsp->scsi_status_code;
> 
> 	/* Fetch fcp_rsp_info and fcp_sns_info if available */
> 	if (num_rq) {
> @@ -1946,7 +1946,7 @@ void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req,
> 	/* parse fcp_rsp and obtain sense data from RQ if available */
> 	bnx2fc_parse_fcp_rsp(io_req, fcp_rsp, num_rq, rq_data);
> 
> -	if (!sc_cmd->SCp.ptr) {
> +	if (!bnx2fc_priv(sc_cmd)->io_req) {
> 		printk(KERN_ERR PFX "SCp.ptr is NULL\n");
> 		return;
> 	}
> @@ -2018,7 +2018,7 @@ void bnx2fc_process_scsi_cmd_compl(struct bnx2fc_cmd *io_req,
> 			io_req->fcp_status);
> 		break;
> 	}
> -	sc_cmd->SCp.ptr = NULL;
> +	bnx2fc_priv(sc_cmd)->io_req = NULL;
> 	scsi_done(sc_cmd);
> 	kref_put(&io_req->refcount, bnx2fc_cmd_release);
> }
> @@ -2044,7 +2044,7 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
> 	io_req->port = port;
> 	io_req->tgt = tgt;
> 	io_req->data_xfer_len = scsi_bufflen(sc_cmd);
> -	sc_cmd->SCp.ptr = (char *)io_req;
> +	bnx2fc_priv(sc_cmd)->io_req = io_req;
> 
> 	stats = per_cpu_ptr(lport->stats, get_cpu());
> 	if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
> diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> index 6415f88738ad..44ca6110213c 100644
> --- a/drivers/scsi/fcoe/fcoe.c
> +++ b/drivers/scsi/fcoe/fcoe.c
> @@ -277,6 +277,7 @@ static struct scsi_host_template fcoe_shost_template = {
> 	.sg_tablesize = SG_ALL,
> 	.max_sectors = 0xffff,
> 	.track_queue_depth = 1,
> +	.cmd_size = sizeof(struct libfc_cmd_priv),
> };
> 
> /**
> diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
> index aa07189fb5fb..6ab444650f02 100644
> --- a/drivers/scsi/fnic/fnic.h
> +++ b/drivers/scsi/fnic/fnic.h
> @@ -93,6 +93,7 @@
>  * These fields are locked by the hashed io_req_lock.
>  */
> struct fnic_cmd_priv {
> +	struct libfc_cmd_priv libfc_data; /* must be the first member */
> 	struct fnic_io_req *io_req;
> 	enum fnic_ioreq_state state;
> 	u32 flags;
> diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
> index 871b11edb586..bce90eb56c9c 100644
> --- a/drivers/scsi/libfc/fc_fcp.c
> +++ b/drivers/scsi/libfc/fc_fcp.c
> @@ -45,14 +45,10 @@ static struct kmem_cache *scsi_pkt_cachep;
> #define FC_SRB_READ		(1 << 1)
> #define FC_SRB_WRITE		(1 << 0)
> 
> -/*
> - * The SCp.ptr should be tested and set under the scsi_pkt_queue lock
> - */
> -#define CMD_SP(Cmnd)		    ((struct fc_fcp_pkt *)(Cmnd)->SCp.ptr)
> -#define CMD_ENTRY_STATUS(Cmnd)	    ((Cmnd)->SCp.have_data_in)
> -#define CMD_COMPL_STATUS(Cmnd)	    ((Cmnd)->SCp.this_residual)
> -#define CMD_SCSI_STATUS(Cmnd)	    ((Cmnd)->SCp.Status)
> -#define CMD_RESID_LEN(Cmnd)	    ((Cmnd)->SCp.buffers_residual)
> +static struct libfc_cmd_priv *libfc_priv(struct scsi_cmnd *cmd)
> +{
> +	return scsi_cmd_priv(cmd);
> +}
> 
> /**
>  * struct fc_fcp_internal - FCP layer internal data
> @@ -1137,7 +1133,7 @@ static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
> 	unsigned long flags;
> 	int rc;
> 
> -	fsp->cmd->SCp.ptr = (char *)fsp;
> +	libfc_priv(fsp->cmd)->fsp = fsp;
> 	fsp->cdb_cmd.fc_dl = htonl(fsp->data_len);
> 	fsp->cdb_cmd.fc_flags = fsp->req_flags & ~FCP_CFL_LEN_MASK;
> 
> @@ -1150,7 +1146,7 @@ static int fc_fcp_pkt_send(struct fc_lport *lport, struct fc_fcp_pkt *fsp)
> 	rc = lport->tt.fcp_cmd_send(lport, fsp, fc_fcp_recv);
> 	if (unlikely(rc)) {
> 		spin_lock_irqsave(&si->scsi_queue_lock, flags);
> -		fsp->cmd->SCp.ptr = NULL;
> +		libfc_priv(fsp->cmd)->fsp = NULL;
> 		list_del(&fsp->list);
> 		spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
> 	}
> @@ -1983,7 +1979,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
> 		fc_fcp_can_queue_ramp_up(lport);
> 
> 	sc_cmd = fsp->cmd;
> -	CMD_SCSI_STATUS(sc_cmd) = fsp->cdb_status;
> +	libfc_priv(sc_cmd)->status = fsp->cdb_status;
> 	switch (fsp->status_code) {
> 	case FC_COMPLETE:
> 		if (fsp->cdb_status == 0) {
> @@ -1992,7 +1988,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
> 			 */
> 			sc_cmd->result = DID_OK << 16;
> 			if (fsp->scsi_resid)
> -				CMD_RESID_LEN(sc_cmd) = fsp->scsi_resid;
> +				libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
> 		} else {
> 			/*
> 			 * transport level I/O was ok but scsi
> @@ -2025,7 +2021,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
> 			 */
> 			FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
> 				   "due to FC_DATA_UNDRUN (scsi)\n");
> -			CMD_RESID_LEN(sc_cmd) = fsp->scsi_resid;
> +			libfc_priv(sc_cmd)->resid_len = fsp->scsi_resid;
> 			sc_cmd->result = (DID_ERROR << 16) | fsp->cdb_status;
> 		}
> 		break;
> @@ -2085,7 +2081,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
> 
> 	spin_lock_irqsave(&si->scsi_queue_lock, flags);
> 	list_del(&fsp->list);
> -	sc_cmd->SCp.ptr = NULL;
> +	libfc_priv(sc_cmd)->fsp = NULL;
> 	spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
> 	scsi_done(sc_cmd);
> 
> @@ -2121,7 +2117,7 @@ int fc_eh_abort(struct scsi_cmnd *sc_cmd)
> 
> 	si = fc_get_scsi_internal(lport);
> 	spin_lock_irqsave(&si->scsi_queue_lock, flags);
> -	fsp = CMD_SP(sc_cmd);
> +	fsp = libfc_priv(sc_cmd)->fsp;
> 	if (!fsp) {
> 		/* command completed while scsi eh was setting up */
> 		spin_unlock_irqrestore(&si->scsi_queue_lock, flags);
> diff --git a/drivers/scsi/qedf/qedf.h b/drivers/scsi/qedf/qedf.h
> index ca987451b17e..abb0c26da36e 100644
> --- a/drivers/scsi/qedf/qedf.h
> +++ b/drivers/scsi/qedf/qedf.h
> @@ -91,7 +91,6 @@ enum qedf_ioreq_event {
> #define FC_GOOD		0
> #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER	(0x1<<2)
> #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER	(0x1<<3)
> -#define CMD_SCSI_STATUS(Cmnd)			((Cmnd)->SCp.Status)
> #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID	(0x1<<0)
> #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID	(0x1<<1)
> struct qedf_ioreq {
> @@ -189,6 +188,16 @@ struct qedf_ioreq {
> 	unsigned int alloc;
> };
> 
> +struct qedf_cmd_priv {
> +	struct libfc_cmd_priv	libfc_data; /* must be the first member */
> +	struct qedf_ioreq	*io_req;
> +};
> +
> +static inline struct qedf_cmd_priv *qedf_priv(struct scsi_cmnd *cmd)
> +{
> +	return scsi_cmd_priv(cmd);
> +}
> +
> extern struct workqueue_struct *qedf_io_wq;
> 
> struct qedf_rport {
> diff --git a/drivers/scsi/qedf/qedf_io.c b/drivers/scsi/qedf/qedf_io.c
> index fab43dabe5b3..ed78a03a7e7c 100644
> --- a/drivers/scsi/qedf/qedf_io.c
> +++ b/drivers/scsi/qedf/qedf_io.c
> @@ -857,7 +857,7 @@ int qedf_post_io_req(struct qedf_rport *fcport, struct qedf_ioreq *io_req)
> 
> 	/* Initialize rest of io_req fileds */
> 	io_req->data_xfer_len = scsi_bufflen(sc_cmd);
> -	sc_cmd->SCp.ptr = (char *)io_req;
> +	qedf_priv(sc_cmd)->io_req = io_req;
> 	io_req->sge_type = QEDF_IOREQ_FAST_SGE; /* Assume fast SGL by default */
> 
> 	/* Record which cpu this request is associated with */
> @@ -1065,7 +1065,7 @@ static void qedf_parse_fcp_rsp(struct qedf_ioreq *io_req,
> 		io_req->fcp_resid = fcp_rsp->fcp_resid;
> 
> 	io_req->scsi_comp_flags = rsp_flags;
> -	CMD_SCSI_STATUS(sc_cmd) = io_req->cdb_status =
> +	qedf_priv(sc_cmd)->libfc_data.status = io_req->cdb_status =
> 	    fcp_rsp->scsi_status_code;
> 
> 	if (rsp_flags &
> @@ -1150,7 +1150,7 @@ void qedf_scsi_completion(struct qedf_ctx *qedf, struct fcoe_cqe *cqe,
> 		return;
> 	}
> 
> -	if (!sc_cmd->SCp.ptr) {
> +	if (!qedf_priv(sc_cmd)->io_req) {
> 		QEDF_WARN(&(qedf->dbg_ctx), "SCp.ptr is NULL, returned in "
> 		    "another context.\n");
> 		return;
> @@ -1312,7 +1312,7 @@ void qedf_scsi_completion(struct qedf_ctx *qedf, struct fcoe_cqe *cqe,
> 	clear_bit(QEDF_CMD_OUTSTANDING, &io_req->flags);
> 
> 	io_req->sc_cmd = NULL;
> -	sc_cmd->SCp.ptr =  NULL;
> +	qedf_priv(sc_cmd)->io_req =  NULL;
> 	scsi_done(sc_cmd);
> 	kref_put(&io_req->refcount, qedf_release_cmd);
> }
> @@ -1354,7 +1354,7 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req,
> 		goto bad_scsi_ptr;
> 	}
> 
> -	if (!sc_cmd->SCp.ptr) {
> +	if (!qedf_priv(sc_cmd)->io_req) {
> 		QEDF_WARN(&(qedf->dbg_ctx), "SCp.ptr is NULL, returned in "
> 		    "another context.\n");
> 		return;
> @@ -1409,7 +1409,7 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req,
> 		qedf_trace_io(io_req->fcport, io_req, QEDF_IO_TRACE_RSP);
> 
> 	io_req->sc_cmd = NULL;
> -	sc_cmd->SCp.ptr = NULL;
> +	qedf_priv(sc_cmd)->io_req = NULL;
> 	scsi_done(sc_cmd);
> 	kref_put(&io_req->refcount, qedf_release_cmd);
> 	return;
> @@ -2433,8 +2433,8 @@ int qedf_initiate_tmf(struct scsi_cmnd *sc_cmd, u8 tm_flags)
> 		 (tm_flags == FCP_TMF_TGT_RESET) ? "TARGET RESET" :
> 		 "LUN RESET");
> 
> -	if (sc_cmd->SCp.ptr) {
> -		io_req = (struct qedf_ioreq *)sc_cmd->SCp.ptr;
> +	if (qedf_priv(sc_cmd)->io_req) {
> +		io_req = qedf_priv(sc_cmd)->io_req;
> 		ref_cnt = kref_read(&io_req->refcount);
> 		QEDF_ERR(NULL,
> 			 "orig io_req = %p xid = 0x%x ref_cnt = %d.\n",
> diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c
> index 6ad28bc8e948..18dc68d577b6 100644
> --- a/drivers/scsi/qedf/qedf_main.c
> +++ b/drivers/scsi/qedf/qedf_main.c
> @@ -740,7 +740,7 @@ static int qedf_eh_abort(struct scsi_cmnd *sc_cmd)
> 	}
> 
> 
> -	io_req = (struct qedf_ioreq *)sc_cmd->SCp.ptr;
> +	io_req = qedf_priv(sc_cmd)->io_req;
> 	if (!io_req) {
> 		QEDF_ERR(&qedf->dbg_ctx,
> 			 "sc_cmd not queued with lld, sc_cmd=%p op=0x%02x, port_id=%06x\n",
> @@ -996,6 +996,7 @@ static struct scsi_host_template qedf_host_template = {
> 	.sg_tablesize = QEDF_MAX_BDS_PER_CMD,
> 	.can_queue = FCOE_PARAMS_NUM_TASKS,
> 	.change_queue_depth = scsi_change_queue_depth,
> +	.cmd_size = sizeof(struct qedf_cmd_priv),
> };
> 
> static int qedf_get_paged_crc_eof(struct sk_buff *skb, int tlen)
> diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
> index eeb8d689ff6b..5ae6d504e835 100644
> --- a/include/scsi/libfc.h
> +++ b/include/scsi/libfc.h
> @@ -351,6 +351,15 @@ struct fc_fcp_pkt {
> 	struct completion tm_done;
> } ____cacheline_aligned_in_smp;
> 
> +/*
> + * @fsp should be tested and set under the scsi_pkt_queue lock
> + */
> +struct libfc_cmd_priv {
> +	struct fc_fcp_pkt *fsp;
> +	u32 resid_len;
> +	u8 status;
> +};
> +
> /*
>  * Structure and function definitions for managing Fibre Channel Exchanges
>  * and Sequences
> @@ -862,6 +871,8 @@ libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
> 	struct fc_lport *lport;
> 	struct Scsi_Host *shost;
> 
> +	WARN_ON_ONCE(sht->cmd_size < sizeof(struct libfc_cmd_priv));
> +
> 	shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);
> 	if (!shost)
> 		return NULL;

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