Blame SOURCES/0069-fs-make-helpers-idmap-mount-aware.patch

Kmods SIG 9e3ffb
From 549c7297717c32ee53f156cd949e055e601f67bb Mon Sep 17 00:00:00 2001
Kmods SIG 9e3ffb
From: Christian Brauner <christian.brauner@ubuntu.com>
Kmods SIG 9e3ffb
Date: Thu, 21 Jan 2021 14:19:43 +0100
Kmods SIG 9e3ffb
Subject: [Backport 549c7297717c] fs: make helpers idmap mount aware
Kmods SIG 9e3ffb
Kmods SIG 9e3ffb
Extend some inode methods with an additional user namespace argument. A
Kmods SIG 9e3ffb
filesystem that is aware of idmapped mounts will receive the user
Kmods SIG 9e3ffb
namespace the mount has been marked with. This can be used for
Kmods SIG 9e3ffb
additional permission checking and also to enable filesystems to
Kmods SIG 9e3ffb
translate between uids and gids if they need to. We have implemented all
Kmods SIG 9e3ffb
relevant helpers in earlier patches.
Kmods SIG 9e3ffb
Kmods SIG 9e3ffb
As requested we simply extend the exisiting inode method instead of
Kmods SIG 9e3ffb
introducing new ones. This is a little more code churn but it's mostly
Kmods SIG 9e3ffb
mechanical and doesnt't leave us with additional inode methods.
Kmods SIG 9e3ffb
Kmods SIG 9e3ffb
Link: https://lore.kernel.org/r/20210121131959.646623-25-christian.brauner@ubuntu.com
Kmods SIG 9e3ffb
Cc: Christoph Hellwig <hch@lst.de>
Kmods SIG 9e3ffb
Cc: David Howells <dhowells@redhat.com>
Kmods SIG 9e3ffb
Cc: Al Viro <viro@zeniv.linux.org.uk>
Kmods SIG 9e3ffb
Cc: linux-fsdevel@vger.kernel.org
Kmods SIG 9e3ffb
Reviewed-by: Christoph Hellwig <hch@lst.de>
Kmods SIG 9e3ffb
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Kmods SIG 9e3ffb
---
Kmods SIG 9e3ffb
 src/exfat_fs.h |  8 +++++---
Kmods SIG 9e3ffb
 src/file.c     |  8 +++++---
Kmods SIG 9e3ffb
 src/namei.c    | 14 ++++++++------
Kmods SIG 9e3ffb
 3 files changed, 18 insertions(+), 12 deletions(-)
Kmods SIG 9e3ffb
Kmods SIG 9e3ffb
diff --git a/src/exfat_fs.h b/src/exfat_fs.h
Kmods SIG 9e3ffb
index b8f0e829ecbd26c14788899de066e533b6dbaf1e..d905bb9cd2ca61f9f25c0a338e441342af9778d8 100644
Kmods SIG 9e3ffb
--- a/src/exfat_fs.h
Kmods SIG 9e3ffb
+++ b/src/exfat_fs.h
Kmods SIG 9e3ffb
@@ -416,9 +416,11 @@ int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count);
Kmods SIG 9e3ffb
 extern const struct file_operations exfat_file_operations;
Kmods SIG 9e3ffb
 int __exfat_truncate(struct inode *inode, loff_t new_size);
Kmods SIG 9e3ffb
 void exfat_truncate(struct inode *inode, loff_t size);
Kmods SIG 9e3ffb
-int exfat_setattr(struct dentry *dentry, struct iattr *attr);
Kmods SIG 9e3ffb
-int exfat_getattr(const struct path *path, struct kstat *stat,
Kmods SIG 9e3ffb
-		unsigned int request_mask, unsigned int query_flags);
Kmods SIG 9e3ffb
+int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
Kmods SIG 9e3ffb
+		  struct iattr *attr);
Kmods SIG 9e3ffb
+int exfat_getattr(struct user_namespace *mnt_userns, const struct path *path,
Kmods SIG 9e3ffb
+		  struct kstat *stat, unsigned int request_mask,
Kmods SIG 9e3ffb
+		  unsigned int query_flags);
Kmods SIG 9e3ffb
 int exfat_file_fsync(struct file *file, loff_t start, loff_t end, int datasync);
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
 /* namei.c */
Kmods SIG 9e3ffb
diff --git a/src/file.c b/src/file.c
Kmods SIG 9e3ffb
index e9705b3295d31def9c56d86955da9ef359fd9567..3aa6eb4de5e3d40b7dd3693435ac5c4dbdda5aa3 100644
Kmods SIG 9e3ffb
--- a/src/file.c
Kmods SIG 9e3ffb
+++ b/src/file.c
Kmods SIG 9e3ffb
@@ -267,8 +267,9 @@ void exfat_truncate(struct inode *inode, loff_t size)
Kmods SIG 9e3ffb
 	mutex_unlock(&sbi->s_lock);
Kmods SIG 9e3ffb
 }
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
-int exfat_getattr(const struct path *path, struct kstat *stat,
Kmods SIG 9e3ffb
-		unsigned int request_mask, unsigned int query_flags)
Kmods SIG 9e3ffb
+int exfat_getattr(struct user_namespace *mnt_uerns, const struct path *path,
Kmods SIG 9e3ffb
+		  struct kstat *stat, unsigned int request_mask,
Kmods SIG 9e3ffb
+		  unsigned int query_flags)
Kmods SIG 9e3ffb
 {
Kmods SIG 9e3ffb
 	struct inode *inode = d_backing_inode(path->dentry);
Kmods SIG 9e3ffb
 	struct exfat_inode_info *ei = EXFAT_I(inode);
Kmods SIG 9e3ffb
@@ -282,7 +283,8 @@ int exfat_getattr(const struct path *path, struct kstat *stat,
Kmods SIG 9e3ffb
 	return 0;
Kmods SIG 9e3ffb
 }
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
-int exfat_setattr(struct dentry *dentry, struct iattr *attr)
Kmods SIG 9e3ffb
+int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
Kmods SIG 9e3ffb
+		  struct iattr *attr)
Kmods SIG 9e3ffb
 {
Kmods SIG 9e3ffb
 	struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb);
Kmods SIG 9e3ffb
 	struct inode *inode = dentry->d_inode;
Kmods SIG 9e3ffb
diff --git a/src/namei.c b/src/namei.c
Kmods SIG 9e3ffb
index 2932b23a3b6c36ebfb82e5a5e7621c07fbb2822d..d9e8ec689c55ca3e8511177de0c01dfe1d3c090a 100644
Kmods SIG 9e3ffb
--- a/src/namei.c
Kmods SIG 9e3ffb
+++ b/src/namei.c
Kmods SIG 9e3ffb
@@ -541,8 +541,8 @@ static int exfat_add_entry(struct inode *inode, const char *path,
Kmods SIG 9e3ffb
 	return ret;
Kmods SIG 9e3ffb
 }
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
-static int exfat_create(struct inode *dir, struct dentry *dentry, umode_t mode,
Kmods SIG 9e3ffb
-		bool excl)
Kmods SIG 9e3ffb
+static int exfat_create(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 9e3ffb
+			struct dentry *dentry, umode_t mode, bool excl)
Kmods SIG 9e3ffb
 {
Kmods SIG 9e3ffb
 	struct super_block *sb = dir->i_sb;
Kmods SIG 9e3ffb
 	struct inode *inode;
Kmods SIG 9e3ffb
@@ -827,7 +827,8 @@ static int exfat_unlink(struct inode *dir, struct dentry *dentry)
Kmods SIG 9e3ffb
 	return err;
Kmods SIG 9e3ffb
 }
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
-static int exfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
Kmods SIG 9e3ffb
+static int exfat_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
Kmods SIG 9e3ffb
+		       struct dentry *dentry, umode_t mode)
Kmods SIG 9e3ffb
 {
Kmods SIG 9e3ffb
 	struct super_block *sb = dir->i_sb;
Kmods SIG 9e3ffb
 	struct inode *inode;
Kmods SIG 9e3ffb
@@ -1318,9 +1319,10 @@ static int __exfat_rename(struct inode *old_parent_inode,
Kmods SIG 9e3ffb
 	return ret;
Kmods SIG 9e3ffb
 }
Kmods SIG 9e3ffb
 
Kmods SIG 9e3ffb
-static int exfat_rename(struct inode *old_dir, struct dentry *old_dentry,
Kmods SIG 9e3ffb
-		struct inode *new_dir, struct dentry *new_dentry,
Kmods SIG 9e3ffb
-		unsigned int flags)
Kmods SIG 9e3ffb
+static int exfat_rename(struct user_namespace *mnt_userns,
Kmods SIG 9e3ffb
+			struct inode *old_dir, struct dentry *old_dentry,
Kmods SIG 9e3ffb
+			struct inode *new_dir, struct dentry *new_dentry,
Kmods SIG 9e3ffb
+			unsigned int flags)
Kmods SIG 9e3ffb
 {
Kmods SIG 9e3ffb
 	struct inode *old_inode, *new_inode;
Kmods SIG 9e3ffb
 	struct super_block *sb = old_dir->i_sb;
Kmods SIG 9e3ffb
-- 
Kmods SIG 9e3ffb
2.31.1
Kmods SIG 9e3ffb