@@ -45,32 +45,73 @@ typedef struct cred cred_t;
4545#define SGID_TO_KGID (x ) (KGIDT_INIT(x))
4646#define KGIDP_TO_SGIDP (x ) (&(x)->val)
4747
48- static inline uid_t zfs_uid_into_mnt (struct user_namespace * mnt_ns , uid_t uid )
48+ extern boolean_t zfs_is_init_userns (struct user_namespace * ns );
49+ extern struct user_namespace * zfs_get_init_userns (void );
50+
51+ static inline struct user_namespace * zfs_i_user_ns (struct inode * inode )
52+ {
53+ #ifdef HAVE_SUPER_USER_NS
54+ return (inode -> i_sb -> s_user_ns );
55+ #else
56+ return (NULL );
57+ #endif
58+ }
59+
60+ static inline boolean_t zfs_no_idmapping (struct user_namespace * mnt_userns ,
61+ struct user_namespace * fs_userns )
4962{
50- if (mnt_ns )
51- return (__kuid_val (make_kuid (mnt_ns , uid )));
52- return (uid );
63+ return (!mnt_userns || !fs_userns ||
64+ zfs_is_init_userns (mnt_userns ) || mnt_userns == fs_userns );
5365}
5466
55- static inline gid_t zfs_gid_into_mnt (struct user_namespace * mnt_ns , gid_t gid )
67+ static inline uid_t zfs_uid_to_vfsuid (struct user_namespace * mnt_userns ,
68+ struct user_namespace * fs_userns , uid_t uid )
5669{
57- if (mnt_ns )
58- return (__kgid_val (make_kgid (mnt_ns , gid )));
59- return (gid );
70+ if (zfs_no_idmapping (mnt_userns , fs_userns ))
71+ return (uid );
72+ if (!zfs_is_init_userns (fs_userns ))
73+ uid = from_kuid (fs_userns , KUIDT_INIT (uid ));
74+ if (uid == (uid_t )- 1 )
75+ return (uid );
76+ return (__kuid_val (make_kuid (mnt_userns , uid )));
6077}
6178
62- static inline uid_t zfs_uid_from_mnt (struct user_namespace * mnt_ns , uid_t uid )
79+ static inline gid_t zfs_gid_to_vfsgid (struct user_namespace * mnt_userns ,
80+ struct user_namespace * fs_userns , gid_t gid )
6381{
64- if (mnt_ns )
65- return (from_kuid (mnt_ns , KUIDT_INIT (uid )));
66- return (uid );
82+ if (zfs_no_idmapping (mnt_userns , fs_userns ))
83+ return (gid );
84+ if (!zfs_is_init_userns (fs_userns ))
85+ gid = from_kgid (fs_userns , KGIDT_INIT (gid ));
86+ if (gid == (gid_t )- 1 )
87+ return (gid );
88+ return (__kgid_val (make_kgid (mnt_userns , gid )));
6789}
6890
69- static inline gid_t zfs_gid_from_mnt (struct user_namespace * mnt_ns , gid_t gid )
91+ static inline uid_t zfs_vfsuid_to_uid (struct user_namespace * mnt_userns ,
92+ struct user_namespace * fs_userns , uid_t uid )
7093{
71- if (mnt_ns )
72- return (from_kgid (mnt_ns , KGIDT_INIT (gid )));
73- return (gid );
94+ if (zfs_no_idmapping (mnt_userns , fs_userns ))
95+ return (uid );
96+ uid = from_kuid (mnt_userns , KUIDT_INIT (uid ));
97+ if (uid == (uid_t )- 1 )
98+ return (uid );
99+ if (zfs_is_init_userns (fs_userns ))
100+ return (uid );
101+ return (__kuid_val (make_kuid (fs_userns , uid )));
102+ }
103+
104+ static inline gid_t zfs_vfsgid_to_gid (struct user_namespace * mnt_userns ,
105+ struct user_namespace * fs_userns , gid_t gid )
106+ {
107+ if (zfs_no_idmapping (mnt_userns , fs_userns ))
108+ return (gid );
109+ gid = from_kgid (mnt_userns , KGIDT_INIT (gid ));
110+ if (gid == (gid_t )- 1 )
111+ return (gid );
112+ if (zfs_is_init_userns (fs_userns ))
113+ return (gid );
114+ return (__kgid_val (make_kgid (fs_userns , gid )));
74115}
75116
76117extern void crhold (cred_t * cr );
@@ -81,5 +122,4 @@ extern gid_t crgetgid(const cred_t *cr);
81122extern int crgetngroups (const cred_t * cr );
82123extern gid_t * crgetgroups (const cred_t * cr );
83124extern int groupmember (gid_t gid , const cred_t * cr );
84-
85125#endif /* _SPL_CRED_H */
0 commit comments