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
 
 #include <linux/mount.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
+#include "pnode.h"
 
 extern int __init init_rootfs(void);
 
        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.
  */
                                    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
 
--- /dev/null
+/*
+ *  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;
+}
 
--- /dev/null
+/*
+ *  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 */
 
 #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)
 
 #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 */