Loading fs/nfs/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading fs/nfs/inode.c +8 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ #include "pnfs.h" #include "nfs.h" #include "netns.h" #include "sysfs.h" #include "nfstrace.h" Loading Loading @@ -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; Loading Loading @@ -2245,6 +2250,8 @@ static int __init init_nfs_fs(void) out8: unregister_pernet_subsys(&nfs_net_ops); out9: nfs_sysfs_exit(); out10: return err; } Loading @@ -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 */ Loading fs/nfs/sysfs.c 0 → 100644 +69 −0 Original line number Diff line number Diff line // 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); } fs/nfs/sysfs.h 0 → 100644 +15 −0 Original line number Diff line number Diff line // 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 Loading
fs/nfs/Makefile +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
fs/nfs/inode.c +8 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ #include "pnfs.h" #include "nfs.h" #include "netns.h" #include "sysfs.h" #include "nfstrace.h" Loading Loading @@ -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; Loading Loading @@ -2245,6 +2250,8 @@ static int __init init_nfs_fs(void) out8: unregister_pernet_subsys(&nfs_net_ops); out9: nfs_sysfs_exit(); out10: return err; } Loading @@ -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 */ Loading
fs/nfs/sysfs.c 0 → 100644 +69 −0 Original line number Diff line number Diff line // 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); }
fs/nfs/sysfs.h 0 → 100644 +15 −0 Original line number Diff line number Diff line // 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