#ifndef OSI_MACHDEP_H_
#define OSI_MACHDEP_H_
-#include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
-# define AFS_LINUX26_ONEGROUP_ENV 1
-#endif
-
/* Only needed for xdr.h in glibc 2.1.x */
#ifndef quad_t
# define quad_t __quad_t
#define VN_RELE(V) iput((V))
#define afs_suser(x) capable(CAP_SYS_ADMIN)
-#define wakeup afs_osi_Wakeup
+extern int afs_osi_Wakeup(void *event);
+static inline void
+wakeup(void *event)
+{
+ afs_osi_Wakeup(event);
+}
#define vType(V) ((AFSTOV((V)))->i_mode & S_IFMT)
#define vSetType(V, type) AFSTOV((V))->i_mode = ((type) | (AFSTOV((V))->i_mode & ~S_IFMT)) /* preserve mode */
#define copyout(F, T, C) (copy_to_user ((char*)(T), (char*)(F), (C)) > 0 ? EFAULT : 0)
/* kernel print statements */
-#define printf printk
-#define uprintf printk
+#define printf(args...) printk(args)
+#define uprintf(args...) printk(args)
#ifndef NGROUPS
#define NGROUPS NGROUPS_SMALL
#endif
+#ifdef STRUCT_GROUP_INFO_HAS_GID
+/* compat macro for Linux 4.9 */
+#define GROUP_AT(gi,x) ((gi)->gid[x])
+#endif
+
typedef struct task_struct afs_proc_t;
+#ifdef HAVE_LINUX_KUID_T
+
+#include <linux/uidgid.h>
+typedef kuid_t afs_kuid_t;
+typedef kgid_t afs_kgid_t;
+extern struct user_namespace *afs_ns;
+# ifdef CONFIG_USER_NS
+# define afs_current_user_ns() current_user_ns()
+# else
+/* Here current_user_ns() expands to GPL-only init_user_ns symbol! */
+# define afs_current_user_ns() ((struct user_namespace *)NULL)
+# endif
+
+static inline kuid_t afs_make_kuid(uid_t uid) {
+ return make_kuid(afs_ns, uid);
+}
+static inline kgid_t afs_make_kgid(gid_t gid) {
+ return make_kgid(afs_ns, gid);
+}
+static inline uid_t afs_from_kuid(kuid_t kuid) {
+ return from_kuid(afs_ns, kuid);
+}
+static inline uid_t afs_from_kgid(kgid_t kgid) {
+ return from_kgid(afs_ns, kgid);
+}
+
+#else
+
+typedef uid_t afs_kuid_t;
+typedef gid_t afs_kgid_t;
+
+static inline afs_kuid_t afs_make_kuid(uid_t uid) {return uid;}
+static inline afs_kgid_t afs_make_kgid(gid_t gid) {return gid;}
+static inline uid_t afs_from_kuid(afs_kuid_t kuid) {return kuid;}
+static inline gid_t afs_from_kgid(afs_kgid_t kgid) {return kgid;}
+static inline unsigned char uid_eq(uid_t a, uid_t b) {return a == b;}
+static inline unsigned char gid_eq(gid_t a, gid_t b) {return a == b;}
+static inline unsigned char uid_lt(uid_t a, uid_t b) {return a < b;}
+static inline unsigned char gid_lt(gid_t a, gid_t b) {return a < b;}
+#define GLOBAL_ROOT_UID ((afs_kuid_t) 0)
+#define GLOBAL_ROOT_GID ((afs_kgid_t) 0)
+
+#endif
+
/* Credentials. For newer kernels we use the kernel structure directly. */
#if defined(STRUCT_TASK_STRUCT_HAS_CRED)
typedef struct cred afs_ucred_t;
typedef struct cred cred_t;
-# define afs_cr_uid(cred) ((cred)->fsuid)
-# define afs_cr_gid(cred) ((cred)->fsgid)
-# define afs_cr_ruid(cred) ((cred)->uid)
-# define afs_cr_rgid(cred) ((cred)->gid)
+# define afs_cr_uid(cred) (afs_from_kuid((cred)->fsuid))
+# define afs_cr_gid(cred) (afs_from_kgid((cred)->fsgid))
+# define afs_cr_ruid(cred) (afs_from_kuid((cred)->uid))
+# define afs_cr_rgid(cred) (afs_from_kgid((cred)->gid))
# define afs_cr_group_info(cred) ((cred)->group_info)
# define crhold(c) (get_cred(c))
static inline void
afs_set_cr_uid(cred_t *cred, uid_t uid) {
- cred->fsuid = uid;
+ cred->fsuid = afs_make_kuid(uid);
}
static inline void
afs_set_cr_gid(cred_t *cred, gid_t gid) {
- cred->fsgid = gid;
+ cred->fsgid = afs_make_kgid(gid);
}
static inline void
afs_set_cr_ruid(cred_t *cred, uid_t uid) {
- cred->uid = uid;
+ cred->uid = afs_make_kuid(uid);
}
static inline void
afs_set_cr_rgid(cred_t *cred, gid_t gid) {
- cred->gid = gid;
+ cred->gid = afs_make_kgid(gid);
}
static inline void
afs_set_cr_group_info(cred_t *cred, struct group_info *group_info) {
# define current_group_info() (current->cred->group_info)
# define task_gid(task) (task->cred->gid)
# define task_user(task) (task->cred->user)
-# define task_session_keyring(task) (task->cred->tgcred->session_keyring)
-# define current_session_keyring() (current->cred->tgcred->session_keyring)
+# if defined(STRUCT_CRED_HAS_SESSION_KEYRING)
+# define task_session_keyring(task) (task->cred->session_keyring)
+# define current_session_keyring() (current->cred->session_keyring)
+# else
+# define task_session_keyring(task) (task->cred->tgcred->session_keyring)
+# define current_session_keyring() (current->cred->tgcred->session_keyring)
+# endif
#else