From: Anna Schumaker <Anna.Schumaker@xxxxxxxxxx> For network namespace separation. Signed-off-by: Anna Schumaker <Anna.Schumaker@xxxxxxxxxx> --- net/sunrpc/sysfs.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/net/sunrpc/sysfs.c b/net/sunrpc/sysfs.c index fbb8db50eb29..ad6a5de5927c 100644 --- a/net/sunrpc/sysfs.c +++ b/net/sunrpc/sysfs.c @@ -2,19 +2,60 @@ /* * Copyright (c) 2020 Anna Schumaker <Anna.Schumaker@xxxxxxxxxx> */ +#include <linux/sunrpc/clnt.h> #include <linux/kobject.h> +struct kobject *rpc_client_kobj; static struct kset *rpc_client_kset; +static void rpc_netns_object_release(struct kobject *kobj) +{ + kfree(kobj); +} + +static const struct kobj_ns_type_operations *rpc_netns_object_child_ns_type( + struct kobject *kobj) +{ + return &net_ns_type_operations; +} + +static struct kobj_type rpc_netns_object_type = { + .release = rpc_netns_object_release, + .sysfs_ops = &kobj_sysfs_ops, + .child_ns_type = rpc_netns_object_child_ns_type, +}; + +static struct kobject *rpc_netns_object_alloc(const char *name, + struct kset *kset, struct kobject *parent) +{ + struct kobject *kobj; + kobj = kzalloc(sizeof(*kobj), GFP_KERNEL); + if (kobj) { + kobj->kset = kset; + if (kobject_init_and_add(kobj, &rpc_netns_object_type, + parent, "%s", name) == 0) + return kobj; + kobject_put(kobj); + } + return NULL; +} + int rpc_sysfs_init(void) { rpc_client_kset = kset_create_and_add("sunrpc", NULL, kernel_kobj); if (!rpc_client_kset) return -ENOMEM; + rpc_client_kobj = rpc_netns_object_alloc("net", rpc_client_kset, NULL); + if (!rpc_client_kobj) { + kset_unregister(rpc_client_kset); + rpc_client_kset = NULL; + return -ENOMEM; + } return 0; } void rpc_sysfs_exit(void) { + kobject_put(rpc_client_kobj); kset_unregister(rpc_client_kset); } -- 2.29.2