diff options
author | Nikolay Borisov <[email protected]> | 2016-08-03 20:19:04 +0300 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-08-08 10:47:22 -0700 |
commit | 938cfeb0f27303721081223816d4f251ffeb1767 (patch) | |
tree | 601e6d10fd24c402c51333d16f2d64f9bf0bf349 /include | |
parent | cf2731e65b2015988b2cae7970886279e11b013f (diff) |
Linux 4.8 compat: new s_user_ns member of struct super_block
Kernel 4.8 paved the way to enabling mounting a file system inside a
non-init user namespace. To facilitate this a s_user_ns member was
added holding the userns in which the filesystem's instance was
mounted. This enables doing the uid/gid translation relative to
this particular username space and not the default init_user_ns.
Signed-off-by: Nikolay Borisov <[email protected]>
Signed-off-by: Chunwei Chen <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #4928
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/vfs_compat.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index 97220c2fe..fa12ba95a 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -356,7 +356,11 @@ static inline struct inode *file_inode(const struct file *f) #ifdef HAVE_KUID_HELPERS static inline uid_t zfs_uid_read_impl(struct inode *ip) { +#ifdef HAVE_SUPER_USER_NS + return (from_kuid(ip->i_sb->s_user_ns, ip->i_uid)); +#else return (from_kuid(kcred->user_ns, ip->i_uid)); +#endif } static inline uid_t zfs_uid_read(struct inode *ip) @@ -366,7 +370,11 @@ static inline uid_t zfs_uid_read(struct inode *ip) static inline gid_t zfs_gid_read_impl(struct inode *ip) { +#ifdef HAVE_SUPER_USER_NS + return (from_kgid(ip->i_sb->s_user_ns, ip->i_gid)); +#else return (from_kgid(kcred->user_ns, ip->i_gid)); +#endif } static inline gid_t zfs_gid_read(struct inode *ip) @@ -376,13 +384,22 @@ static inline gid_t zfs_gid_read(struct inode *ip) static inline void zfs_uid_write(struct inode *ip, uid_t uid) { +#ifdef HAVE_SUPER_USER_NS + ip->i_uid = make_kuid(ip->i_sb->s_user_ns, uid); +#else ip->i_uid = make_kuid(kcred->user_ns, uid); +#endif } static inline void zfs_gid_write(struct inode *ip, gid_t gid) { +#ifdef HAVE_SUPER_USER_NS + ip->i_gid = make_kgid(ip->i_sb->s_user_ns, gid); +#else ip->i_gid = make_kgid(kcred->user_ns, gid); +#endif } + #else static inline uid_t zfs_uid_read(struct inode *ip) { |