From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christian Brauner Subject: [PATCH 3/7] namespace: move unbindable check out of clone_private_mount() Date: Wed, 14 Apr 2021 14:37:47 +0200 Message-ID: <20210414123750.2110159-4-brauner@kernel.org> References: <20210414123750.2110159-1-brauner@kernel.org> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Return-path: Received: from mail.kernel.org ([198.145.29.99]:33864 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245007AbhDNMjG (ORCPT ); Wed, 14 Apr 2021 08:39:06 -0400 In-Reply-To: <20210414123750.2110159-1-brauner@kernel.org> List-ID: Content-Type: text/plain; charset="us-ascii" To: linux-fsdevel@vger.kernel.org Cc: Amir Goldstein , Christoph Hellwig , Tyler Hicks , David Howells , Miklos Szeredi , Al Viro , ecryptfs@vger.kernel.org, linux-cachefs@redhat.com, Christian Brauner From: Christian Brauner We're about to switch all filesystems that stack on top or otherwise use a struct path of another filesystem to use clone_private_mount() in the following commits. Most of these filesystems like ecryptfs and cachefiles don't need the MS_UNBDINDABLE check that overlayfs currently wants. So move the check out of clone_private_mount() and into overlayfs itself. Note that overlayfs can probably be switched to not rely on the MS_UNBDINDABLE check too but for now keep it. [1]: df820f8de4e4 ("ovl: make private mounts longterm") Cc: Amir Goldstein Cc: Christoph Hellwig Cc: Miklos Szeredi Cc: Al Viro Cc: linux-fsdevel@vger.kernel.org Signed-off-by: Christian Brauner --- fs/namespace.c | 3 --- fs/overlayfs/super.c | 13 +++++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/fs/namespace.c b/fs/namespace.c index 7ffefa8b3980..f6efe1272b9d 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -1976,9 +1976,6 @@ struct vfsmount *clone_private_mount(const struct path *path) struct mount *old_mnt = real_mount(path->mnt); struct mount *new_mnt; - if (IS_MNT_UNBINDABLE(old_mnt)) - return ERR_PTR(-EINVAL); - new_mnt = clone_mnt(old_mnt, path->dentry, CL_PRIVATE); if (IS_ERR(new_mnt)) return ERR_CAST(new_mnt); diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c index fdd72f1a9c5e..c942bb1073f6 100644 --- a/fs/overlayfs/super.c +++ b/fs/overlayfs/super.c @@ -15,6 +15,7 @@ #include #include #include +#include "../pnode.h" #include "overlayfs.h" MODULE_AUTHOR("Miklos Szeredi "); @@ -1175,6 +1176,14 @@ static int ovl_report_in_use(struct ovl_fs *ofs, const char *name) } } +static inline struct vfsmount *ovl_clone_private_mount(const struct path *path) +{ + if (IS_MNT_UNBINDABLE(real_mount(path->mnt))) + return ERR_PTR(-EINVAL); + + return clone_private_mount(path); +} + static int ovl_get_upper(struct super_block *sb, struct ovl_fs *ofs, struct ovl_layer *upper_layer, struct path *upperpath) { @@ -1201,7 +1210,7 @@ static int ovl_get_upper(struct super_block *sb, struct ovl_fs *ofs, if (err) goto out; - upper_mnt = clone_private_mount(upperpath); + upper_mnt = ovl_clone_private_mount(upperpath); err = PTR_ERR(upper_mnt); if (IS_ERR(upper_mnt)) { pr_err("failed to clone upperpath\n"); @@ -1700,7 +1709,7 @@ static int ovl_get_layers(struct super_block *sb, struct ovl_fs *ofs, } } - mnt = clone_private_mount(&stack[i]); + mnt = ovl_clone_private_mount(&stack[i]); err = PTR_ERR(mnt); if (IS_ERR(mnt)) { pr_err("failed to clone lowerpath\n"); -- 2.27.0