]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFS: Create a root NFS directory in /sys/fs/nfs
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 24 Jan 2019 21:10:46 +0000 (16:10 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 6 Jul 2019 18:54:49 +0000 (14:54 -0400)
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/Makefile
fs/nfs/inode.c
fs/nfs/sysfs.c [new file with mode: 0644]
fs/nfs/sysfs.h [new file with mode: 0644]

index c587e3c4c6a6765ea901dae41f9b9b1c6b84162f..34cdeaecccf6cd9111abf9cacc45d675d484bf64 100644 (file)
@@ -8,7 +8,8 @@ obj-$(CONFIG_NFS_FS) += nfs.o
 CFLAGS_nfstrace.o += -I$(src)
 nfs-y                  := client.o dir.o file.o getroot.o inode.o super.o \
                           io.o direct.o pagelist.o read.o symlink.o unlink.o \
-                          write.o namespace.o mount_clnt.o nfstrace.o export.o
+                          write.o namespace.o mount_clnt.o nfstrace.o \
+                          export.o sysfs.o
 nfs-$(CONFIG_ROOT_NFS) += nfsroot.o
 nfs-$(CONFIG_SYSCTL)   += sysctl.o
 nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o
index 53777813ca95fbf0facd0b7be9d5e9eb542d9500..8dba56491de2972eaad35c6da42317b7b1cc27e9 100644 (file)
@@ -51,6 +51,7 @@
 #include "pnfs.h"
 #include "nfs.h"
 #include "netns.h"
+#include "sysfs.h"
 
 #include "nfstrace.h"
 
@@ -2182,6 +2183,10 @@ static int __init init_nfs_fs(void)
 {
        int err;
 
+       err = nfs_sysfs_init();
+       if (err < 0)
+               goto out10;
+
        err = register_pernet_subsys(&nfs_net_ops);
        if (err < 0)
                goto out9;
@@ -2245,6 +2250,8 @@ out7:
 out8:
        unregister_pernet_subsys(&nfs_net_ops);
 out9:
+       nfs_sysfs_exit();
+out10:
        return err;
 }
 
@@ -2261,6 +2268,7 @@ static void __exit exit_nfs_fs(void)
        unregister_nfs_fs();
        nfs_fs_proc_exit();
        nfsiod_stop();
+       nfs_sysfs_exit();
 }
 
 /* Not quite true; I just maintain it */
diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
new file mode 100644 (file)
index 0000000..7070711
--- /dev/null
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Hammerspace Inc
+ */
+
+#include <linux/module.h>
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/fs.h>
+#include <linux/slab.h>
+#include <linux/netdevice.h>
+
+#include "sysfs.h"
+
+struct kobject *nfs_client_kobj;
+static struct kset *nfs_client_kset;
+
+static void nfs_netns_object_release(struct kobject *kobj)
+{
+       kfree(kobj);
+}
+
+static const struct kobj_ns_type_operations *nfs_netns_object_child_ns_type(
+               struct kobject *kobj)
+{
+       return &net_ns_type_operations;
+}
+
+static struct kobj_type nfs_netns_object_type = {
+       .release = nfs_netns_object_release,
+       .sysfs_ops = &kobj_sysfs_ops,
+       .child_ns_type = nfs_netns_object_child_ns_type,
+};
+
+static struct kobject *nfs_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, &nfs_netns_object_type,
+                                       parent, "%s", name) == 0)
+                       return kobj;
+               kobject_put(kobj);
+       }
+       return NULL;
+}
+
+int nfs_sysfs_init(void)
+{
+       nfs_client_kset = kset_create_and_add("nfs", NULL, fs_kobj);
+       if (!nfs_client_kset)
+               return -ENOMEM;
+       nfs_client_kobj = nfs_netns_object_alloc("net", nfs_client_kset, NULL);
+       if  (!nfs_client_kobj) {
+               kset_unregister(nfs_client_kset);
+               nfs_client_kset = NULL;
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+void nfs_sysfs_exit(void)
+{
+       kobject_put(nfs_client_kobj);
+       kset_unregister(nfs_client_kset);
+}
diff --git a/fs/nfs/sysfs.h b/fs/nfs/sysfs.h
new file mode 100644 (file)
index 0000000..666f8db
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2019 Hammerspace Inc
+ */
+
+#ifndef __NFS_SYSFS_H
+#define __NFS_SYSFS_H
+
+
+extern struct kobject *nfs_client_kobj;
+
+extern int nfs_sysfs_init(void);
+extern void nfs_sysfs_exit(void);
+
+#endif