mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
kernfs: introduce kernfs_pin_sb()
commit 4e26445faa upstream.
kernfs_pin_sb() tries to get a refcnt of the superblock.
This will be used by cgroupfs.
v2:
- make kernfs_pin_sb() return the superblock.
- drop kernfs_drop_sb().
tj: Updated the comment a bit.
[ This is a prerequisite for a bugfix. ]
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Li Zefan <lizefan@huawei.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0b2332fbef
commit
f5fc1ec5e8
@@ -211,6 +211,36 @@ void kernfs_kill_sb(struct super_block *sb)
|
||||
kernfs_put(root_kn);
|
||||
}
|
||||
|
||||
/**
|
||||
* kernfs_pin_sb: try to pin the superblock associated with a kernfs_root
|
||||
* @kernfs_root: the kernfs_root in question
|
||||
* @ns: the namespace tag
|
||||
*
|
||||
* Pin the superblock so the superblock won't be destroyed in subsequent
|
||||
* operations. This can be used to block ->kill_sb() which may be useful
|
||||
* for kernfs users which dynamically manage superblocks.
|
||||
*
|
||||
* Returns NULL if there's no superblock associated to this kernfs_root, or
|
||||
* -EINVAL if the superblock is being freed.
|
||||
*/
|
||||
struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns)
|
||||
{
|
||||
struct kernfs_super_info *info;
|
||||
struct super_block *sb = NULL;
|
||||
|
||||
mutex_lock(&kernfs_mutex);
|
||||
list_for_each_entry(info, &root->supers, node) {
|
||||
if (info->ns == ns) {
|
||||
sb = info->sb;
|
||||
if (!atomic_inc_not_zero(&info->sb->s_active))
|
||||
sb = ERR_PTR(-EINVAL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&kernfs_mutex);
|
||||
return sb;
|
||||
}
|
||||
|
||||
void __init kernfs_init(void)
|
||||
{
|
||||
kernfs_node_cache = kmem_cache_create("kernfs_node_cache",
|
||||
|
||||
@@ -304,6 +304,7 @@ struct dentry *kernfs_mount_ns(struct file_system_type *fs_type, int flags,
|
||||
struct kernfs_root *root, unsigned long magic,
|
||||
bool *new_sb_created, const void *ns);
|
||||
void kernfs_kill_sb(struct super_block *sb);
|
||||
struct super_block *kernfs_pin_sb(struct kernfs_root *root, const void *ns);
|
||||
|
||||
void kernfs_init(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user