|
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 |
|