#define afs_hz HZ
#include "h/sched.h"
-/* in case cred.h is not included in sched.h */
+/* in case cred.h is present but not included in sched.h */
+#if defined(HAVE_LINUX_CRED_H)
#include "h/cred.h"
-#if defined(HAVE_LINUX_CURRENT_KERNEL_TIME)
+#endif
+
+#include "afs/sysincludes.h"
+
+#if !defined(HAVE_LINUX_TIME_T)
+typedef time64_t time_t;
+#endif
+
+#if defined(HAVE_LINUX_KTIME_GET_COARSE_REAL_TS64)
+static inline time_t osi_Time(void) {
+ struct timespec64 xtime;
+ ktime_get_coarse_real_ts64(&xtime);
+ return xtime.tv_sec;
+}
+#elif defined(HAVE_LINUX_CURRENT_KERNEL_TIME)
static inline time_t osi_Time(void) {
struct timespec xtime;
xtime = current_kernel_time();
# define osi_Time() (xtime.tv_sec)
#endif
-
-
-#ifdef AFS_LINUX_64BIT_KERNEL
-# 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)
+#if defined(HAVE_LINUX_KTIME_GET_REAL_TS64)
+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
#undef gop_lookupname
#undef gop_lookupname_user
#define gop_lookupname_user osi_lookupname
-#define osi_vnhold(V, N) do { VN_HOLD(AFSTOV(V)); } while (0)
#define VN_HOLD(V) osi_Assert(igrab((V)) == (V))
#define VN_RELE(V) iput((V))
#define IsAfsVnode(V) ((V)->i_sb == afs_globalVFS) /* test superblock instead */
#define SetAfsVnode(V) /* unnecessary */
+#if defined(HAVE_LINUX_UACCESS_H)
+#include <linux/uaccess.h>
+#else
#include <asm/uaccess.h>
+#endif
#define copyin(F, T, C) (copy_from_user ((char*)(T), (char*)(F), (C)) > 0 ? EFAULT : 0)
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_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
+static inline int
+afs_in_compat_syscall(void)
+{
+# if defined(AFS_SPARC64_LINUX26_ENV)
+ return test_thread_flag(TIF_32BIT);
+# elif defined(AFS_SPARC64_LINUX24_ENV)
+ return (current->thread.flags & SPARC_FLAG_32BIT) != 0;
+# elif defined(AFS_SPARC64_LINUX20_ENV)
+ return (current->tss.flags & SPARC_FLAG_32BIT) != 0;
+# elif defined(AFS_AMD64_LINUX26_ENV)
+ return test_thread_flag(TIF_IA32);
+# elif defined(AFS_AMD64_LINUX20_ENV)
+ return (current->thread.flags & THREAD_IA32) != 0;
+# elif defined(AFS_PPC64_LINUX26_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_PPC64_LINUX20_ENV)
+ return (current->thread.flags & PPC_FLAG_32BIT) != 0;
+# elif defined(AFS_S390X_LINUX26_ENV)
+ return test_thread_flag(TIF_31BIT);
+# elif defined(AFS_S390X_LINUX20_ENV)
+ return (current->thread.flags & S390_FLAG_31BIT) != 0;
+# elif defined(AFS_ARM64_LINUX26_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)