if (unlikely(size == 0))
                return 0;
+       if (!user_write_access_begin(uaddr, size))
+               return size;
        if (!PAGE_ALIGNED(uaddr)) {
-               if (unlikely(__put_user(0, uaddr) != 0))
-                       return size;
+               unsafe_put_user(0, uaddr, out);
                uaddr = (char __user *)PAGE_ALIGN((unsigned long)uaddr);
        }
        end = (char __user *)PAGE_ALIGN((unsigned long)start + size);
        if (unlikely(end < start))
                end = NULL;
        while (uaddr != end) {
-               if (unlikely(__put_user(0, uaddr) != 0))
-                       goto out;
+               unsafe_put_user(0, uaddr, out);
                uaddr += PAGE_SIZE;
        }
 
 out:
+       user_write_access_end();
        if (size > uaddr - start)
                return size - (uaddr - start);
        return 0;
 
        if (unlikely(size == 0))
                return 0;
+       if (!user_read_access_begin(uaddr, size))
+               return size;
        if (!PAGE_ALIGNED(uaddr)) {
-               if (unlikely(__get_user(c, uaddr) != 0))
-                       return size;
+               unsafe_get_user(c, uaddr, out);
                uaddr = (const char __user *)PAGE_ALIGN((unsigned long)uaddr);
        }
        end = (const char __user *)PAGE_ALIGN((unsigned long)start + size);
        if (unlikely(end < start))
                end = NULL;
        while (uaddr != end) {
-               if (unlikely(__get_user(c, uaddr) != 0))
-                       goto out;
+               unsafe_get_user(c, uaddr, out);
                uaddr += PAGE_SIZE;
        }
 
 out:
+       user_read_access_end();
        (void)c;
        if (size > uaddr - start)
                return size - (uaddr - start);