Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07b20889 authored by Ram Pai's avatar Ram Pai Committed by Linus Torvalds
Browse files

[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: default avatarRam Pai <linuxram@us.ibm.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 390c6843
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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

fs/pnode.c

0 → 100644
+17 −0
Original line number Diff line number Diff line
/*
 *  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;
}

fs/pnode.h

0 → 100644
+14 −0
Original line number Diff line number Diff line
/*
 *  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 */
+1 −0
Original line number Diff line number Diff line
@@ -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)
Loading