OSDN Git Service

nvmet-fc: add transport discovery change event callback support
authorJames Smart <jsmart2021@gmail.com>
Tue, 14 May 2019 21:58:03 +0000 (14:58 -0700)
committerChristoph Hellwig <hch@lst.de>
Fri, 21 Jun 2019 09:08:37 +0000 (11:08 +0200)
This patch adds support for the nvmet discovery_change transport op.
In turn, the transport adds it's own LLDD api callback discovery_event
op to request the LLDD to generate an RSCN for the discovery change.

Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Arun Easi <aeasi@marvell.com>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/fc.c
include/linux/nvme-fc-driver.h

index 508661a..1f252c9 100644 (file)
@@ -2549,6 +2549,16 @@ nvmet_fc_remove_port(struct nvmet_port *port)
        kfree(pe);
 }
 
+static void
+nvmet_fc_discovery_chg(struct nvmet_port *port)
+{
+       struct nvmet_fc_port_entry *pe = port->priv;
+       struct nvmet_fc_tgtport *tgtport = pe->tgtport;
+
+       if (tgtport && tgtport->ops->discovery_event)
+               tgtport->ops->discovery_event(&tgtport->fc_target_port);
+}
+
 static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
        .owner                  = THIS_MODULE,
        .type                   = NVMF_TRTYPE_FC,
@@ -2557,6 +2567,7 @@ static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
        .remove_port            = nvmet_fc_remove_port,
        .queue_response         = nvmet_fc_fcp_nvme_cmd_done,
        .delete_ctrl            = nvmet_fc_delete_ctrl,
+       .discovery_chg          = nvmet_fc_discovery_chg,
 };
 
 static int __init nvmet_fc_init_module(void)
index c48e964..98d9049 100644 (file)
@@ -791,6 +791,11 @@ struct nvmet_fc_target_port {
  *       nvmefc_tgt_fcp_req.
  *       Entrypoint is Optional.
  *
+ * @discovery_event:  Called by the transport to generate an RSCN
+ *       change notifications to NVME initiators. The RSCN notifications
+ *       should cause the initiator to rescan the discovery controller
+ *       on the targetport.
+ *
  * @max_hw_queues:  indicates the maximum number of hw queues the LLDD
  *       supports for cpu affinitization.
  *       Value is Mandatory. Must be at least 1.
@@ -832,6 +837,7 @@ struct nvmet_fc_target_template {
                                struct nvmefc_tgt_fcp_req *fcpreq);
        void (*defer_rcv)(struct nvmet_fc_target_port *tgtport,
                                struct nvmefc_tgt_fcp_req *fcpreq);
+       void (*discovery_event)(struct nvmet_fc_target_port *tgtport);
 
        u32     max_hw_queues;
        u16     max_sgl_segments;