mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	[PATCH] beginning of the shared-subtree proper
A private mount does not forward or receive propagation. This patch provides user the ability to convert any mount to private. Signed-off-by: Ram Pai <linuxram@us.ibm.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
							parent
							
								
									390c684367
								
							
						
					
					
						commit
						07b20889e3
					
				
					 6 changed files with 62 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -10,7 +10,7 @@ obj-y :=	open.o read_write.o file_table.o buffer.o  bio.o super.o \
 | 
			
		|||
		ioctl.o readdir.o select.o fifo.o locks.o dcache.o inode.o \
 | 
			
		||||
		attr.o bad_inode.o file.o filesystems.o namespace.o aio.o \
 | 
			
		||||
		seq_file.o xattr.o libfs.o fs-writeback.o mpage.o direct-io.o \
 | 
			
		||||
		ioprio.o
 | 
			
		||||
		ioprio.o pnode.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_INOTIFY)		+= inotify.o
 | 
			
		||||
obj-$(CONFIG_EPOLL)		+= eventpoll.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@
 | 
			
		|||
#include <linux/mount.h>
 | 
			
		||||
#include <asm/uaccess.h>
 | 
			
		||||
#include <asm/unistd.h>
 | 
			
		||||
#include "pnode.h"
 | 
			
		||||
 | 
			
		||||
extern int __init init_rootfs(void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -662,6 +663,27 @@ static int graft_tree(struct vfsmount *mnt, struct nameidata *nd)
 | 
			
		|||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * recursively change the type of the mountpoint.
 | 
			
		||||
 */
 | 
			
		||||
static int do_change_type(struct nameidata *nd, int flag)
 | 
			
		||||
{
 | 
			
		||||
	struct vfsmount *m, *mnt = nd->mnt;
 | 
			
		||||
	int recurse = flag & MS_REC;
 | 
			
		||||
	int type = flag & ~MS_REC;
 | 
			
		||||
 | 
			
		||||
	if (nd->dentry != nd->mnt->mnt_root)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	down_write(&namespace_sem);
 | 
			
		||||
	spin_lock(&vfsmount_lock);
 | 
			
		||||
	for (m = mnt; m; m = (recurse ? next_mnt(m, mnt) : NULL))
 | 
			
		||||
		change_mnt_propagation(m, type);
 | 
			
		||||
	spin_unlock(&vfsmount_lock);
 | 
			
		||||
	up_write(&namespace_sem);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * do loopback mount.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1091,6 +1113,8 @@ long do_mount(char *dev_name, char *dir_name, char *type_page,
 | 
			
		|||
				    data_page);
 | 
			
		||||
	else if (flags & MS_BIND)
 | 
			
		||||
		retval = do_loopback(&nd, dev_name, flags & MS_REC);
 | 
			
		||||
	else if (flags & MS_PRIVATE)
 | 
			
		||||
		retval = do_change_type(&nd, flags);
 | 
			
		||||
	else if (flags & MS_MOVE)
 | 
			
		||||
		retval = do_move_mount(&nd, dev_name);
 | 
			
		||||
	else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										17
									
								
								fs/pnode.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								fs/pnode.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  linux/fs/pnode.c
 | 
			
		||||
 *
 | 
			
		||||
 * (C) Copyright IBM Corporation 2005.
 | 
			
		||||
 *	Released under GPL v2.
 | 
			
		||||
 *	Author : Ram Pai (linuxram@us.ibm.com)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/namespace.h>
 | 
			
		||||
#include <linux/mount.h>
 | 
			
		||||
#include <linux/fs.h>
 | 
			
		||||
#include "pnode.h"
 | 
			
		||||
 | 
			
		||||
void change_mnt_propagation(struct vfsmount *mnt, int type)
 | 
			
		||||
{
 | 
			
		||||
	mnt->mnt_flags &= ~MNT_PNODE_MASK;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										14
									
								
								fs/pnode.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								fs/pnode.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
/*
 | 
			
		||||
 *  linux/fs/pnode.h
 | 
			
		||||
 *
 | 
			
		||||
 * (C) Copyright IBM Corporation 2005.
 | 
			
		||||
 *	Released under GPL v2.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _LINUX_PNODE_H
 | 
			
		||||
#define _LINUX_PNODE_H
 | 
			
		||||
 | 
			
		||||
#include <linux/list.h>
 | 
			
		||||
#include <linux/mount.h>
 | 
			
		||||
void change_mnt_propagation(struct vfsmount *, int);
 | 
			
		||||
#endif /* _LINUX_PNODE_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -104,6 +104,7 @@ extern int dir_notify_enable;
 | 
			
		|||
#define MS_MOVE		8192
 | 
			
		||||
#define MS_REC		16384
 | 
			
		||||
#define MS_VERBOSE	32768
 | 
			
		||||
#define MS_PRIVATE	(1<<18)	/* change to private */
 | 
			
		||||
#define MS_POSIXACL	(1<<16)	/* VFS does not apply the umask */
 | 
			
		||||
#define MS_ACTIVE	(1<<30)
 | 
			
		||||
#define MS_NOUSER	(1<<31)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,12 +17,12 @@
 | 
			
		|||
#include <linux/spinlock.h>
 | 
			
		||||
#include <asm/atomic.h>
 | 
			
		||||
 | 
			
		||||
#define MNT_NOSUID	1
 | 
			
		||||
#define MNT_NODEV	2
 | 
			
		||||
#define MNT_NOEXEC	4
 | 
			
		||||
#define MNT_NOSUID	0x01
 | 
			
		||||
#define MNT_NODEV	0x02
 | 
			
		||||
#define MNT_NOEXEC	0x04
 | 
			
		||||
#define MNT_PNODE_MASK	0x30	/* propogation flag mask */
 | 
			
		||||
 | 
			
		||||
struct vfsmount
 | 
			
		||||
{
 | 
			
		||||
struct vfsmount {
 | 
			
		||||
	struct list_head mnt_hash;
 | 
			
		||||
	struct vfsmount *mnt_parent;	/* fs we are mounted on */
 | 
			
		||||
	struct dentry *mnt_mountpoint;	/* dentry of mountpoint */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue