From patchwork Thu Apr 7 11:21:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 12805088 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1890C433FE for ; Thu, 7 Apr 2022 11:22:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244749AbiDGLYY (ORCPT ); Thu, 7 Apr 2022 07:24:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244740AbiDGLYW (ORCPT ); Thu, 7 Apr 2022 07:24:22 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07DC922BF5; Thu, 7 Apr 2022 04:22:23 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 9381961E51; Thu, 7 Apr 2022 11:22:22 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F276CC385A4; Thu, 7 Apr 2022 11:22:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649330541; bh=ViJgKQTFzYHnPi8m6Ss7n+kb5PGcQiolFLTANzW/oLk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SS8N3QhVt1xJwlPAdXarEat/YG5A0/zaPGiAaagGe8EFNVxIrDYqZ8eHn8R1r6SIV GXVE7ekQea9yD7kYq102E6zgtCnFaNYaVCyuextlQipXY64IGrx4+IibJ8Ra6WqW2a eLAvRFi5nETGyvLtgztb9Ik+65E6XAJRcz6obE7Dccq4Mf7GwrgJ4rNz3ifWvK2ENF Ox+gR3yf5AUqB53gozw7347LnQz6fYAkxGjDsyUuoQT2ZPp2tdRVl9+SHwV2qmMhz8 YGDP9nlcwMxUQvnefOJ3riH1OSbTAilDzeGdKgzf63BZ7tkHuPWX9ESHLVQVVKhQEP R/blhYtrO0T7g== From: Christian Brauner To: Amir Goldstein , Christoph Hellwig , Miklos Szeredi , Al Viro Cc: Christian Brauner , linux-fsdevel@vger.kernel.org, linux-unionfs@vger.kernel.org, Aleksa Sarai , Giuseppe Scrivano , Rodrigo Campos Catelin , Seth Forshee , Luca Bocassi , Lennart Poettering , =?utf-8?q?St=C3=A9phane_Graber?= Subject: [PATCH v5 01/19] fs: add two trivial lookup helpers Date: Thu, 7 Apr 2022 13:21:38 +0200 Message-Id: <20220407112157.1775081-2-brauner@kernel.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220407112157.1775081-1-brauner@kernel.org> References: <20220407112157.1775081-1-brauner@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5757; h=from:subject; bh=ViJgKQTFzYHnPi8m6Ss7n+kb5PGcQiolFLTANzW/oLk=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMST5nfRY+72Rn9F441UOfvOc04bNV3gXV/U/2/a4eMeP+c9z Wm9GdJSyMIhxMciKKbI4tJuEyy3nqdhslKkBM4eVCWQIAxenAEzEV4/hF9Mzp7K9ZvVum5Vvv5jrEH jj1bbwbSzrD+2Nc6qwrtvhl8Hwv1I89tXyzUczEnhsLXi+xymIxIvNfl6dpff+t98W7//N3AA= X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Similar to the addition of lookup_one() add a version of lookup_one_unlocked() and lookup_one_positive_unlocked() that take idmapped mounts into account. This is required to port overlay to support idmapped base layers. Cc: Tested-by: Giuseppe Scrivano Reviewed-by: Amir Goldstein Reviewed-by: Christoph Hellwig Signed-off-by: Christian Brauner (Microsoft) --- /* v2 */ unchanged /* v3 */ - Christoph Hellwig : - Wrap overly long lines. - Add kerneldoc for lookup_one_positive_unlocked(). /* v4 */ unchanged /* v5 */ unchanged --- fs/namei.c | 69 ++++++++++++++++++++++++++++++++++++------- include/linux/namei.h | 6 ++++ 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 3f1829b3ab5b..d76f4dde6179 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2768,7 +2768,8 @@ struct dentry *lookup_one(struct user_namespace *mnt_userns, const char *name, EXPORT_SYMBOL(lookup_one); /** - * lookup_one_len_unlocked - filesystem helper to lookup single pathname component + * lookup_one_unlocked - filesystem helper to lookup single pathname component + * @mnt_userns: idmapping of the mount the lookup is performed from * @name: pathname component to lookup * @base: base directory to lookup from * @len: maximum length @len should be interpreted to @@ -2779,14 +2780,15 @@ EXPORT_SYMBOL(lookup_one); * Unlike lookup_one_len, it should be called without the parent * i_mutex held, and will take the i_mutex itself if necessary. */ -struct dentry *lookup_one_len_unlocked(const char *name, - struct dentry *base, int len) +struct dentry *lookup_one_unlocked(struct user_namespace *mnt_userns, + const char *name, struct dentry *base, + int len) { struct qstr this; int err; struct dentry *ret; - err = lookup_one_common(&init_user_ns, name, base, len, &this); + err = lookup_one_common(mnt_userns, name, base, len, &this); if (err) return ERR_PTR(err); @@ -2795,6 +2797,58 @@ struct dentry *lookup_one_len_unlocked(const char *name, ret = lookup_slow(&this, base, 0); return ret; } +EXPORT_SYMBOL(lookup_one_unlocked); + +/** + * lookup_one_positive_unlocked - filesystem helper to lookup single + * pathname component + * @mnt_userns: idmapping of the mount the lookup is performed from + * @name: pathname component to lookup + * @base: base directory to lookup from + * @len: maximum length @len should be interpreted to + * + * This helper will yield ERR_PTR(-ENOENT) on negatives. The helper returns + * known positive or ERR_PTR(). This is what most of the users want. + * + * Note that pinned negative with unlocked parent _can_ become positive at any + * time, so callers of lookup_one_unlocked() need to be very careful; pinned + * positives have >d_inode stable, so this one avoids such problems. + * + * Note that this routine is purely a helper for filesystem usage and should + * not be called by generic code. + * + * The helper should be called without i_mutex held. + */ +struct dentry *lookup_one_positive_unlocked(struct user_namespace *mnt_userns, + const char *name, + struct dentry *base, int len) +{ + struct dentry *ret = lookup_one_unlocked(mnt_userns, name, base, len); + if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) { + dput(ret); + ret = ERR_PTR(-ENOENT); + } + return ret; +} +EXPORT_SYMBOL(lookup_one_positive_unlocked); + +/** + * lookup_one_len_unlocked - filesystem helper to lookup single pathname component + * @name: pathname component to lookup + * @base: base directory to lookup from + * @len: maximum length @len should be interpreted to + * + * Note that this routine is purely a helper for filesystem usage and should + * not be called by generic code. + * + * Unlike lookup_one_len, it should be called without the parent + * i_mutex held, and will take the i_mutex itself if necessary. + */ +struct dentry *lookup_one_len_unlocked(const char *name, + struct dentry *base, int len) +{ + return lookup_one_unlocked(&init_user_ns, name, base, len); +} EXPORT_SYMBOL(lookup_one_len_unlocked); /* @@ -2808,12 +2862,7 @@ EXPORT_SYMBOL(lookup_one_len_unlocked); struct dentry *lookup_positive_unlocked(const char *name, struct dentry *base, int len) { - struct dentry *ret = lookup_one_len_unlocked(name, base, len); - if (!IS_ERR(ret) && d_flags_negative(smp_load_acquire(&ret->d_flags))) { - dput(ret); - ret = ERR_PTR(-ENOENT); - } - return ret; + return lookup_one_positive_unlocked(&init_user_ns, name, base, len); } EXPORT_SYMBOL(lookup_positive_unlocked); diff --git a/include/linux/namei.h b/include/linux/namei.h index e89329bb3134..caeb08a98536 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -69,6 +69,12 @@ extern struct dentry *lookup_one_len(const char *, struct dentry *, int); extern struct dentry *lookup_one_len_unlocked(const char *, struct dentry *, int); extern struct dentry *lookup_positive_unlocked(const char *, struct dentry *, int); struct dentry *lookup_one(struct user_namespace *, const char *, struct dentry *, int); +struct dentry *lookup_one_unlocked(struct user_namespace *mnt_userns, + const char *name, struct dentry *base, + int len); +struct dentry *lookup_one_positive_unlocked(struct user_namespace *mnt_userns, + const char *name, + struct dentry *base, int len); extern int follow_down_one(struct path *); extern int follow_down(struct path *); From patchwork Thu Apr 7 11:21:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Brauner X-Patchwork-Id: 12805089 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 162FFC433EF for ; Thu, 7 Apr 2022 11:22:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244750AbiDGLYa (ORCPT ); Thu, 7 Apr 2022 07:24:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49206 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244740AbiDGLY1 (ORCPT ); Thu, 7 Apr 2022 07:24:27 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 82DA56E8D2; Thu, 7 Apr 2022 04:22:28 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 1830A61CF0; Thu, 7 Apr 2022 11:22:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3DD77C385A0; Thu, 7 Apr 2022 11:22:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649330547; bh=3SB3NHl1PuAXJFmpwSTU6c82ytSgfL6twncwZKuVsLM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JcXVARvMW6cm3/E4vvW5yXRVKux8kASyP20uPZbyKxQ6dbXfnWJ3xEwQq5kdN6l2y d9v9pm2XvzmZiC4oHO73kEZ3fvvqe7wAYvgrloTHcSCYvnKt+GL81iIqBVMy1806Ke 6hXZKYLbWDoxrtebli6AeVoJPD3IKBkome7GGe5NQ5xZTdIUDcUCpOq8lbewhQ6g5a zXAE2BY3L8MjFhJiD6GaLyOHduy22Tx7FO+viAH1yq9/0paSsZQzWDlUK7CiGGIMTg LayYwJ0BAVUGgTx7DsW1Da0f4uE7u44rl+5vZy9Ukb/NboVq2b0BYI4+O8FBaoW/5i G26gWp9BAc6kw== From: Christian Brauner To: Amir Goldstein , Christoph Hellwig , Miklos Szeredi , Al Viro Cc: Christian Brauner , linux-fsdevel@vger.kernel.org, linux-unionfs@vger.kernel.org, Aleksa Sarai , Giuseppe Scrivano , Rodrigo Campos Catelin , Seth Forshee , Luca Bocassi , Lennart Poettering , =?utf-8?q?St=C3=A9phane_Graber?= , stable@vger.kernel.org Subject: [PATCH v5 02/19] exportfs: support idmapped mounts Date: Thu, 7 Apr 2022 13:21:39 +0200 Message-Id: <20220407112157.1775081-3-brauner@kernel.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220407112157.1775081-1-brauner@kernel.org> References: <20220407112157.1775081-1-brauner@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1973; h=from:subject; bh=3SB3NHl1PuAXJFmpwSTU6c82ytSgfL6twncwZKuVsLM=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMST5nfR0zv4T2/5vedIlYY7D0uXFW81+ygcfyq1SSjo4k3HJ 6XyxjlIWBjEuBlkxRRaHdpNwueU8FZuNMjVg5rAygQxh4OIUgIlk3WL4H1ehLXP9aNeP/Vanrq/Uu7 qAd7LRZYekl1316+0CPl08Y8PIcLDnW+D7psVrtjtpLTI89t2q4Q3/n85vj249f3RN08dzHjsA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Make the two locations where exportfs helpers check permission to lookup a given inode idmapped mount aware by switching it to the lookup_one() helper. This is a bugfix for the open_by_handle_at() system call which doesn't take idmapped mounts into account currently. It's not tied to a specific commit so we'll just Cc stable. In addition this is required to support idmapped base layers in overlay. The overlay filesystem uses exportfs to encode and decode file handles for its index=on mount option and when nfs_export=on. Cc: Cc: Tested-by: Giuseppe Scrivano Reviewed-by: Amir Goldstein Reviewed-by: Christoph Hellwig Signed-off-by: Christian Brauner (Microsoft) --- /* v2 */ unchanged /* v3 */ unchanged /* v4 */ unchanged /* v5 */ unchanged --- fs/exportfs/expfs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index 0106eba46d5a..3ef80d000e13 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c @@ -145,7 +145,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt, if (err) goto out_err; dprintk("%s: found name: %s\n", __func__, nbuf); - tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf)); + tmp = lookup_one_unlocked(mnt_user_ns(mnt), nbuf, parent, strlen(nbuf)); if (IS_ERR(tmp)) { dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp)); err = PTR_ERR(tmp); @@ -525,7 +525,8 @@ exportfs_decode_fh_raw(struct vfsmount *mnt, struct fid *fid, int fh_len, } inode_lock(target_dir->d_inode); - nresult = lookup_one_len(nbuf, target_dir, strlen(nbuf)); + nresult = lookup_one(mnt_user_ns(mnt), nbuf, + target_dir, strlen(nbuf)); if (!IS_ERR(nresult)) { if (unlikely(nresult->d_inode != result->d_inode)) { dput(nresult);