nvmet: lock config semaphore when accessing DH-HMAC-CHAP key
authorHannes Reinecke <hare@kernel.org>
Tue, 30 Apr 2024 13:19:24 +0000 (15:19 +0200)
committerKeith Busch <kbusch@kernel.org>
Wed, 1 May 2024 10:07:20 +0000 (03:07 -0700)
When the DH-HMAC-CHAP key is accessed via configfs we need to take the
config semaphore as a reconnect might be running at the same time.

Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/auth.c
drivers/nvme/target/configfs.c

index 3ddbc3880cac8d327074fe8f923b9f257979c8bd..9afc28f1ffac9562cbeb577b739dcf8cf249a296 100644 (file)
@@ -44,6 +44,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
        dhchap_secret = kstrdup(secret, GFP_KERNEL);
        if (!dhchap_secret)
                return -ENOMEM;
+       down_write(&nvmet_config_sem);
        if (set_ctrl) {
                kfree(host->dhchap_ctrl_secret);
                host->dhchap_ctrl_secret = strim(dhchap_secret);
@@ -53,6 +54,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
                host->dhchap_secret = strim(dhchap_secret);
                host->dhchap_key_hash = key_hash;
        }
+       up_write(&nvmet_config_sem);
        return 0;
 }
 
index 77a6e817b31596998e4424aa8205f8cfd9219f1d..7c28b9c0ee573d4a25f40977cb9a17f555060c65 100644 (file)
@@ -1990,11 +1990,17 @@ static struct config_group nvmet_ports_group;
 static ssize_t nvmet_host_dhchap_key_show(struct config_item *item,
                char *page)
 {
-       u8 *dhchap_secret = to_host(item)->dhchap_secret;
+       u8 *dhchap_secret;
+       ssize_t ret;
 
+       down_read(&nvmet_config_sem);
+       dhchap_secret = to_host(item)->dhchap_secret;
        if (!dhchap_secret)
-               return sprintf(page, "\n");
-       return sprintf(page, "%s\n", dhchap_secret);
+               ret = sprintf(page, "\n");
+       else
+               ret = sprintf(page, "%s\n", dhchap_secret);
+       up_read(&nvmet_config_sem);
+       return ret;
 }
 
 static ssize_t nvmet_host_dhchap_key_store(struct config_item *item,
@@ -2018,10 +2024,16 @@ static ssize_t nvmet_host_dhchap_ctrl_key_show(struct config_item *item,
                char *page)
 {
        u8 *dhchap_secret = to_host(item)->dhchap_ctrl_secret;
+       ssize_t ret;
 
+       down_read(&nvmet_config_sem);
+       dhchap_secret = to_host(item)->dhchap_ctrl_secret;
        if (!dhchap_secret)
-               return sprintf(page, "\n");
-       return sprintf(page, "%s\n", dhchap_secret);
+               ret = sprintf(page, "\n");
+       else
+               ret = sprintf(page, "%s\n", dhchap_secret);
+       up_read(&nvmet_config_sem);
+       return ret;
 }
 
 static ssize_t nvmet_host_dhchap_ctrl_key_store(struct config_item *item,