bozo: Introduce bnode_Wait()
[openafs.git] / src / afs / LINUX / osi_machdep.h
index dc7c344..e638173 100644 (file)
@@ -76,6 +76,8 @@
 #include "h/cred.h"
 #endif
 
+#include "afs/sysincludes.h"
+
 #if !defined(HAVE_LINUX_TIME_T)
 typedef time64_t time_t;
 #endif
@@ -97,25 +99,65 @@ static inline time_t osi_Time(void) {
 #endif
 
 #if defined(HAVE_LINUX_KTIME_GET_REAL_TS64)
-# define osi_GetTime(V)                                      \
-    do {                                                     \
-       struct timespec64 __afs_tv;                          \
-       ktime_get_real_ts64(&__afs_tv);                      \
-       (V)->tv_sec = (afs_int32)__afs_tv.tv_sec;            \
-       (V)->tv_usec = (afs_int32)__afs_tv.tv_nsec / 1000;   \
-    } while(0)
-#elif defined(AFS_LINUX_64BIT_KERNEL) || !defined(HAVE_LINUX_TIME_T)
-# define osi_GetTime(V)                                 \
-    do {                                               \
-       struct timeval __afs_tv;                              \
-       do_gettimeofday(&__afs_tv);                           \
-       (V)->tv_sec = (afs_int32)__afs_tv.tv_sec;             \
-       (V)->tv_usec = (afs_int32)__afs_tv.tv_usec;           \
-    } while (0)
+static inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timespec64 now;
+    ktime_get_real_ts64(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_nsec / 1000;
+}
 #else
-# define osi_GetTime(V) do_gettimeofday((V))
+static inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    do_gettimeofday(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 #endif
 
+#if defined(HAVE_LINUX_INODE_SET_CTIME)
+# define afs_inode_set_ctime(inode, sec, nsec) inode_set_ctime((inode), (sec), (nsec))
+#else
+static inline void
+afs_inode_set_ctime(struct inode *inode, time_t sec, long nsec)
+{
+    inode->i_ctime.tv_sec = sec;
+    inode->i_ctime.tv_nsec = nsec;
+}
+#endif
+#if defined(HAVE_LINUX_INODE_ATIME_MTIME_ACCESSORS)
+# define afs_inode_set_atime(inode, sec, nsec) inode_set_atime((inode), (sec), (nsec))
+# define afs_inode_get_atime_sec(inode) inode_get_atime_sec((inode))
+# define afs_inode_set_mtime(inode, sec, nsec) inode_set_mtime((inode), (sec), (nsec))
+# define afs_inode_get_mtime_sec(inode) inode_get_mtime_sec((inode))
+#else
+static inline void
+afs_inode_set_atime(struct inode *inode, time_t sec, long nsec)
+{
+    inode->i_atime.tv_sec = sec;
+    inode->i_atime.tv_nsec = nsec;
+}
+static inline time_t
+afs_inode_get_atime_sec(struct inode *inode)
+{
+    return inode->i_atime.tv_sec;
+}
+static inline void
+afs_inode_set_mtime(struct inode *inode, time_t sec, long nsec)
+{
+    inode->i_mtime.tv_sec = sec;
+    inode->i_mtime.tv_nsec = nsec;
+}
+static inline time_t
+afs_inode_get_mtime_sec(struct inode *inode)
+{
+    return inode->i_mtime.tv_sec;
+}
+#endif /* HAVE_LINUX_INODE_ATIME_MTIME_ACCESSORS */
+
 #undef gop_lookupname
 #define gop_lookupname osi_lookupname
 
@@ -156,6 +198,36 @@ static inline long copyinstr(char *from, char *to, int count, int *length) {
 }
 #define copyout(F, T, C) (copy_to_user ((char*)(T), (char*)(F), (C)) > 0 ? EFAULT : 0)
 
+/*
+ * Test to see for 64/32bit compatibility mode
+ * Return non-zero if in a 64bit kernel and handing a 32bit syscall
+ */
+#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX_ENV) && !defined(AFS_IA64_LINUX_ENV)
+static inline int
+afs_in_compat_syscall(void)
+{
+# if defined(HAVE_LINUX_IN_COMPAT_SYSCALL)
+    return in_compat_syscall();
+# elif defined(AFS_SPARC64_LINUX_ENV)
+    return test_thread_flag(TIF_32BIT);
+# elif defined(AFS_AMD64_LINUX_ENV)
+    return test_thread_flag(TIF_IA32);
+# elif defined(AFS_PPC64_LINUX_ENV)
+#  if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
+    return (current->thread_info->flags & _TIF_32BIT) != 0;
+#  else
+    return (task_thread_info(current)->flags & _TIF_32BIT) != 0;
+#  endif
+# elif defined(AFS_S390X_LINUX_ENV)
+   return test_thread_flag(TIF_31BIT);
+# elif defined(AFS_ARM64_LINUX_ENV)
+  return is_compat_task();
+# else
+#  error afs_in_compat_syscall not done for this linux
+# endif
+}
+#endif /* AFS_LINUX_64BIT_KERNEL */
+
 /* kernel print statements */
 #define printf(args...) printk(args)
 #define uprintf(args...) printk(args)
@@ -185,6 +257,10 @@ extern struct user_namespace *afs_ns;
 #  define afs_current_user_ns() ((struct user_namespace *)NULL)
 # endif
 
+#if defined(IOP_TAKES_MNT_IDMAP)
+extern struct mnt_idmap *afs_mnt_idmap;
+#endif
+
 static inline kuid_t afs_make_kuid(uid_t uid) {
     return make_kuid(afs_ns, uid);
 }
@@ -322,7 +398,7 @@ struct uio {
 
 #define OSIFILE_INODE(a) FILE_INODE((a)->filp)
 
-#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
+#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX_ENV) && !defined(AFS_IA64_LINUX_ENV)
 # define NEED_IOCTL32
 #endif
 
@@ -330,13 +406,7 @@ struct uio {
 #include <linux/sched.h>
 #include <linux/wait.h>
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
 extern struct mutex afs_global_lock;
-#else
-extern struct semaphore afs_global_lock;
-# define mutex_lock(lock) down(lock)
-# define mutex_unlock(lock) up(lock)
-#endif
 extern int afs_global_owner;
 
 #define AFS_GLOCK() \
@@ -360,7 +430,7 @@ do { \
 
 #define osi_InitGlock()
 
-#ifdef AFS_AMD64_LINUX20_ENV
+#ifdef AFS_AMD64_LINUX_ENV
 /* RHEL5 beta's kernel doesn't define these. They aren't gonna change, so... */
 
 # ifndef __NR_ia32_afs_syscall