#undef __module_call
 
 #define user_addr_max() \
-        (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
+        (uaccess_kernel() ? ~0UL : TASK_SIZE)
 
 extern long strncpy_from_user(char *dest, const char __user *src, long count);
 extern __must_check long strlen_user(const char __user *str);
 
 #include <linux/string.h>      /* for generic string functions */
 
 
-#define __kernel_ok            (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok            (uaccess_kernel())
 
 /*
  * Algorithmically, for __user_ok() we want do:
 
 #define access_ok(type, addr, size)    (__range_ok(addr, size) == 0)
 
 #define user_addr_max() \
-       (segment_eq(get_fs(), KERNEL_DS) ? ~0UL : get_fs())
+       (uaccess_kernel() ? ~0UL : get_fs())
 
 /*
  * The "__xxx" versions of the user access functions do not verify the
 
        unsigned long ua_flags;
        int atomic;
 
-       if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+       if (uaccess_kernel()) {
                memcpy((void *)to, from, n);
                return 0;
        }
 {
        unsigned long ua_flags;
 
-       if (unlikely(segment_eq(get_fs(), KERNEL_DS))) {
+       if (uaccess_kernel()) {
                memset((void *)addr, 0, n);
                return 0;
        }
 
        /* Check that things do not wrap around */
        if (addr > ULONG_MAX - size)
                return 0;
-       if (segment_eq(get_fs(), KERNEL_DS))
+       if (uaccess_kernel())
                return 1;
 #ifdef CONFIG_MTD_UCLINUX
        if (1)
 
        if (!addr || addr > (0xffffffffUL - (size - 1)))
                goto _bad_access;
 
-       if (segment_eq(get_fs(), KERNEL_DS))
+       if (uaccess_kernel())
                return 1;
 
        if (memory_start <= addr && (addr + size - 1) < memory_end)
 
 
 #define segment_eq(a, b)       ((a).seg == (b).seg)
 
-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok (uaccess_kernel())
 #define __user_ok(addr, size) \
        (((size) <= TASK_SIZE) && ((addr) <= TASK_SIZE-(size)))
 #define __access_ok(addr, size) (__kernel_ok || __user_ok((addr), (size)))
 
 #define copy_to_user(to, from, n)      __copy_to_user(to, from, n)
 
 #define user_addr_max() \
-       (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
+       (uaccess_kernel() ? ~0UL : TASK_SIZE)
 
 extern long strncpy_from_user(char *dst, const char __user *src, long count);
 extern __must_check long strlen_user(const char __user *str);
 
 
 #define segment_eq(a, b)       ((a).seg == (b).seg)
 
-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok (uaccess_kernel())
 /*
  * Explicitly allow NULL pointers here. Parts of the kernel such
  * as readv/writev use access_ok to validate pointers, but want
 
                                   __wsum sum, int *err_ptr)
 {
        might_fault();
-       if (segment_eq(get_fs(), get_ds()))
+       if (uaccess_kernel())
                return __csum_partial_copy_kernel((__force void *)src, dst,
                                                  len, sum, err_ptr);
        else
 {
        might_fault();
        if (access_ok(VERIFY_WRITE, dst, len)) {
-               if (segment_eq(get_fs(), get_ds()))
+               if (uaccess_kernel())
                        return __csum_partial_copy_kernel(src,
                                                          (__force void *)dst,
                                                          len, sum, err_ptr);
 
 #include <asm/cpu-features.h>
 #include <asm/cpu-type.h>
 #include <asm/mipsmtregs.h>
-#include <linux/uaccess.h> /* for segment_eq() */
+#include <linux/uaccess.h> /* for uaccess_kernel() */
 
 extern void (*r4k_blast_dcache)(void);
 extern void (*r4k_blast_icache)(void);
                                                                        \
        __##pfx##flush_prologue                                         \
                                                                        \
-       if (segment_eq(get_fs(), USER_DS)) {                            \
+       if (!uaccess_kernel()) {                                        \
                while (1) {                                             \
                        protected_cachee_op(hitop, addr);               \
                        if (addr == aend)                               \
 
        if (!IS_ENABLED(CONFIG_EVA))
                return false;
 
-       return segment_eq(get_fs(), get_ds());
+       return uaccess_kernel();
 }
 
 /*
 
                        goto sigbus;
 
                if (IS_ENABLED(CONFIG_EVA)) {
-                       if (segment_eq(get_fs(), get_ds()))
+                       if (uaccess_kernel())
                                LoadHW(addr, value, res);
                        else
                                LoadHWE(addr, value, res);
                        goto sigbus;
 
                if (IS_ENABLED(CONFIG_EVA)) {
-                       if (segment_eq(get_fs(), get_ds()))
+                       if (uaccess_kernel())
                                LoadW(addr, value, res);
                        else
                                LoadWE(addr, value, res);
                        goto sigbus;
 
                if (IS_ENABLED(CONFIG_EVA)) {
-                       if (segment_eq(get_fs(), get_ds()))
+                       if (uaccess_kernel())
                                LoadHWU(addr, value, res);
                        else
                                LoadHWUE(addr, value, res);
                value = regs->regs[insn.i_format.rt];
 
                if (IS_ENABLED(CONFIG_EVA)) {
-                       if (segment_eq(get_fs(), get_ds()))
+                       if (uaccess_kernel())
                                StoreHW(addr, value, res);
                        else
                                StoreHWE(addr, value, res);
                value = regs->regs[insn.i_format.rt];
 
                if (IS_ENABLED(CONFIG_EVA)) {
-                       if (segment_eq(get_fs(), get_ds()))
+                       if (uaccess_kernel())
                                StoreW(addr, value, res);
                        else
                                StoreWE(addr, value, res);
 
 }
 
 #define user_addr_max() \
-       (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
+       (uaccess_kernel() ? ~0UL : TASK_SIZE)
 
 extern long strncpy_from_user(char *dest, const char __user *src, long count);
 
 
        /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is
         * our gateway page, and causes no end of trouble...
         */
-       if (segment_eq(KERNEL_DS, get_fs()) && !uaddr)
+       if (uaccess_kernel() && !uaddr)
                return -EFAULT;
 
        if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
 
                goto label;                                             \
 } while (0)
 
-#define get_user_space() (segment_eq(get_fs(), KERNEL_DS) ? 0 : mfsp(3))
+#define get_user_space() (uaccess_kernel() ? 0 : mfsp(3))
 #define get_kernel_space() (0)
 
 #define MERGE(w0, sh_1, w1, sh_2)  ({                                  \
 
 static inline void set_fs(mm_segment_t fs)
 {
        current->thread.mm_segment = fs;
-       if (segment_eq(fs, KERNEL_DS)) {
+       if (uaccess_kernel()) {
                set_cpu_flag(CIF_ASCE_SECONDARY);
                __ctl_load(S390_lowcore.kernel_asce, 7, 7);
        } else {
 
 #endif
 
 #define user_addr_max() \
-       (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL)
+       (uaccess_kernel() ? ~0UL : TASK_SIZE)
 
 long strncpy_from_user(char *dest, const char __user *src, long count);
 
 
  * large size and address near to PAGE_OFFSET - a fault will break his intentions.
  */
 #define __user_ok(addr, size) ({ (void)(size); (addr) < STACK_TOP; })
-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok (uaccess_kernel())
 #define __access_ok(addr, size) (__user_ok((addr) & get_fs().seg, (size)))
 #define access_ok(type, addr, size) \
        ({ (void)(type); __access_ok((unsigned long)(addr), size); })
 
        return __addr_range_nowrap(addr, size) &&
                (__under_task_size(addr, size) ||
                __access_ok_vsyscall(addr, size) ||
-               segment_eq(get_fs(), KERNEL_DS));
+               uaccess_kernel());
 }
 
 #endif
 
 
 long __copy_from_user(void *to, const void __user *from, unsigned long n)
 {
-       if (segment_eq(get_fs(), KERNEL_DS)) {
+       if (uaccess_kernel()) {
                memcpy(to, (__force void*)from, n);
                return 0;
        }
 
 long __copy_to_user(void __user *to, const void *from, unsigned long n)
 {
-       if (segment_eq(get_fs(), KERNEL_DS)) {
+       if (uaccess_kernel()) {
                memcpy((__force void *) to, from, n);
                return 0;
        }
        long n;
        char *ptr = dst;
 
-       if (segment_eq(get_fs(), KERNEL_DS)) {
+       if (uaccess_kernel()) {
                strncpy(dst, (__force void *) src, count);
                return strnlen(dst, count);
        }
 
 unsigned long __clear_user(void __user *mem, unsigned long len)
 {
-       if (segment_eq(get_fs(), KERNEL_DS)) {
+       if (uaccess_kernel()) {
                memset((__force void*)mem, 0, len);
                return 0;
        }
 {
        int count = 0, n;
 
-       if (segment_eq(get_fs(), KERNEL_DS))
+       if (uaccess_kernel())
                return strnlen((__force char*)str, len) + 1;
 
        n = buffer_op((unsigned long) str, len, 0, strnlen_chunk, &count);
 
 #define __strnlen_user         __strnlen_user
 #define __clear_user           __clear_user
 
-#define __kernel_ok            (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok            (uaccess_kernel())
 #define __user_ok(addr, size)  (((size) <= TASK_SIZE)                  \
                                && ((addr) <= TASK_SIZE - (size)))
 #define __access_ok(addr, size)        (__kernel_ok || __user_ok((addr), (size)))
 
                buf, interrupts_enabled(regs) ? "n" : "ff",
                fast_interrupts_enabled(regs) ? "n" : "ff",
                processor_modes[processor_mode(regs)],
-               segment_eq(get_fs(), get_ds()) ? "kernel" : "user");
+               uaccess_kernel() ? "kernel" : "user");
        {
                unsigned int ctrl;
 
 
 
 #define segment_eq(a, b)       ((a).seg == (b).seg)
 
-#define __kernel_ok (segment_eq(get_fs(), KERNEL_DS))
+#define __kernel_ok (uaccess_kernel())
 #define __user_ok(addr, size) \
                (((size) <= TASK_SIZE)&&((addr) <= TASK_SIZE-(size)))
 #define __access_ok(addr, size) (__kernel_ok || __user_ok((addr), (size)))
 
 
        dprintk("%s: write %zd bytes\n", bd->name, count);
 
-       if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
+       if (unlikely(uaccess_kernel()))
                return -EINVAL;
 
        bsg_set_block(bd, file);
 
        sg_io_hdr_t *hp;
        unsigned char cmnd[SG_MAX_CDB_SIZE];
 
-       if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
+       if (unlikely(uaccess_kernel()))
                return -EINVAL;
 
        if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
 
 #define VERIFY_READ 0
 #define VERIFY_WRITE 1
 
+#define uaccess_kernel() segment_eq(get_fs(), KERNEL_DS)
+
 #include <asm/uaccess.h>
 
 static __always_inline void pagefault_disabled_inc(void)
 
  */
 static inline bool ib_safe_file_access(struct file *filp)
 {
-       return filp->f_cred == current_cred() && segment_eq(get_fs(), USER_DS);
+       return filp->f_cred == current_cred() && !uaccess_kernel();
 }
 
 #endif /* _RDMA_IB_H */
 
        if (unlikely(in_interrupt() ||
                     current->flags & (PF_KTHREAD | PF_EXITING)))
                return -EPERM;
-       if (unlikely(segment_eq(get_fs(), KERNEL_DS)))
+       if (unlikely(uaccess_kernel()))
                return -EPERM;
        if (!access_ok(VERIFY_WRITE, unsafe_ptr, size))
                return -EPERM;
 
                        size_t count)
 {
        /* It will get better.  Eventually... */
-       if (segment_eq(get_fs(), KERNEL_DS)) {
+       if (uaccess_kernel()) {
                direction |= ITER_KVEC;
                i->type = direction;
                i->kvec = (struct kvec *)iov;
 
         * get paged out, therefore we'll never actually fault, and the
         * below annotations will generate false positives.
         */
-       if (segment_eq(get_fs(), KERNEL_DS))
+       if (uaccess_kernel())
                return;
        if (pagefault_disabled())
                return;
 
 static bool tomoyo_kernel_service(void)
 {
        /* Nothing to do if I am a kernel service. */
-       return segment_eq(get_fs(), KERNEL_DS);
+       return uaccess_kernel();
 }
 
 /**