nvmet: don't override treq upon modification.
authorSagi Grimberg <sagi@grimberg.me>
Mon, 19 Nov 2018 22:11:13 +0000 (14:11 -0800)
committerJens Axboe <axboe@kernel.dk>
Sat, 8 Dec 2018 05:26:57 +0000 (22:26 -0700)
Only override the allowed parts of it.

Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
[hch: slight tweak to the NVME_TREQ_SECURE_CHANNEL_MASK definition]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/target/configfs.c
include/linux/nvme.h

index d37fd7713bbce3993718e1cc13d7fe4ec14fb16f..260a401db01ca1cba030e4e4f925ad2c007cb9fa 100644 (file)
@@ -153,7 +153,8 @@ CONFIGFS_ATTR(nvmet_, addr_traddr);
 static ssize_t nvmet_addr_treq_show(struct config_item *item,
                char *page)
 {
-       switch (to_nvmet_port(item)->disc_addr.treq) {
+       switch (to_nvmet_port(item)->disc_addr.treq &
+               NVME_TREQ_SECURE_CHANNEL_MASK) {
        case NVMF_TREQ_NOT_SPECIFIED:
                return sprintf(page, "not specified\n");
        case NVMF_TREQ_REQUIRED:
@@ -169,6 +170,7 @@ static ssize_t nvmet_addr_treq_store(struct config_item *item,
                const char *page, size_t count)
 {
        struct nvmet_port *port = to_nvmet_port(item);
+       u8 treq = port->disc_addr.treq & ~NVME_TREQ_SECURE_CHANNEL_MASK;
 
        if (port->enabled) {
                pr_err("Cannot modify address while enabled\n");
@@ -177,15 +179,16 @@ static ssize_t nvmet_addr_treq_store(struct config_item *item,
        }
 
        if (sysfs_streq(page, "not specified")) {
-               port->disc_addr.treq = NVMF_TREQ_NOT_SPECIFIED;
+               treq |= NVMF_TREQ_NOT_SPECIFIED;
        } else if (sysfs_streq(page, "required")) {
-               port->disc_addr.treq = NVMF_TREQ_REQUIRED;
+               treq |= NVMF_TREQ_REQUIRED;
        } else if (sysfs_streq(page, "not required")) {
-               port->disc_addr.treq = NVMF_TREQ_NOT_REQUIRED;
+               treq |= NVMF_TREQ_NOT_REQUIRED;
        } else {
                pr_err("Invalid value '%s' for treq\n", page);
                return -EINVAL;
        }
+       port->disc_addr.treq = treq;
 
        return count;
 }
index e7d731776f62811cf19d3422a1a4bbef42a4bd18..4fc48071e5eaa6d9cff84f847be0b6c6286e6334 100644 (file)
@@ -61,6 +61,8 @@ enum {
        NVMF_TREQ_NOT_SPECIFIED = 0,    /* Not specified */
        NVMF_TREQ_REQUIRED      = 1,    /* Required */
        NVMF_TREQ_NOT_REQUIRED  = 2,    /* Not Required */
+#define NVME_TREQ_SECURE_CHANNEL_MASK \
+       (NVMF_TREQ_REQUIRED | NVMF_TREQ_NOT_REQUIRED)
 };
 
 /* RDMA QP Service Type codes for Discovery Log Page entry TSAS