Skip to content

Commit 213cbad

Browse files
Hannes Reineckekeithbusch
authored andcommitted
nvmet: lock config semaphore when accessing DH-HMAC-CHAP key
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 <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Hannes Reinecke <[email protected]> Signed-off-by: Daniel Wagner <[email protected]> Signed-off-by: Keith Busch <[email protected]>
1 parent 6ad0d7e commit 213cbad

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

drivers/nvme/target/auth.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
4444
dhchap_secret = kstrdup(secret, GFP_KERNEL);
4545
if (!dhchap_secret)
4646
return -ENOMEM;
47+
down_write(&nvmet_config_sem);
4748
if (set_ctrl) {
4849
kfree(host->dhchap_ctrl_secret);
4950
host->dhchap_ctrl_secret = strim(dhchap_secret);
@@ -53,6 +54,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
5354
host->dhchap_secret = strim(dhchap_secret);
5455
host->dhchap_key_hash = key_hash;
5556
}
57+
up_write(&nvmet_config_sem);
5658
return 0;
5759
}
5860

drivers/nvme/target/configfs.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,11 +1990,17 @@ static struct config_group nvmet_ports_group;
19901990
static ssize_t nvmet_host_dhchap_key_show(struct config_item *item,
19911991
char *page)
19921992
{
1993-
u8 *dhchap_secret = to_host(item)->dhchap_secret;
1993+
u8 *dhchap_secret;
1994+
ssize_t ret;
19941995

1996+
down_read(&nvmet_config_sem);
1997+
dhchap_secret = to_host(item)->dhchap_secret;
19951998
if (!dhchap_secret)
1996-
return sprintf(page, "\n");
1997-
return sprintf(page, "%s\n", dhchap_secret);
1999+
ret = sprintf(page, "\n");
2000+
else
2001+
ret = sprintf(page, "%s\n", dhchap_secret);
2002+
up_read(&nvmet_config_sem);
2003+
return ret;
19982004
}
19992005

20002006
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,
20182024
char *page)
20192025
{
20202026
u8 *dhchap_secret = to_host(item)->dhchap_ctrl_secret;
2027+
ssize_t ret;
20212028

2029+
down_read(&nvmet_config_sem);
2030+
dhchap_secret = to_host(item)->dhchap_ctrl_secret;
20222031
if (!dhchap_secret)
2023-
return sprintf(page, "\n");
2024-
return sprintf(page, "%s\n", dhchap_secret);
2032+
ret = sprintf(page, "\n");
2033+
else
2034+
ret = sprintf(page, "%s\n", dhchap_secret);
2035+
up_read(&nvmet_config_sem);
2036+
return ret;
20252037
}
20262038

20272039
static ssize_t nvmet_host_dhchap_ctrl_key_store(struct config_item *item,

0 commit comments

Comments
 (0)