Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Revert "fix mismerge with Trond's stuff (create_mnt_ns() export is gone now)"

This reverts commit e9496ff46a20a8592fdc7bdaaf41b45eb808d310. Quoth Al:

"it's dependent on a lot of other stuff not currently in mainline
and badly broken with current fs/namespace.c. Sorry, badly
out-of-order cherry-pick from old queue.

PS: there's a large pending series reworking the refcounting and
lifetime rules for vfsmounts that will, among other things, allow to
rip a subtree away _without_ dissolving connections in it, to be
garbage-collected when all active references are gone. It's
considerably saner wrt "is the subtree busy" logics, but it's nowhere
near being ready for merge at the moment; this changeset is one of the
things becoming possible with that sucker, but it certainly shouldn't
have been picked during this cycle. My apologies..."

Noticed-by: Eric Paris <eparis@redhat.com>
Requested-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+11 -1
+2 -1
fs/namespace.c
··· 2068 2068 * create_mnt_ns - creates a private namespace and adds a root filesystem 2069 2069 * @mnt: pointer to the new root filesystem mountpoint 2070 2070 */ 2071 - static struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt) 2071 + struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt) 2072 2072 { 2073 2073 struct mnt_namespace *new_ns; 2074 2074 ··· 2080 2080 } 2081 2081 return new_ns; 2082 2082 } 2083 + EXPORT_SYMBOL(create_mnt_ns); 2083 2084 2084 2085 SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, 2085 2086 char __user *, type, unsigned long, flags, void __user *, data)
+8
fs/nfs/super.c
··· 2648 2648 static int nfs_follow_remote_path(struct vfsmount *root_mnt, 2649 2649 const char *export_path, struct vfsmount *mnt_target) 2650 2650 { 2651 + struct mnt_namespace *ns_private; 2651 2652 struct nameidata nd; 2652 2653 struct super_block *s; 2653 2654 int ret; 2654 2655 2656 + ns_private = create_mnt_ns(root_mnt); 2657 + ret = PTR_ERR(ns_private); 2658 + if (IS_ERR(ns_private)) 2659 + goto out_mntput; 2660 + 2655 2661 ret = vfs_path_lookup(root_mnt->mnt_root, root_mnt, 2656 2662 export_path, LOOKUP_FOLLOW, &nd); 2663 + 2664 + put_mnt_ns(ns_private); 2657 2665 2658 2666 if (ret != 0) 2659 2667 goto out_err;
+1
include/linux/mnt_namespace.h
··· 23 23 24 24 struct fs_struct; 25 25 26 + extern struct mnt_namespace *create_mnt_ns(struct vfsmount *mnt); 26 27 extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *, 27 28 struct fs_struct *); 28 29 extern void put_mnt_ns(struct mnt_namespace *ns);