[RFC PATCH 3/7] sunrpc: Create a net/ subdirectory in the sunrpc sysfs

schumaker.anna
2021-01-11T21:42:43Z

For network namespace separation.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
---
net/sunrpc/sysfs.c | 41 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/net/sunrpc/sysfs.c b/net/sunrpc/sysfs.c
index efff6977095c..afeaec79a9c7 100644
--- a/net/sunrpc/sysfs.c
+++ b/net/sunrpc/sysfs.c
@@ -4,18 +4,57 @@
*/
#include <net/sock.h>

-//struct kobject *rpc_client_kobj;
+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, net_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