diff options
author | Nikolay Borisov <[email protected]> | 2016-05-30 20:37:36 +0300 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2016-07-25 13:21:49 -0700 |
commit | 82a1b2d6289f9ceae0bee6f1e71d3bc29a8c5d16 (patch) | |
tree | 57c01daa4c2eb3ab7fca9faefee6b071f7b4a2e0 /include/linux | |
parent | 77943bc1dc39315feb335b0882dd6c91041538a3 (diff) |
Check whether the kernel supports i_uid/gid_read/write helpers
Since the concept of a kuid and the need to translate from it to
ordinary integer type was added in kernel version 3.5 implement necessary
plumbing to be able to detect this condition during compile time. If
the kernel doesn't support the kuid then just fall back to directly
accessing the respective struct inode's members
Signed-off-by: Nikolay Borisov <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Issue #4685
Issue #227
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/vfs_compat.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index bcec1146a..97220c2fe 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -28,6 +28,7 @@ #define _ZFS_VFS_H #include <sys/taskq.h> +#include <sys/cred.h> #include <linux/backing-dev.h> /* @@ -352,6 +353,58 @@ static inline struct inode *file_inode(const struct file *f) } #endif /* HAVE_FILE_INODE */ +#ifdef HAVE_KUID_HELPERS +static inline uid_t zfs_uid_read_impl(struct inode *ip) +{ + return (from_kuid(kcred->user_ns, ip->i_uid)); +} + +static inline uid_t zfs_uid_read(struct inode *ip) +{ + return (zfs_uid_read_impl(ip)); +} + +static inline gid_t zfs_gid_read_impl(struct inode *ip) +{ + return (from_kgid(kcred->user_ns, ip->i_gid)); +} + +static inline gid_t zfs_gid_read(struct inode *ip) +{ + return (zfs_gid_read_impl(ip)); +} + +static inline void zfs_uid_write(struct inode *ip, uid_t uid) +{ + ip->i_uid = make_kuid(kcred->user_ns, uid); +} + +static inline void zfs_gid_write(struct inode *ip, gid_t gid) +{ + ip->i_gid = make_kgid(kcred->user_ns, gid); +} +#else +static inline uid_t zfs_uid_read(struct inode *ip) +{ + return (ip->i_uid); +} + +static inline gid_t zfs_gid_read(struct inode *ip) +{ + return (ip->i_gid); +} + +static inline void zfs_uid_write(struct inode *ip, uid_t uid) +{ + ip->i_uid = uid; +} + +static inline void zfs_gid_write(struct inode *ip, gid_t gid) +{ + ip->i_gid = gid; +} +#endif + /* * 2.6.38 API change */ |