[Devel] [PATCH RHEL7 COMMIT] ms/fs: Update i_[ug]id_(read|write) to translate relative to s_user_ns

Konstantin Khorenko khorenko at virtuozzo.com
Tue Jul 11 18:39:42 MSK 2017


The commit is pushed to "branch-rh7-3.10.0-514.26.1.vz7.33.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.26.1.vz7.33.3
------>
commit 7eb85a2ff4aec4732fdd3f47b8e4077f7dd0b320
Author: Seth Forshee <seth.forshee at canonical.com>
Date:   Tue Jul 11 19:39:42 2017 +0400

    ms/fs: Update i_[ug]id_(read|write) to translate relative to s_user_ns
    
    For filesystems mounted from a user namespace on-disk ids should
    be translated relative to s_users_ns rather than init_user_ns.
    
    When an id in the filesystem doesn't exist in s_user_ns the
    associated id in the inode will be set to INVALID_[UG]ID, which
    turns these into de facto "nobody" ids. This actually maps pretty
    well into the way most code already works, and those places where
    it didn't were fixed in previous patches. Moving forward vfs code
    needs to be careful to handle instances where ids in inodes may
    be invalid.
    
    Signed-off-by: Seth Forshee <seth.forshee at canonical.com>
    Signed-off-by: Eric W. Biederman <ebiederm at xmission.com>
    (cherry picked from commit 81754357770ebd900801231e7bc8d151ddc00498)
    
    https://jira.sw.ru/browse/PSBM-40075
    
    Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
    
    Conflicts:
    	include/linux/fs.h
---
 include/linux/fs.h | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/include/linux/fs.h b/include/linux/fs.h
index 7203d76..f3b396b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -884,31 +884,6 @@ static inline void i_size_write(struct inode *inode, loff_t i_size)
 #endif
 }
 
-/* Helper functions so that in most cases filesystems will
- * not need to deal directly with kuid_t and kgid_t and can
- * instead deal with the raw numeric values that are stored
- * in the filesystem.
- */
-static inline uid_t i_uid_read(const struct inode *inode)
-{
-	return from_kuid(&init_user_ns, inode->i_uid);
-}
-
-static inline gid_t i_gid_read(const struct inode *inode)
-{
-	return from_kgid(&init_user_ns, inode->i_gid);
-}
-
-static inline void i_uid_write(struct inode *inode, uid_t uid)
-{
-	inode->i_uid = make_kuid(&init_user_ns, uid);
-}
-
-static inline void i_gid_write(struct inode *inode, gid_t gid)
-{
-	inode->i_gid = make_kgid(&init_user_ns, gid);
-}
-
 static inline unsigned iminor(const struct inode *inode)
 {
 	return MINOR(inode->i_rdev);
@@ -1586,6 +1561,31 @@ struct super_block {
 	struct list_lru		s_inode_lru ____cacheline_aligned_in_smp;
 };
 
+/* Helper functions so that in most cases filesystems will
+ * not need to deal directly with kuid_t and kgid_t and can
+ * instead deal with the raw numeric values that are stored
+ * in the filesystem.
+ */
+static inline uid_t i_uid_read(const struct inode *inode)
+{
+	return from_kuid(inode->i_sb->s_user_ns, inode->i_uid);
+}
+
+static inline gid_t i_gid_read(const struct inode *inode)
+{
+	return from_kgid(inode->i_sb->s_user_ns, inode->i_gid);
+}
+
+static inline void i_uid_write(struct inode *inode, uid_t uid)
+{
+	inode->i_uid = make_kuid(inode->i_sb->s_user_ns, uid);
+}
+
+static inline void i_gid_write(struct inode *inode, gid_t gid)
+{
+	inode->i_gid = make_kgid(inode->i_sb->s_user_ns, gid);
+}
+
 extern const unsigned super_block_wrapper_version;
 struct super_block_wrapper {
 	struct super_block sb;


More information about the Devel mailing list