kernfs: introduce kernfs_pin_sb()
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. ] Cc: <stable@vger.kernel.org> # 3.15 Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Li Zefan <lizefan@huawei.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
		
					parent
					
						
							
								970317aa48
							
						
					
				
			
			
				commit
				
					
						4e26445faa
					
				
			
		
					 2 changed files with 31 additions and 0 deletions
				
			
		|  | @ -211,6 +211,36 @@ void kernfs_kill_sb(struct super_block *sb) | ||||||
| 	kernfs_put(root_kn); | 	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) | void __init kernfs_init(void) | ||||||
| { | { | ||||||
| 	kernfs_node_cache = kmem_cache_create("kernfs_node_cache", | 	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, | 			       struct kernfs_root *root, unsigned long magic, | ||||||
| 			       bool *new_sb_created, const void *ns); | 			       bool *new_sb_created, const void *ns); | ||||||
| void kernfs_kill_sb(struct super_block *sb); | 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); | void kernfs_init(void); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Li Zefan
				Li Zefan