]> www.infradead.org Git - nvme.git/commitdiff
nvmet: make 'tsas' attribute idempotent for RDMA
authorHannes Reinecke <hare@kernel.org>
Mon, 17 Jun 2024 07:27:28 +0000 (09:27 +0200)
committerKeith Busch <kbusch@kernel.org>
Fri, 21 Jun 2024 15:49:10 +0000 (08:49 -0700)
The RDMA transport defines values for TSAS, but it cannot be changed as
we only support the 'connected' mode.
So to avoid errors during reconfiguration we should allow to write the
current value.

Fixes: 3f123494db72 ("nvmet: make TCP sectype settable via configfs")
Signed-off-by: Hannes Reinecke <hare@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/configfs.c
include/linux/nvme.h

index e60224356048a4f93f3af5ea658eb0fc763d12bb..685e89b35d330d6363846bdd1a22dc4a19f19a14 100644 (file)
@@ -413,25 +413,46 @@ static ssize_t nvmet_addr_tsas_show(struct config_item *item,
        return sprintf(page, "\n");
 }
 
+static u8 nvmet_addr_tsas_rdma_store(const char *page)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_rdma); i++) {
+               if (sysfs_streq(page, nvmet_addr_tsas_rdma[i].name))
+                       return nvmet_addr_tsas_rdma[i].type;
+       }
+       return NVMF_RDMA_QPTYPE_INVALID;
+}
+
+static u8 nvmet_addr_tsas_tcp_store(const char *page)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) {
+               if (sysfs_streq(page, nvmet_addr_tsas_tcp[i].name))
+                       return nvmet_addr_tsas_tcp[i].type;
+       }
+       return NVMF_TCP_SECTYPE_INVALID;
+}
+
 static ssize_t nvmet_addr_tsas_store(struct config_item *item,
                const char *page, size_t count)
 {
        struct nvmet_port *port = to_nvmet_port(item);
        u8 treq = nvmet_port_disc_addr_treq_mask(port);
-       u8 sectype;
-       int i;
+       u8 sectype, qptype;
 
        if (nvmet_is_port_enabled(port, __func__))
                return -EACCES;
 
-       if (port->disc_addr.trtype != NVMF_TRTYPE_TCP)
-               return -EINVAL;
-
-       for (i = 0; i < ARRAY_SIZE(nvmet_addr_tsas_tcp); i++) {
-               if (sysfs_streq(page, nvmet_addr_tsas_tcp[i].name)) {
-                       sectype = nvmet_addr_tsas_tcp[i].type;
+       if (port->disc_addr.trtype == NVMF_TRTYPE_RDMA) {
+               qptype = nvmet_addr_tsas_rdma_store(page);
+               if (qptype == port->disc_addr.tsas.rdma.qptype)
+                       return count;
+       } else if (port->disc_addr.trtype == NVMF_TRTYPE_TCP) {
+               sectype = nvmet_addr_tsas_tcp_store(page);
+               if (sectype != NVMF_TCP_SECTYPE_INVALID)
                        goto found;
-               }
        }
 
        pr_err("Invalid value '%s' for tsas\n", page);
index 69ac2abf8acfee75b27af6b292d6a0d97a210436..c693ac344ec05c298547642d4271d6c5f6502467 100644 (file)
@@ -85,6 +85,7 @@ enum {
 enum {
        NVMF_RDMA_QPTYPE_CONNECTED      = 1, /* Reliable Connected */
        NVMF_RDMA_QPTYPE_DATAGRAM       = 2, /* Reliable Datagram */
+       NVMF_RDMA_QPTYPE_INVALID        = 0xff,
 };
 
 /* RDMA Provider Type codes for Discovery Log Page entry TSAS
@@ -110,6 +111,7 @@ enum {
        NVMF_TCP_SECTYPE_NONE = 0, /* No Security */
        NVMF_TCP_SECTYPE_TLS12 = 1, /* TLSv1.2, NVMe-oF 1.1 and NVMe-TCP 3.6.1.1 */
        NVMF_TCP_SECTYPE_TLS13 = 2, /* TLSv1.3, NVMe-oF 1.1 and NVMe-TCP 3.6.1.1 */
+       NVMF_TCP_SECTYPE_INVALID = 0xff,
 };
 
 #define NVME_AQ_DEPTH          32