[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:
Родитель
390c684367
Коммит
07b20889e3
|
@ -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 @@
|
||||||
#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 @@ out_unlock:
|
||||||
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,
|
||||||
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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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_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 @@
|
||||||
#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 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче