[PATCH] beginning of the shared-subtree proper
authorRam Pai <linuxram@us.ibm.com>
Mon, 7 Nov 2005 22:19:07 +0000 (17:19 -0500)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 8 Nov 2005 02:18:10 +0000 (18:18 -0800)
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>
fs/Makefile
fs/namespace.c
fs/pnode.c [new file with mode: 0644]
fs/pnode.h [new file with mode: 0644]
include/linux/fs.h
include/linux/mount.h

index 1972da1..4c26557 100644 (file)
@@ -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
index 4abee9a..3782923 100644 (file)
@@ -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 @@ out_unlock:
        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
diff --cc fs/pnode.c
Simple merge
diff --cc fs/pnode.h
Simple merge
Simple merge
Simple merge