vfs: introduce clone_private_mount()
Overlayfs needs a private clone of the mount, so create a function for this and export to modules. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:
		
					parent
					
						
							
								bd5d08569c
							
						
					
				
			
			
				commit
				
					
						c771d683a6
					
				
			
		
					 2 changed files with 30 additions and 0 deletions
				
			
		|  | @ -1686,6 +1686,33 @@ void drop_collected_mounts(struct vfsmount *mnt) | ||||||
| 	namespace_unlock(); | 	namespace_unlock(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * clone_private_mount - create a private clone of a path | ||||||
|  |  * | ||||||
|  |  * This creates a new vfsmount, which will be the clone of @path.  The new will | ||||||
|  |  * not be attached anywhere in the namespace and will be private (i.e. changes | ||||||
|  |  * to the originating mount won't be propagated into this). | ||||||
|  |  * | ||||||
|  |  * Release with mntput(). | ||||||
|  |  */ | ||||||
|  | struct vfsmount *clone_private_mount(struct path *path) | ||||||
|  | { | ||||||
|  | 	struct mount *old_mnt = real_mount(path->mnt); | ||||||
|  | 	struct mount *new_mnt; | ||||||
|  | 
 | ||||||
|  | 	if (IS_MNT_UNBINDABLE(old_mnt)) | ||||||
|  | 		return ERR_PTR(-EINVAL); | ||||||
|  | 
 | ||||||
|  | 	down_read(&namespace_sem); | ||||||
|  | 	new_mnt = clone_mnt(old_mnt, path->dentry, CL_PRIVATE); | ||||||
|  | 	up_read(&namespace_sem); | ||||||
|  | 	if (IS_ERR(new_mnt)) | ||||||
|  | 		return ERR_CAST(new_mnt); | ||||||
|  | 
 | ||||||
|  | 	return &new_mnt->mnt; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(clone_private_mount); | ||||||
|  | 
 | ||||||
| int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, | int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, | ||||||
| 		   struct vfsmount *root) | 		   struct vfsmount *root) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -81,6 +81,9 @@ extern struct vfsmount *mntget(struct vfsmount *mnt); | ||||||
| extern struct vfsmount *mnt_clone_internal(struct path *path); | extern struct vfsmount *mnt_clone_internal(struct path *path); | ||||||
| extern int __mnt_is_readonly(struct vfsmount *mnt); | extern int __mnt_is_readonly(struct vfsmount *mnt); | ||||||
| 
 | 
 | ||||||
|  | struct path; | ||||||
|  | extern struct vfsmount *clone_private_mount(struct path *path); | ||||||
|  | 
 | ||||||
| struct file_system_type; | struct file_system_type; | ||||||
| extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, | extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, | ||||||
| 				      int flags, const char *name, | 				      int flags, const char *name, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miklos Szeredi
				Miklos Szeredi