mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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,
 | 
			
		||||
		   struct vfsmount *root)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -81,6 +81,9 @@ extern struct vfsmount *mntget(struct vfsmount *mnt);
 | 
			
		|||
extern struct vfsmount *mnt_clone_internal(struct path *path);
 | 
			
		||||
extern int __mnt_is_readonly(struct vfsmount *mnt);
 | 
			
		||||
 | 
			
		||||
struct path;
 | 
			
		||||
extern struct vfsmount *clone_private_mount(struct path *path);
 | 
			
		||||
 | 
			
		||||
struct file_system_type;
 | 
			
		||||
extern struct vfsmount *vfs_kern_mount(struct file_system_type *type,
 | 
			
		||||
				      int flags, const char *name,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue