From bcb41a1e42bc8834ed90ec57a5fff7ea72d33c6a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 7 Jun 2022 12:42:20 +0200 Subject: [PATCH] 5.17-stable patches added patches: exportfs-support-idmapped-mounts.patch fs-add-two-trivial-lookup-helpers.patch --- .../exportfs-support-idmapped-mounts.patch | 52 +++++++ .../fs-add-two-trivial-lookup-helpers.patch | 146 ++++++++++++++++++ queue-5.17/series | 2 + 3 files changed, 200 insertions(+) create mode 100644 queue-5.17/exportfs-support-idmapped-mounts.patch create mode 100644 queue-5.17/fs-add-two-trivial-lookup-helpers.patch diff --git a/queue-5.17/exportfs-support-idmapped-mounts.patch b/queue-5.17/exportfs-support-idmapped-mounts.patch new file mode 100644 index 00000000000..20c1d2fd0a2 --- /dev/null +++ b/queue-5.17/exportfs-support-idmapped-mounts.patch @@ -0,0 +1,52 @@ +From 3a761d72fa62eec8913e45d29375344f61706541 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Mon, 4 Apr 2022 12:51:41 +0200 +Subject: exportfs: support idmapped mounts + +From: Christian Brauner + +commit 3a761d72fa62eec8913e45d29375344f61706541 upstream. + +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) +Signed-off-by: Miklos Szeredi +Signed-off-by: Greg Kroah-Hartman +--- + fs/exportfs/expfs.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/fs/exportfs/expfs.c ++++ b/fs/exportfs/expfs.c +@@ -145,7 +145,7 @@ static struct dentry *reconnect_one(stru + 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 * + } + + 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); diff --git a/queue-5.17/fs-add-two-trivial-lookup-helpers.patch b/queue-5.17/fs-add-two-trivial-lookup-helpers.patch new file mode 100644 index 00000000000..11f82c97ad8 --- /dev/null +++ b/queue-5.17/fs-add-two-trivial-lookup-helpers.patch @@ -0,0 +1,146 @@ +From 00675017e0aeba5305665c52ded4ddce6a4c0231 Mon Sep 17 00:00:00 2001 +From: Christian Brauner +Date: Mon, 4 Apr 2022 12:51:40 +0200 +Subject: fs: add two trivial lookup helpers + +From: Christian Brauner + +commit 00675017e0aeba5305665c52ded4ddce6a4c0231 upstream. + +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) +Signed-off-by: Miklos Szeredi +Signed-off-by: Greg Kroah-Hartman +--- + fs/namei.c | 70 ++++++++++++++++++++++++++++++++++++++++++-------- + include/linux/namei.h | 6 ++++ + 2 files changed, 66 insertions(+), 10 deletions(-) + +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -2768,7 +2768,8 @@ struct dentry *lookup_one(struct user_na + 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,59 @@ struct dentry *lookup_one_len_unlocked(c + 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 +2863,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); + +--- a/include/linux/namei.h ++++ b/include/linux/namei.h +@@ -69,6 +69,12 @@ extern struct dentry *lookup_one_len(con + 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 *); diff --git a/queue-5.17/series b/queue-5.17/series index 109b61467c6..51391e69490 100644 --- a/queue-5.17/series +++ b/queue-5.17/series @@ -764,3 +764,5 @@ rdma-rxe-generate-a-completion-for-unsupported-invalid-opcode.patch mips-ip27-remove-incorrect-cpu_has_fpu-override.patch mips-ip30-remove-incorrect-cpu_has_fpu-override.patch ext4-only-allow-test_dummy_encryption-when-supported.patch +fs-add-two-trivial-lookup-helpers.patch +exportfs-support-idmapped-mounts.patch -- 2.47.3