Loading fs/dcache.c +1 −1 Original line number Diff line number Diff line Loading @@ -2503,7 +2503,7 @@ global_root: if (!slash) error = prepend(buffer, buflen, "/", 1); if (!error) error = vfsmnt->mnt_ns ? 1 : 2; error = real_mount(vfsmnt)->mnt_ns ? 1 : 2; goto out; } Loading fs/mount.h +1 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ struct mount { struct list_head mnt_slave_list;/* list of slave mounts */ struct list_head mnt_slave; /* slave list entry */ struct mount *mnt_master; /* slave is on master->mnt_slave_list */ struct mnt_namespace *mnt_ns; /* containing namespace */ }; static inline struct mount *real_mount(struct vfsmount *mnt) Loading fs/namespace.c +23 −22 Original line number Diff line number Diff line Loading @@ -505,7 +505,7 @@ struct vfsmount *lookup_mnt(struct path *path) } } static inline int check_mnt(struct vfsmount *mnt) static inline int check_mnt(struct mount *mnt) { return mnt->mnt_ns == current->nsproxy->mnt_ns; } Loading Loading @@ -614,13 +614,13 @@ static void commit_tree(struct mount *mnt) struct mount *parent = mnt->mnt_parent; struct mount *m; LIST_HEAD(head); struct mnt_namespace *n = parent->mnt.mnt_ns; struct mnt_namespace *n = parent->mnt_ns; BUG_ON(parent == mnt); list_add_tail(&head, &mnt->mnt.mnt_list); list_for_each_entry(m, &head, mnt.mnt_list) { m->mnt.mnt_ns = n; m->mnt_ns = n; __mnt_make_longterm(m); } Loading Loading @@ -1234,8 +1234,8 @@ void umount_tree(struct mount *mnt, int propagate, struct list_head *kill) list_for_each_entry(p, &tmp_list, mnt_hash) { list_del_init(&p->mnt_expire); list_del_init(&p->mnt.mnt_list); __touch_mnt_namespace(p->mnt.mnt_ns); p->mnt.mnt_ns = NULL; __touch_mnt_namespace(p->mnt_ns); p->mnt_ns = NULL; __mnt_make_shortterm(p); list_del_init(&p->mnt_child); if (mnt_has_parent(p)) { Loading Loading @@ -1367,7 +1367,7 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags) retval = -EINVAL; if (path.dentry != path.mnt->mnt_root) goto dput_and_out; if (!check_mnt(path.mnt)) if (!check_mnt(mnt)) goto dput_and_out; retval = -EPERM; Loading Loading @@ -1619,7 +1619,7 @@ static int attach_recursive_mnt(struct mount *source_mnt, if (parent_path) { detach_mnt(source_mnt, parent_path); attach_mnt(source_mnt, path); touch_mnt_namespace(parent_path->mnt->mnt_ns); touch_mnt_namespace(source_mnt->mnt_ns); } else { mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt); commit_tree(source_mnt); Loading Loading @@ -1765,7 +1765,7 @@ static int do_loopback(struct path *path, char *old_name, if (IS_MNT_UNBINDABLE(old_path.mnt)) goto out2; if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) if (!check_mnt(real_mount(path->mnt)) || !check_mnt(old)) goto out2; err = -ENOMEM; Loading Loading @@ -1818,11 +1818,12 @@ static int do_remount(struct path *path, int flags, int mnt_flags, { int err; struct super_block *sb = path->mnt->mnt_sb; struct mount *mnt = real_mount(path->mnt); if (!capable(CAP_SYS_ADMIN)) return -EPERM; if (!check_mnt(path->mnt)) if (!check_mnt(mnt)) return -EINVAL; if (path->dentry != path->mnt->mnt_root) Loading @@ -1839,14 +1840,14 @@ static int do_remount(struct path *path, int flags, int mnt_flags, err = do_remount_sb(sb, flags, data, 0); if (!err) { br_write_lock(vfsmount_lock); mnt_flags |= path->mnt->mnt_flags & MNT_PROPAGATION_MASK; path->mnt->mnt_flags = mnt_flags; mnt_flags |= mnt->mnt.mnt_flags & MNT_PROPAGATION_MASK; mnt->mnt.mnt_flags = mnt_flags; br_write_unlock(vfsmount_lock); } up_write(&sb->s_umount); if (!err) { br_write_lock(vfsmount_lock); touch_mnt_namespace(path->mnt->mnt_ns); touch_mnt_namespace(mnt->mnt_ns); br_write_unlock(vfsmount_lock); } return err; Loading Loading @@ -1880,8 +1881,10 @@ static int do_move_mount(struct path *path, char *old_name) if (err < 0) goto out; old = real_mount(old_path.mnt); err = -EINVAL; if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) if (!check_mnt(real_mount(path->mnt)) || !check_mnt(old)) goto out1; if (d_unlinked(path->dentry)) Loading @@ -1891,8 +1894,6 @@ static int do_move_mount(struct path *path, char *old_name) if (old_path.dentry != old_path.mnt->mnt_root) goto out1; old = real_mount(old_path.mnt); if (!mnt_has_parent(old)) goto out1; Loading Loading @@ -1984,7 +1985,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags) return err; err = -EINVAL; if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(path->mnt)) if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(real_mount(path->mnt))) goto unlock; /* Refuse the same filesystem on the same mount point */ Loading Loading @@ -2112,7 +2113,7 @@ void mark_mounts_for_expiry(struct list_head *mounts) } while (!list_empty(&graveyard)) { mnt = list_first_entry(&graveyard, struct mount, mnt_expire); touch_mnt_namespace(mnt->mnt.mnt_ns); touch_mnt_namespace(mnt->mnt_ns); umount_tree(mnt, 1, &umounts); } br_write_unlock(vfsmount_lock); Loading Loading @@ -2185,7 +2186,7 @@ static void shrink_submounts(struct mount *mnt, struct list_head *umounts) while (!list_empty(&graveyard)) { m = list_first_entry(&graveyard, struct mount, mnt_expire); touch_mnt_namespace(m->mnt.mnt_ns); touch_mnt_namespace(m->mnt_ns); umount_tree(m, 1, umounts); } } Loading Loading @@ -2423,7 +2424,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns, p = real_mount(mnt_ns->root); q = new; while (p) { q->mnt.mnt_ns = new_ns; q->mnt_ns = new_ns; __mnt_make_longterm(q); if (fs) { if (&p->mnt == fs->root.mnt) { Loading Loading @@ -2479,7 +2480,7 @@ static struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt) new_ns = alloc_mnt_ns(); if (!IS_ERR(new_ns)) { mnt->mnt_ns = new_ns; real_mount(mnt)->mnt_ns = new_ns; __mnt_make_longterm(real_mount(mnt)); new_ns->root = mnt; list_add(&new_ns->list, &new_ns->root->mnt_list); Loading Loading @@ -2644,7 +2645,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root, IS_MNT_SHARED(&new_mnt->mnt_parent->mnt) || IS_MNT_SHARED(&root_mnt->mnt_parent->mnt)) goto out4; if (!check_mnt(root.mnt) || !check_mnt(new.mnt)) if (!check_mnt(root_mnt) || !check_mnt(new_mnt)) goto out4; error = -ENOENT; if (d_unlinked(new.dentry)) Loading Loading @@ -2793,5 +2794,5 @@ EXPORT_SYMBOL(kern_unmount); bool our_mnt(struct vfsmount *mnt) { return check_mnt(mnt); return check_mnt(real_mount(mnt)); } fs/pnode.c +5 −5 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ static struct mount *get_peer_under_root(struct mount *mnt, do { /* Check the namespace first for optimization */ if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) return m; m = next_peer(m); Loading @@ -56,7 +56,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) struct mount *m; for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); if (d) return d->mnt.mnt_group_id; } Loading Loading @@ -145,7 +145,7 @@ static struct mount *propagation_next(struct mount *m, struct mount *origin) { /* are there any slaves of this mount? */ if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt_slave_list)) if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) return first_slave(m); while (1) { Loading Loading @@ -189,7 +189,7 @@ static struct mount *get_source(struct mount *dest, if (p_last_dest) { do { p_last_dest = next_peer(p_last_dest); } while (IS_MNT_NEW(&p_last_dest->mnt)); } while (IS_MNT_NEW(p_last_dest)); /* is that a peer of the earlier? */ if (dest == p_last_dest) { *type = CL_MAKE_SHARED; Loading Loading @@ -232,7 +232,7 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, int type; struct mount *source; if (IS_MNT_NEW(&m->mnt)) if (IS_MNT_NEW(m)) continue; source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); Loading include/linux/mount.h +0 −1 Original line number Diff line number Diff line Loading @@ -58,7 +58,6 @@ struct vfsmount { #endif const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ struct list_head mnt_list; struct mnt_namespace *mnt_ns; /* containing namespace */ int mnt_id; /* mount identifier */ int mnt_group_id; /* peer group identifier */ int mnt_expiry_mark; /* true if marked for expiry */ Loading Loading
fs/dcache.c +1 −1 Original line number Diff line number Diff line Loading @@ -2503,7 +2503,7 @@ global_root: if (!slash) error = prepend(buffer, buflen, "/", 1); if (!error) error = vfsmnt->mnt_ns ? 1 : 2; error = real_mount(vfsmnt)->mnt_ns ? 1 : 2; goto out; } Loading
fs/mount.h +1 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ struct mount { struct list_head mnt_slave_list;/* list of slave mounts */ struct list_head mnt_slave; /* slave list entry */ struct mount *mnt_master; /* slave is on master->mnt_slave_list */ struct mnt_namespace *mnt_ns; /* containing namespace */ }; static inline struct mount *real_mount(struct vfsmount *mnt) Loading
fs/namespace.c +23 −22 Original line number Diff line number Diff line Loading @@ -505,7 +505,7 @@ struct vfsmount *lookup_mnt(struct path *path) } } static inline int check_mnt(struct vfsmount *mnt) static inline int check_mnt(struct mount *mnt) { return mnt->mnt_ns == current->nsproxy->mnt_ns; } Loading Loading @@ -614,13 +614,13 @@ static void commit_tree(struct mount *mnt) struct mount *parent = mnt->mnt_parent; struct mount *m; LIST_HEAD(head); struct mnt_namespace *n = parent->mnt.mnt_ns; struct mnt_namespace *n = parent->mnt_ns; BUG_ON(parent == mnt); list_add_tail(&head, &mnt->mnt.mnt_list); list_for_each_entry(m, &head, mnt.mnt_list) { m->mnt.mnt_ns = n; m->mnt_ns = n; __mnt_make_longterm(m); } Loading Loading @@ -1234,8 +1234,8 @@ void umount_tree(struct mount *mnt, int propagate, struct list_head *kill) list_for_each_entry(p, &tmp_list, mnt_hash) { list_del_init(&p->mnt_expire); list_del_init(&p->mnt.mnt_list); __touch_mnt_namespace(p->mnt.mnt_ns); p->mnt.mnt_ns = NULL; __touch_mnt_namespace(p->mnt_ns); p->mnt_ns = NULL; __mnt_make_shortterm(p); list_del_init(&p->mnt_child); if (mnt_has_parent(p)) { Loading Loading @@ -1367,7 +1367,7 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags) retval = -EINVAL; if (path.dentry != path.mnt->mnt_root) goto dput_and_out; if (!check_mnt(path.mnt)) if (!check_mnt(mnt)) goto dput_and_out; retval = -EPERM; Loading Loading @@ -1619,7 +1619,7 @@ static int attach_recursive_mnt(struct mount *source_mnt, if (parent_path) { detach_mnt(source_mnt, parent_path); attach_mnt(source_mnt, path); touch_mnt_namespace(parent_path->mnt->mnt_ns); touch_mnt_namespace(source_mnt->mnt_ns); } else { mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt); commit_tree(source_mnt); Loading Loading @@ -1765,7 +1765,7 @@ static int do_loopback(struct path *path, char *old_name, if (IS_MNT_UNBINDABLE(old_path.mnt)) goto out2; if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) if (!check_mnt(real_mount(path->mnt)) || !check_mnt(old)) goto out2; err = -ENOMEM; Loading Loading @@ -1818,11 +1818,12 @@ static int do_remount(struct path *path, int flags, int mnt_flags, { int err; struct super_block *sb = path->mnt->mnt_sb; struct mount *mnt = real_mount(path->mnt); if (!capable(CAP_SYS_ADMIN)) return -EPERM; if (!check_mnt(path->mnt)) if (!check_mnt(mnt)) return -EINVAL; if (path->dentry != path->mnt->mnt_root) Loading @@ -1839,14 +1840,14 @@ static int do_remount(struct path *path, int flags, int mnt_flags, err = do_remount_sb(sb, flags, data, 0); if (!err) { br_write_lock(vfsmount_lock); mnt_flags |= path->mnt->mnt_flags & MNT_PROPAGATION_MASK; path->mnt->mnt_flags = mnt_flags; mnt_flags |= mnt->mnt.mnt_flags & MNT_PROPAGATION_MASK; mnt->mnt.mnt_flags = mnt_flags; br_write_unlock(vfsmount_lock); } up_write(&sb->s_umount); if (!err) { br_write_lock(vfsmount_lock); touch_mnt_namespace(path->mnt->mnt_ns); touch_mnt_namespace(mnt->mnt_ns); br_write_unlock(vfsmount_lock); } return err; Loading Loading @@ -1880,8 +1881,10 @@ static int do_move_mount(struct path *path, char *old_name) if (err < 0) goto out; old = real_mount(old_path.mnt); err = -EINVAL; if (!check_mnt(path->mnt) || !check_mnt(old_path.mnt)) if (!check_mnt(real_mount(path->mnt)) || !check_mnt(old)) goto out1; if (d_unlinked(path->dentry)) Loading @@ -1891,8 +1894,6 @@ static int do_move_mount(struct path *path, char *old_name) if (old_path.dentry != old_path.mnt->mnt_root) goto out1; old = real_mount(old_path.mnt); if (!mnt_has_parent(old)) goto out1; Loading Loading @@ -1984,7 +1985,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags) return err; err = -EINVAL; if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(path->mnt)) if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(real_mount(path->mnt))) goto unlock; /* Refuse the same filesystem on the same mount point */ Loading Loading @@ -2112,7 +2113,7 @@ void mark_mounts_for_expiry(struct list_head *mounts) } while (!list_empty(&graveyard)) { mnt = list_first_entry(&graveyard, struct mount, mnt_expire); touch_mnt_namespace(mnt->mnt.mnt_ns); touch_mnt_namespace(mnt->mnt_ns); umount_tree(mnt, 1, &umounts); } br_write_unlock(vfsmount_lock); Loading Loading @@ -2185,7 +2186,7 @@ static void shrink_submounts(struct mount *mnt, struct list_head *umounts) while (!list_empty(&graveyard)) { m = list_first_entry(&graveyard, struct mount, mnt_expire); touch_mnt_namespace(m->mnt.mnt_ns); touch_mnt_namespace(m->mnt_ns); umount_tree(m, 1, umounts); } } Loading Loading @@ -2423,7 +2424,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns, p = real_mount(mnt_ns->root); q = new; while (p) { q->mnt.mnt_ns = new_ns; q->mnt_ns = new_ns; __mnt_make_longterm(q); if (fs) { if (&p->mnt == fs->root.mnt) { Loading Loading @@ -2479,7 +2480,7 @@ static struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt) new_ns = alloc_mnt_ns(); if (!IS_ERR(new_ns)) { mnt->mnt_ns = new_ns; real_mount(mnt)->mnt_ns = new_ns; __mnt_make_longterm(real_mount(mnt)); new_ns->root = mnt; list_add(&new_ns->list, &new_ns->root->mnt_list); Loading Loading @@ -2644,7 +2645,7 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root, IS_MNT_SHARED(&new_mnt->mnt_parent->mnt) || IS_MNT_SHARED(&root_mnt->mnt_parent->mnt)) goto out4; if (!check_mnt(root.mnt) || !check_mnt(new.mnt)) if (!check_mnt(root_mnt) || !check_mnt(new_mnt)) goto out4; error = -ENOENT; if (d_unlinked(new.dentry)) Loading Loading @@ -2793,5 +2794,5 @@ EXPORT_SYMBOL(kern_unmount); bool our_mnt(struct vfsmount *mnt) { return check_mnt(mnt); return check_mnt(real_mount(mnt)); }
fs/pnode.c +5 −5 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ static struct mount *get_peer_under_root(struct mount *mnt, do { /* Check the namespace first for optimization */ if (m->mnt.mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) if (m->mnt_ns == ns && is_path_reachable(m, m->mnt.mnt_root, root)) return m; m = next_peer(m); Loading @@ -56,7 +56,7 @@ int get_dominating_id(struct mount *mnt, const struct path *root) struct mount *m; for (m = mnt->mnt_master; m != NULL; m = m->mnt_master) { struct mount *d = get_peer_under_root(m, mnt->mnt.mnt_ns, root); struct mount *d = get_peer_under_root(m, mnt->mnt_ns, root); if (d) return d->mnt.mnt_group_id; } Loading Loading @@ -145,7 +145,7 @@ static struct mount *propagation_next(struct mount *m, struct mount *origin) { /* are there any slaves of this mount? */ if (!IS_MNT_NEW(&m->mnt) && !list_empty(&m->mnt_slave_list)) if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) return first_slave(m); while (1) { Loading Loading @@ -189,7 +189,7 @@ static struct mount *get_source(struct mount *dest, if (p_last_dest) { do { p_last_dest = next_peer(p_last_dest); } while (IS_MNT_NEW(&p_last_dest->mnt)); } while (IS_MNT_NEW(p_last_dest)); /* is that a peer of the earlier? */ if (dest == p_last_dest) { *type = CL_MAKE_SHARED; Loading Loading @@ -232,7 +232,7 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, int type; struct mount *source; if (IS_MNT_NEW(&m->mnt)) if (IS_MNT_NEW(m)) continue; source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); Loading
include/linux/mount.h +0 −1 Original line number Diff line number Diff line Loading @@ -58,7 +58,6 @@ struct vfsmount { #endif const char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ struct list_head mnt_list; struct mnt_namespace *mnt_ns; /* containing namespace */ int mnt_id; /* mount identifier */ int mnt_group_id; /* peer group identifier */ int mnt_expiry_mark; /* true if marked for expiry */ Loading