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

[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
...@@ -10,7 +10,7 @@ obj-y := open.o read_write.o file_table.o buffer.o bio.o super.o \ ...@@ -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 \ 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 \ 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 \ 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_INOTIFY) += inotify.o
obj-$(CONFIG_EPOLL) += eventpoll.o obj-$(CONFIG_EPOLL) += eventpoll.o
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/mount.h> #include <linux/mount.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include "pnode.h"
extern int __init init_rootfs(void); extern int __init init_rootfs(void);
...@@ -662,6 +663,27 @@ static int graft_tree(struct vfsmount *mnt, struct nameidata *nd) ...@@ -662,6 +663,27 @@ static int graft_tree(struct vfsmount *mnt, struct nameidata *nd)
return err; 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. * do loopback mount.
*/ */
...@@ -1091,6 +1113,8 @@ long do_mount(char *dev_name, char *dir_name, char *type_page, ...@@ -1091,6 +1113,8 @@ long do_mount(char *dev_name, char *dir_name, char *type_page,
data_page); data_page);
else if (flags & MS_BIND) else if (flags & MS_BIND)
retval = do_loopback(&nd, dev_name, flags & MS_REC); 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) else if (flags & MS_MOVE)
retval = do_move_mount(&nd, dev_name); retval = do_move_mount(&nd, dev_name);
else else
......
/*
* 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;
}
/*
* 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; ...@@ -104,6 +104,7 @@ extern int dir_notify_enable;
#define MS_MOVE 8192 #define MS_MOVE 8192
#define MS_REC 16384 #define MS_REC 16384
#define MS_VERBOSE 32768 #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_POSIXACL (1<<16) /* VFS does not apply the umask */
#define MS_ACTIVE (1<<30) #define MS_ACTIVE (1<<30)
#define MS_NOUSER (1<<31) #define MS_NOUSER (1<<31)
......
...@@ -17,12 +17,12 @@ ...@@ -17,12 +17,12 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#define MNT_NOSUID 1 #define MNT_NOSUID 0x01
#define MNT_NODEV 2 #define MNT_NODEV 0x02
#define MNT_NOEXEC 4 #define MNT_NOEXEC 0x04
#define MNT_PNODE_MASK 0x30 /* propogation flag mask */
struct vfsmount struct vfsmount {
{
struct list_head mnt_hash; struct list_head mnt_hash;
struct vfsmount *mnt_parent; /* fs we are mounted on */ struct vfsmount *mnt_parent; /* fs we are mounted on */
struct dentry *mnt_mountpoint; /* dentry of mountpoint */ struct dentry *mnt_mountpoint; /* dentry of mountpoint */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment