All of lore.kernel.org
 help / color / mirror / Atom feed
From: Himanshu Madhani <himanshu.madhani@oracle.com>
To: James Smart <jsmart2021@gmail.com>, linux-nvme@lists.infradead.org
Cc: martin.petersen@oracle.com
Subject: Re: [PATCH 04/29] nvme-fc nvmet_fc nvme_fcloop: adapt code to changed names in api header
Date: Thu, 26 Mar 2020 11:26:13 -0500	[thread overview]
Message-ID: <a97e3a31-b090-9e62-843e-c28a0eb31177@oracle.com> (raw)
In-Reply-To: <20200205183753.25959-5-jsmart2021@gmail.com>

On 2/5/2020 12:37 PM, James Smart wrote:
> deal with following naming changes in the header:
>    nvmefc_tgt_ls_req -> nvmefc_ls_rsp
>    nvmefc_tgt_ls_req.nvmet_fc_private -> nvmefc_ls_rsp.nvme_fc_private
> 
> Change calling sequence to nvmet_fc_rcv_ls_req() for hosthandle.
> 
> Add stubs for new interfaces:
> host/fc.c: nvme_fc_rcv_ls_req()
> target/fc.c: nvmet_fc_invalidate_host()
> 
> Signed-off-by: James Smart <jsmart2021@gmail.com>
> ---
>   drivers/nvme/host/fc.c       | 35 ++++++++++++++++++++
>   drivers/nvme/target/fc.c     | 77 ++++++++++++++++++++++++++++++++------------
>   drivers/nvme/target/fcloop.c | 20 ++++++------
>   3 files changed, 102 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index 5a70ac395d53..f8f79cd88769 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -1465,6 +1465,41 @@ nvme_fc_xmt_disconnect_assoc(struct nvme_fc_ctrl *ctrl)
>   		kfree(lsop);
>   }
>   
> +/**
> + * nvme_fc_rcv_ls_req - transport entry point called by an LLDD
> + *                       upon the reception of a NVME LS request.
> + *
> + * The nvme-fc layer will copy payload to an internal structure for
> + * processing.  As such, upon completion of the routine, the LLDD may
> + * immediately free/reuse the LS request buffer passed in the call.
> + *
> + * If this routine returns error, the LLDD should abort the exchange.
> + *
> + * @remoteport: pointer to the (registered) remote port that the LS
> + *              was received from. The remoteport is associated with
> + *              a specific localport.
> + * @lsrsp:      pointer to a nvmefc_ls_rsp response structure to be
> + *              used to reference the exchange corresponding to the LS
> + *              when issuing an ls response.
> + * @lsreqbuf:   pointer to the buffer containing the LS Request
> + * @lsreqbuf_len: length, in bytes, of the received LS request
> + */
> +int
> +nvme_fc_rcv_ls_req(struct nvme_fc_remote_port *portptr,
> +			struct nvmefc_ls_rsp *lsrsp,
> +			void *lsreqbuf, u32 lsreqbuf_len)
> +{
> +	struct nvme_fc_rport *rport = remoteport_to_rport(portptr);
> +	struct nvme_fc_lport *lport = rport->lport;
> +
> +	/* validate there's a routine to transmit a response */
> +	if (!lport->ops->xmt_ls_rsp)
> +		return(-EINVAL);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(nvme_fc_rcv_ls_req);
> +
>   
>   /* *********************** NVME Ctrl Routines **************************** */
>   
> diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
> index a8ceb7721640..aac7869a70bb 100644
> --- a/drivers/nvme/target/fc.c
> +++ b/drivers/nvme/target/fc.c
> @@ -28,7 +28,7 @@ struct nvmet_fc_tgtport;
>   struct nvmet_fc_tgt_assoc;
>   
>   struct nvmet_fc_ls_iod {
> -	struct nvmefc_tgt_ls_req	*lsreq;
> +	struct nvmefc_ls_rsp		*lsrsp;
>   	struct nvmefc_tgt_fcp_req	*fcpreq;	/* only if RS */
>   
>   	struct list_head		ls_list;	/* tgtport->ls_list */
> @@ -1146,6 +1146,42 @@ __nvmet_fc_free_assocs(struct nvmet_fc_tgtport *tgtport)
>   	spin_unlock_irqrestore(&tgtport->lock, flags);
>   }
>   
> +/**
> + * nvmet_fc_invalidate_host - transport entry point called by an LLDD
> + *                       to remove references to a hosthandle for LS's.
> + *
> + * The nvmet-fc layer ensures that any references to the hosthandle
> + * on the targetport are forgotten (set to NULL).  The LLDD will
> + * typically call this when a login with a remote host port has been
> + * lost, thus LS's for the remote host port are no longer possible.
> + *
> + * If an LS request is outstanding to the targetport/hosthandle (or
> + * issued concurrently with the call to invalidate the host), the
> + * LLDD is responsible for terminating/aborting the LS and completing
> + * the LS request. It is recommended that these terminations/aborts
> + * occur after calling to invalidate the host handle to avoid additional
> + * retries by the nvmet-fc transport. The nvmet-fc transport may
> + * continue to reference host handle while it cleans up outstanding
> + * NVME associations. The nvmet-fc transport will call the
> + * ops->host_release() callback to notify the LLDD that all references
> + * are complete and the related host handle can be recovered.
> + * Note: if there are no references, the callback may be called before
> + * the invalidate host call returns.
> + *
> + * @target_port: pointer to the (registered) target port that a prior
> + *              LS was received on and which supplied the transport the
> + *              hosthandle.
> + * @hosthandle: the handle (pointer) that represents the host port
> + *              that no longer has connectivity and that LS's should
> + *              no longer be directed to.
> + */
> +void
> +nvmet_fc_invalidate_host(struct nvmet_fc_target_port *target_port,
> +			void *hosthandle)
> +{
> +}
> +EXPORT_SYMBOL_GPL(nvmet_fc_invalidate_host);
> +
>   /*
>    * nvmet layer has called to terminate an association
>    */
> @@ -1371,7 +1407,7 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
>   		dev_err(tgtport->dev,
>   			"Create Association LS failed: %s\n",
>   			validation_errors[ret]);
> -		iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
> +		iod->lsrsp->rsplen = nvmet_fc_format_rjt(acc,
>   				NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
>   				FCNVME_RJT_RC_LOGIC,
>   				FCNVME_RJT_EXP_NONE, 0);
> @@ -1384,7 +1420,7 @@ nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
>   
>   	/* format a response */
>   
> -	iod->lsreq->rsplen = sizeof(*acc);
> +	iod->lsrsp->rsplen = sizeof(*acc);
>   
>   	nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
>   			fcnvme_lsdesc_len(
> @@ -1462,7 +1498,7 @@ nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
>   		dev_err(tgtport->dev,
>   			"Create Connection LS failed: %s\n",
>   			validation_errors[ret]);
> -		iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
> +		iod->lsrsp->rsplen = nvmet_fc_format_rjt(acc,
>   				NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
>   				(ret == VERR_NO_ASSOC) ?
>   					FCNVME_RJT_RC_INV_ASSOC :
> @@ -1477,7 +1513,7 @@ nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
>   
>   	/* format a response */
>   
> -	iod->lsreq->rsplen = sizeof(*acc);
> +	iod->lsrsp->rsplen = sizeof(*acc);
>   
>   	nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
>   			fcnvme_lsdesc_len(sizeof(struct fcnvme_ls_cr_conn_acc)),
> @@ -1542,7 +1578,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
>   		dev_err(tgtport->dev,
>   			"Disconnect LS failed: %s\n",
>   			validation_errors[ret]);
> -		iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
> +		iod->lsrsp->rsplen = nvmet_fc_format_rjt(acc,
>   				NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
>   				(ret == VERR_NO_ASSOC) ?
>   					FCNVME_RJT_RC_INV_ASSOC :
> @@ -1555,7 +1591,7 @@ nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
>   
>   	/* format a response */
>   
> -	iod->lsreq->rsplen = sizeof(*acc);
> +	iod->lsrsp->rsplen = sizeof(*acc);
>   
>   	nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
>   			fcnvme_lsdesc_len(
> @@ -1577,9 +1613,9 @@ static void nvmet_fc_fcp_nvme_cmd_done(struct nvmet_req *nvme_req);
>   static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops;
>   
>   static void
> -nvmet_fc_xmt_ls_rsp_done(struct nvmefc_tgt_ls_req *lsreq)
> +nvmet_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp)
>   {
> -	struct nvmet_fc_ls_iod *iod = lsreq->nvmet_fc_private;
> +	struct nvmet_fc_ls_iod *iod = lsrsp->nvme_fc_private;
>   	struct nvmet_fc_tgtport *tgtport = iod->tgtport;
>   
>   	fc_dma_sync_single_for_cpu(tgtport->dev, iod->rspdma,
> @@ -1597,9 +1633,9 @@ nvmet_fc_xmt_ls_rsp(struct nvmet_fc_tgtport *tgtport,
>   	fc_dma_sync_single_for_device(tgtport->dev, iod->rspdma,
>   				  NVME_FC_MAX_LS_BUFFER_SIZE, DMA_TO_DEVICE);
>   
> -	ret = tgtport->ops->xmt_ls_rsp(&tgtport->fc_target_port, iod->lsreq);
> +	ret = tgtport->ops->xmt_ls_rsp(&tgtport->fc_target_port, iod->lsrsp);
>   	if (ret)
> -		nvmet_fc_xmt_ls_rsp_done(iod->lsreq);
> +		nvmet_fc_xmt_ls_rsp_done(iod->lsrsp);
>   }
>   
>   /*
> @@ -1612,12 +1648,12 @@ nvmet_fc_handle_ls_rqst(struct nvmet_fc_tgtport *tgtport,
>   	struct fcnvme_ls_rqst_w0 *w0 =
>   			(struct fcnvme_ls_rqst_w0 *)iod->rqstbuf;
>   
> -	iod->lsreq->nvmet_fc_private = iod;
> -	iod->lsreq->rspbuf = iod->rspbuf;
> -	iod->lsreq->rspdma = iod->rspdma;
> -	iod->lsreq->done = nvmet_fc_xmt_ls_rsp_done;
> +	iod->lsrsp->nvme_fc_private = iod;
> +	iod->lsrsp->rspbuf = iod->rspbuf;
> +	iod->lsrsp->rspdma = iod->rspdma;
> +	iod->lsrsp->done = nvmet_fc_xmt_ls_rsp_done;
>   	/* Be preventative. handlers will later set to valid length */
> -	iod->lsreq->rsplen = 0;
> +	iod->lsrsp->rsplen = 0;
>   
>   	iod->assoc = NULL;
>   
> @@ -1640,7 +1676,7 @@ nvmet_fc_handle_ls_rqst(struct nvmet_fc_tgtport *tgtport,
>   		nvmet_fc_ls_disconnect(tgtport, iod);
>   		break;
>   	default:
> -		iod->lsreq->rsplen = nvmet_fc_format_rjt(iod->rspbuf,
> +		iod->lsrsp->rsplen = nvmet_fc_format_rjt(iod->rspbuf,
>   				NVME_FC_MAX_LS_BUFFER_SIZE, w0->ls_cmd,
>   				FCNVME_RJT_RC_INVAL, FCNVME_RJT_EXP_NONE, 0);
>   	}
> @@ -1674,14 +1710,15 @@ nvmet_fc_handle_ls_rqst_work(struct work_struct *work)
>    *
>    * @target_port: pointer to the (registered) target port the LS was
>    *              received on.
> - * @lsreq:      pointer to a lsreq request structure to be used to reference
> + * @lsrsp:      pointer to a lsrsp structure to be used to reference
>    *              the exchange corresponding to the LS.
>    * @lsreqbuf:   pointer to the buffer containing the LS Request
>    * @lsreqbuf_len: length, in bytes, of the received LS request
>    */
>   int
>   nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
> -			struct nvmefc_tgt_ls_req *lsreq,
> +			void *hosthandle,
> +			struct nvmefc_ls_rsp *lsrsp,
>   			void *lsreqbuf, u32 lsreqbuf_len)
>   {
>   	struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
> @@ -1699,7 +1736,7 @@ nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
>   		return -ENOENT;
>   	}
>   
> -	iod->lsreq = lsreq;
> +	iod->lsrsp = lsrsp;
>   	iod->fcpreq = NULL;
>   	memcpy(iod->rqstbuf, lsreqbuf, lsreqbuf_len);
>   	iod->rqstdatalen = lsreqbuf_len;
> diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c
> index 1c50af6219f3..130932a5db0c 100644
> --- a/drivers/nvme/target/fcloop.c
> +++ b/drivers/nvme/target/fcloop.c
> @@ -227,7 +227,7 @@ struct fcloop_lsreq {
>   	struct fcloop_tport		*tport;
>   	struct nvmefc_ls_req		*lsreq;
>   	struct work_struct		work;
> -	struct nvmefc_tgt_ls_req	tgt_ls_req;
> +	struct nvmefc_ls_rsp		ls_rsp;
>   	int				status;
>   };
>   
> @@ -265,9 +265,9 @@ struct fcloop_ini_fcpreq {
>   };
>   
>   static inline struct fcloop_lsreq *
> -tgt_ls_req_to_lsreq(struct nvmefc_tgt_ls_req *tgt_lsreq)
> +ls_rsp_to_lsreq(struct nvmefc_ls_rsp *lsrsp)
>   {
> -	return container_of(tgt_lsreq, struct fcloop_lsreq, tgt_ls_req);
> +	return container_of(lsrsp, struct fcloop_lsreq, ls_rsp);
>   }
>   
>   static inline struct fcloop_fcpreq *
> @@ -330,7 +330,7 @@ fcloop_ls_req(struct nvme_fc_local_port *localport,
>   
>   	tls_req->status = 0;
>   	tls_req->tport = rport->targetport->private;
> -	ret = nvmet_fc_rcv_ls_req(rport->targetport, &tls_req->tgt_ls_req,
> +	ret = nvmet_fc_rcv_ls_req(rport->targetport, NULL, &tls_req->ls_rsp,
>   				 lsreq->rqstaddr, lsreq->rqstlen);
>   
>   	return ret;
> @@ -338,15 +338,15 @@ fcloop_ls_req(struct nvme_fc_local_port *localport,
>   
>   static int
>   fcloop_xmt_ls_rsp(struct nvmet_fc_target_port *tport,
> -			struct nvmefc_tgt_ls_req *tgt_lsreq)
> +			struct nvmefc_ls_rsp *lsrsp)
>   {
> -	struct fcloop_lsreq *tls_req = tgt_ls_req_to_lsreq(tgt_lsreq);
> +	struct fcloop_lsreq *tls_req = ls_rsp_to_lsreq(lsrsp);
>   	struct nvmefc_ls_req *lsreq = tls_req->lsreq;
>   
> -	memcpy(lsreq->rspaddr, tgt_lsreq->rspbuf,
> -		((lsreq->rsplen < tgt_lsreq->rsplen) ?
> -				lsreq->rsplen : tgt_lsreq->rsplen));
> -	tgt_lsreq->done(tgt_lsreq);
> +	memcpy(lsreq->rspaddr, lsrsp->rspbuf,
> +		((lsreq->rsplen < lsrsp->rsplen) ?
> +				lsreq->rsplen : lsrsp->rsplen));
> +	lsrsp->done(lsrsp);
>   
>   	schedule_work(&tls_req->work);
>   
> 


Looks Good.

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

_______________________________________________
linux-nvme mailing list
linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

  parent reply	other threads:[~2020-03-26 16:26 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-05 18:37 [PATCH 00/29] nvme-fc/nvmet-fc: Add FC-NVME-2 disconnect association support James Smart
2020-02-05 18:37 ` [PATCH 01/29] nvme-fc: Sync header to FC-NVME-2 rev 1.08 James Smart
2020-02-28 20:36   ` Sagi Grimberg
2020-03-06  8:16   ` Hannes Reinecke
2020-03-26 16:10   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 02/29] nvmet-fc: fix typo in comment James Smart
2020-02-28 20:36   ` Sagi Grimberg
2020-03-06  8:17   ` Hannes Reinecke
2020-03-26 16:10   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 03/29] nvme-fc and nvmet-fc: revise LLDD api for LS reception and LS request James Smart
2020-02-28 20:38   ` Sagi Grimberg
2020-03-06  8:19   ` Hannes Reinecke
2020-03-26 16:16   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 04/29] nvme-fc nvmet_fc nvme_fcloop: adapt code to changed names in api header James Smart
2020-02-28 20:40   ` Sagi Grimberg
2020-03-06  8:21   ` Hannes Reinecke
2020-03-26 16:26   ` Himanshu Madhani [this message]
2020-02-05 18:37 ` [PATCH 05/29] lpfc: " James Smart
2020-02-28 20:40   ` Sagi Grimberg
2020-03-06  8:25   ` Hannes Reinecke
2020-03-26 16:30   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 06/29] nvme-fcloop: Fix deallocation of working context James Smart
2020-02-28 20:43   ` Sagi Grimberg
2020-03-06  8:34   ` Hannes Reinecke
2020-03-26 16:35   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 07/29] nvme-fc nvmet-fc: refactor for common LS definitions James Smart
2020-03-06  8:35   ` Hannes Reinecke
2020-03-26 16:36   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 08/29] nvmet-fc: Better size LS buffers James Smart
2020-02-28 21:04   ` Sagi Grimberg
2020-03-06  8:36   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 09/29] nvme-fc: Ensure private pointers are NULL if no data James Smart
2020-02-28 21:05   ` Sagi Grimberg
2020-03-06  8:44   ` Hannes Reinecke
2020-03-26 16:39   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 10/29] nvmefc: Use common definitions for LS names, formatting, and validation James Smart
2020-03-06  8:44   ` Hannes Reinecke
2020-03-26 16:41   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 11/29] nvme-fc: convert assoc_active flag to atomic James Smart
2020-02-28 21:08   ` Sagi Grimberg
2020-03-06  8:47   ` Hannes Reinecke
2020-03-26 19:16   ` Himanshu Madhani
2020-02-05 18:37 ` [PATCH 12/29] nvme-fc: Add Disconnect Association Rcv support James Smart
2020-03-06  9:00   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 13/29] nvmet-fc: add LS failure messages James Smart
2020-03-06  9:01   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 14/29] nvmet-fc: perform small cleanups on unneeded checks James Smart
2020-03-06  9:01   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 15/29] nvmet-fc: track hostport handle for associations James Smart
2020-03-06  9:02   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 16/29] nvmet-fc: rename ls_list to ls_rcv_list James Smart
2020-03-06  9:03   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 17/29] nvmet-fc: Add Disconnect Association Xmt support James Smart
2020-03-06  9:04   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 18/29] nvme-fcloop: refactor to enable target to host LS James Smart
2020-03-06  9:06   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 19/29] nvme-fcloop: add target to host LS request support James Smart
2020-03-06  9:07   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 20/29] lpfc: Refactor lpfc nvme headers James Smart
2020-03-06  9:18   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 21/29] lpfc: Refactor nvmet_rcv_ctx to create lpfc_async_xchg_ctx James Smart
2020-03-06  9:19   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 22/29] lpfc: Commonize lpfc_async_xchg_ctx state and flag definitions James Smart
2020-03-06  9:19   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 23/29] lpfc: Refactor NVME LS receive handling James Smart
2020-03-06  9:20   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 24/29] lpfc: Refactor Send LS Request support James Smart
2020-03-06  9:20   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 25/29] lpfc: Refactor Send LS Abort support James Smart
2020-03-06  9:21   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 26/29] lpfc: Refactor Send LS Response support James Smart
2020-03-06  9:21   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 27/29] lpfc: nvme: Add Receive LS Request and Send LS Response support to nvme James Smart
2020-03-06  9:23   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 28/29] lpfc: nvmet: Add support for NVME LS request hosthandle James Smart
2020-03-06  9:23   ` Hannes Reinecke
2020-02-05 18:37 ` [PATCH 29/29] lpfc: nvmet: Add Send LS Request and Abort LS Request support James Smart
2020-03-06  9:24   ` Hannes Reinecke
2020-03-06  9:26 ` [PATCH 00/29] nvme-fc/nvmet-fc: Add FC-NVME-2 disconnect association support Hannes Reinecke
2020-03-31 14:29 ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a97e3a31-b090-9e62-843e-c28a0eb31177@oracle.com \
    --to=himanshu.madhani@oracle.com \
    --cc=jsmart2021@gmail.com \
    --cc=linux-nvme@lists.infradead.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.