| From 87d2846fcf88113fae2341da1ca9a71f0d916f2c Mon Sep 17 00:00:00 2001 |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| Date: Wed, 13 May 2015 16:31:40 -0500 |
| Subject: sysfs: Add support for permanently empty directories to serve as mount points. |
| |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| |
| commit 87d2846fcf88113fae2341da1ca9a71f0d916f2c upstream. |
| |
| Add two functions sysfs_create_mount_point and |
| sysfs_remove_mount_point that hang a permanently empty directory off |
| of a kobject or remove a permanently emptpy directory hanging from a |
| kobject. Export these new functions so modular filesystems can use |
| them. |
| |
| Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/sysfs/dir.c | 34 ++++++++++++++++++++++++++++++++++ |
| include/linux/sysfs.h | 15 +++++++++++++++ |
| 2 files changed, 49 insertions(+) |
| |
| --- a/fs/sysfs/dir.c |
| +++ b/fs/sysfs/dir.c |
| @@ -121,3 +121,37 @@ int sysfs_move_dir_ns(struct kobject *ko |
| |
| return kernfs_rename_ns(kn, new_parent, kn->name, new_ns); |
| } |
| + |
| +/** |
| + * sysfs_create_mount_point - create an always empty directory |
| + * @parent_kobj: kobject that will contain this always empty directory |
| + * @name: The name of the always empty directory to add |
| + */ |
| +int sysfs_create_mount_point(struct kobject *parent_kobj, const char *name) |
| +{ |
| + struct kernfs_node *kn, *parent = parent_kobj->sd; |
| + |
| + kn = kernfs_create_empty_dir(parent, name); |
| + if (IS_ERR(kn)) { |
| + if (PTR_ERR(kn) == -EEXIST) |
| + sysfs_warn_dup(parent, name); |
| + return PTR_ERR(kn); |
| + } |
| + |
| + return 0; |
| +} |
| +EXPORT_SYMBOL_GPL(sysfs_create_mount_point); |
| + |
| +/** |
| + * sysfs_remove_mount_point - remove an always empty directory. |
| + * @parent_kobj: kobject that will contain this always empty directory |
| + * @name: The name of the always empty directory to remove |
| + * |
| + */ |
| +void sysfs_remove_mount_point(struct kobject *parent_kobj, const char *name) |
| +{ |
| + struct kernfs_node *parent = parent_kobj->sd; |
| + |
| + kernfs_remove_by_name_ns(parent, name, NULL); |
| +} |
| +EXPORT_SYMBOL_GPL(sysfs_remove_mount_point); |
| --- a/include/linux/sysfs.h |
| +++ b/include/linux/sysfs.h |
| @@ -195,6 +195,10 @@ int __must_check sysfs_rename_dir_ns(str |
| int __must_check sysfs_move_dir_ns(struct kobject *kobj, |
| struct kobject *new_parent_kobj, |
| const void *new_ns); |
| +int __must_check sysfs_create_mount_point(struct kobject *parent_kobj, |
| + const char *name); |
| +void sysfs_remove_mount_point(struct kobject *parent_kobj, |
| + const char *name); |
| |
| int __must_check sysfs_create_file_ns(struct kobject *kobj, |
| const struct attribute *attr, |
| @@ -283,6 +287,17 @@ static inline int sysfs_move_dir_ns(stru |
| return 0; |
| } |
| |
| +static inline int sysfs_create_mount_point(struct kobject *parent_kobj, |
| + const char *name) |
| +{ |
| + return 0; |
| +} |
| + |
| +static inline void sysfs_remove_mount_point(struct kobject *parent_kobj, |
| + const char *name) |
| +{ |
| +} |
| + |
| static inline int sysfs_create_file_ns(struct kobject *kobj, |
| const struct attribute *attr, |
| const void *ns) |