From: Hannes Reinecke <hare@kernel.org>
To: Andreas Hindborg <a.hindborg@kernel.org>,
Breno Leitao <leitao@debian.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Chaitanya Kulkarni <kch@nvidia.com>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-nvme@lists.infradead.org,
Hannes Reinecke <hare@kernel.org>
Subject: [PATCH RFC v3 11/12] nvmet: make configfs setup namespace aware
Date: Tue, 23 Jun 2026 11:15:56 +0200 [thread overview]
Message-ID: <20260623-configfs-ns-v3-11-841c100fd5dd@kernel.org> (raw)
In-Reply-To: <20260623-configfs-ns-v3-0-841c100fd5dd@kernel.org>
Implement 'fill_subsystem' and 'clear_subsystem' callbacks to make
nvmet configfs namespace aware.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/configfs.c | 103 +++++++++++++++++++++++++++++++----------
1 file changed, 78 insertions(+), 25 deletions(-)
diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c
index 9c761a7f98496d59aa993e3663f0b3da63b6d3c1..0c0f7719336d80e57a007e74ed542f6276f57fa0 100644
--- a/drivers/nvme/target/configfs.c
+++ b/drivers/nvme/target/configfs.c
@@ -1780,6 +1780,7 @@ static void nvmet_subsys_release(struct config_item *item)
{
struct nvmet_subsys *subsys = to_subsys(item);
+ configfs_remove_default_groups(&subsys->group);
nvmet_subsys_del_ctrls(subsys);
nvmet_subsys_put(subsys);
}
@@ -2072,6 +2073,7 @@ static void nvmet_port_release(struct config_item *item)
flush_workqueue(nvmet_wq);
nvmet_del_port_list(port);
+ configfs_remove_default_groups(&port->group);
key_put(port->keyring);
kfree(port->ana_state);
kfree(port);
@@ -2185,9 +2187,6 @@ static const struct config_item_type nvmet_ports_type = {
.ct_owner = THIS_MODULE,
};
-static struct config_group nvmet_subsystems_group;
-static struct config_group nvmet_ports_group;
-
#ifdef CONFIG_NVME_TARGET_AUTH
static ssize_t nvmet_host_dhchap_key_show(struct config_item *item,
char *page)
@@ -2369,8 +2368,6 @@ static const struct config_item_type nvmet_hosts_type = {
.ct_owner = THIS_MODULE,
};
-static struct config_group nvmet_hosts_group;
-
static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item,
char *page)
{
@@ -2384,9 +2381,11 @@ static ssize_t nvmet_root_discovery_nqn_show(struct config_item *item,
static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,
const char *page, size_t count)
{
+ struct config_item *subsystems_item;
+ struct config_group *subsystems_group;
struct nvmet_subsys *disc_subsys;
struct list_head *entry;
- char *old_nqn, *new_nqn;
+ char *old_nqn = NULL, *new_nqn;
size_t len;
len = strcspn(page, "\n");
@@ -2398,7 +2397,14 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,
return -ENOMEM;
down_write(&nvmet_config_sem);
- list_for_each(entry, &nvmet_subsystems_group.cg_children) {
+ subsystems_item = config_group_find_item(to_config_group(item), "subsystems");
+ if (WARN_ON(!subsystems_item)) {
+ kfree(new_nqn);
+ up_write(&nvmet_config_sem);
+ return -EINVAL;
+ }
+ subsystems_group = to_config_group(subsystems_item);
+ list_for_each(entry, &subsystems_group->cg_children) {
struct config_item *item =
container_of(entry, struct config_item, ci_entry);
@@ -2432,6 +2438,69 @@ static const struct config_item_type nvmet_root_type = {
.ct_owner = THIS_MODULE,
};
+static int nvmet_configfs_fill_subsystem(struct configfs_subsystem *subsys,
+ struct net *net_ns)
+{
+ struct config_group *subsystems_group, *ports_group, *hosts_group;
+ int err;
+
+ err = nvmet_add_disc_subsys(net_ns);
+ if (err < 0)
+ return err;
+
+ subsystems_group = kzalloc_obj(*subsystems_group);
+ if (!subsystems_group) {
+ nvmet_del_disc_subsys(net_ns);
+ return -ENOMEM;
+ }
+ config_group_init_type_name(subsystems_group,
+ "subsystems", &nvmet_subsystems_type);
+ configfs_add_default_group(subsystems_group,
+ &subsys->su_group);
+
+ ports_group = kzalloc_obj(*ports_group);
+ if (!ports_group) {
+ kfree(subsystems_group);
+ nvmet_del_disc_subsys(net_ns);
+ return -ENOMEM;
+ }
+ config_group_init_type_name(ports_group,
+ "ports", &nvmet_ports_type);
+ configfs_add_default_group(ports_group,
+ &subsys->su_group);
+
+ hosts_group = kzalloc_obj(*hosts_group);
+ if (!hosts_group) {
+ kfree(ports_group);
+ kfree(subsystems_group);
+ nvmet_del_disc_subsys(net_ns);
+ return -ENOMEM;
+ }
+ config_group_init_type_name(hosts_group,
+ "hosts", &nvmet_hosts_type);
+ configfs_add_default_group(hosts_group,
+ &subsys->su_group);
+ strscpy(subsys->su_group.cg_item.ci_namebuf, "nvmet",
+ sizeof(subsys->su_group.cg_item.ci_namebuf));
+ subsys->su_group.cg_item.ci_type = &nvmet_root_type;
+
+ return 0;
+}
+
+static void nvmet_configfs_clear_subsystem(struct configfs_subsystem *subsys,
+ struct net *net_ns)
+{
+ struct config_group *g, *n;
+
+ list_for_each_entry_safe(g, n, &subsys->su_group.default_groups,
+ group_entry) {
+ list_del(&g->group_entry);
+ config_item_put(&g->cg_item);
+ kfree(g);
+ }
+ nvmet_del_disc_subsys(net_ns);
+}
+
static struct configfs_subsystem nvmet_configfs_subsystem = {
.su_group = {
.cg_item = {
@@ -2439,30 +2508,14 @@ static struct configfs_subsystem nvmet_configfs_subsystem = {
.ci_type = &nvmet_root_type,
},
},
+ .fill_subsystem = nvmet_configfs_fill_subsystem,
+ .clear_subsystem = nvmet_configfs_clear_subsystem,
};
int __init nvmet_init_configfs(void)
{
int ret;
- config_group_init(&nvmet_configfs_subsystem.su_group);
- mutex_init(&nvmet_configfs_subsystem.su_mutex);
-
- config_group_init_type_name(&nvmet_subsystems_group,
- "subsystems", &nvmet_subsystems_type);
- configfs_add_default_group(&nvmet_subsystems_group,
- &nvmet_configfs_subsystem.su_group);
-
- config_group_init_type_name(&nvmet_ports_group,
- "ports", &nvmet_ports_type);
- configfs_add_default_group(&nvmet_ports_group,
- &nvmet_configfs_subsystem.su_group);
-
- config_group_init_type_name(&nvmet_hosts_group,
- "hosts", &nvmet_hosts_type);
- configfs_add_default_group(&nvmet_hosts_group,
- &nvmet_configfs_subsystem.su_group);
-
ret = configfs_register_subsystem(&nvmet_configfs_subsystem);
if (ret) {
pr_err("configfs_register_subsystem: %d\n", ret);
--
2.51.0
next prev parent reply other threads:[~2026-06-23 9:16 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-23 9:15 [PATCH RFC v3 00/12] namespace-aware configfs Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 01/12] fs/configfs: rework configfs_is_root() Hannes Reinecke
2026-06-23 12:50 ` Breno Leitao
2026-06-23 9:15 ` [PATCH RFC v3 02/12] fs/configfs: dynamically allocate super_info Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 03/12] fs/configfs: separate out configfs_{link,unlink}_root() Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 04/12] fs/configfs: add superblock as attribute to configfs_pin_fs() Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 05/12] fs/configfs: add 'fill_subsystem' and 'clear_subsystem' callbacks Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 06/12] fs/namespace: implement mnt_clone_direct() Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 07/12] fs/configfs: switch to get_tree_keyed() Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 08/12] fs/configfs: open-code simple_pin_fs() Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 09/12] nvmet: make discovery subsystem dynamic Hannes Reinecke
2026-06-23 9:15 ` [PATCH RFC v3 10/12] nvmet: per net-namespace port list Hannes Reinecke
2026-06-23 9:15 ` Hannes Reinecke [this message]
2026-06-23 9:15 ` [PATCH RFC v3 12/12] nvmet: enable transports for net namespaces Hannes Reinecke
2026-06-23 14:37 ` [syzbot ci] Re: namespace-aware configfs syzbot ci
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260623-configfs-ns-v3-11-841c100fd5dd@kernel.org \
--to=hare@kernel.org \
--cc=a.hindborg@kernel.org \
--cc=brauner@kernel.org \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=kch@nvidia.com \
--cc=leitao@debian.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®