introduce shared mounts
PATCH 11/18 introduce shared mounts
From: Ram Pai <[email protected]>
Date: 1131401973 -0500
Creates shared mounts. A shared mount when bind-mounted to some mountpoint, propagates mount/umount events to each other. All the shared mounts that propagate events to each other belong to the same peer-group.
Signed-off-by Ram Pai ([email protected])
Signed-off-by Al Viro <[email protected]>
---
fs/namespace.c | 3 ++- fs/pnode.c | 13 ++++++++++++- fs/pnode.h | 4 ++++ include/linux/fs.h | 1 + include/linux/mount.h | 2 ++ 5 files changed, 21 insertions(+), 2 deletions(-)
2fcec0f04ac5906f647d8e004a8091e48974b952
fs/namespace.c +2 -1
@@ -68,6 +68,7 @@ struct vfsmount *alloc_vfsmnt(const charINIT_LIST_HEAD (&mnt->mnt_mounts);INIT_LIST_HEAD (&mnt->mnt_list);INIT_LIST_HEAD (&mnt->mnt_expire); +INIT_LIST_HEAD (&mnt->mnt_share);if (name) {int size =strlen (name) +1 ;char *newname =kmalloc (size,GFP_KERNEL );
@@ -1113,7 +1114,7 @@ long do_mount(char *dev_name, char *dir_ data_page); else if (flags & MS_BIND) retval =do_loopback (&nd, dev_name, flags &MS_REC ); - else if (flags & MS_PRIVATE) + else if (flags & (MS_SHARED | MS_PRIVATE)) retval =do_change_type (&nd, flags); else if (flags & MS_MOVE) retval =do_move_mount (&nd, dev_name);
fs/pnode.c +12 -1
@@ -11,7 +11,18 @@#include <linux/fs.h> #include "pnode.h" +/* return the next shared peer mount of @p */ +static inline struct vfsmount *next_peer (struct vfsmount *p) +{ + return list_entry(p->mnt_share.next, struct vfsmount, mnt_share); +} +void change_mnt_propagation (struct vfsmount *mnt,int type) { - mnt->mnt_flags &= ~MNT_PNODE_MASK ; +if (type ==MS_SHARED ) { + mnt->mnt_flags |=MNT_SHARED ; + }else { +list_del_init (&mnt->mnt_share); + mnt->mnt_flags &= ~MNT_PNODE_MASK ; + } }
fs/pnode.h +4 -0
@@ -10,5 +10,9 @@#include <linux/list.h> #include <linux/mount.h> + +#define IS_MNT_SHARED (mnt) (mnt->mnt_flags & MNT_SHARED) +#define CLEAR_MNT_SHARED (mnt) (mnt->mnt_flags &= ~MNT_SHARED) +void change_mnt_propagation (struct vfsmount *,int );#endif /* _LINUX_PNODE_H */
include/linux/fs.h +1 -0
@@ -105,6 +105,7 @@ extern int dir_notify_enable;#define MS_REC 16384#define MS_VERBOSE 32768#define MS_PRIVATE (1<<18)/* change to private */ +#define MS_SHARED (1<<20)/* change to shared */ #define MS_POSIXACL (1<<16)/* VFS does not apply the umask */ #define MS_ACTIVE (1<<30)#define MS_NOUSER (1<<31)
include/linux/mount.h +2 -0
@@ -20,6 +20,7 @@#define MNT_NOSUID 0x01#define MNT_NODEV 0x02#define MNT_NOEXEC 0x04 +#define MNT_SHARED 0x10/* if the vfsmount is a shared mount */ #define MNT_PNODE_MASK 0x30/* propogation flag mask */ struct vfsmount {
@@ -36,6 +37,7 @@ struct vfsmount {char *mnt_devname;/* Name of device e.g. /dev/dsk/hda1 */ struct list_head mnt_list;struct list_head mnt_expire;/* link in fs-specific expiry list */ +struct list_head mnt_share;/* circular list of shared mounts */ struct namespace *mnt_namespace;/* containing namespace */ int mnt_pinned; };