static __always_inline void check_memory_region(unsigned long addr,
                                                size_t size, bool write)
 {
-       struct kasan_access_info info;
-
        if (unlikely(size == 0))
                return;
 
        if (unlikely((void *)addr <
                kasan_shadow_to_mem((void *)KASAN_SHADOW_START))) {
-               info.access_addr = (void *)addr;
-               info.access_size = size;
-               info.is_write = write;
-               info.ip = _RET_IP_;
-               kasan_report_user_access(&info);
+               kasan_report(addr, size, write, _RET_IP_);
                return;
        }
 
 
 
 static DEFINE_SPINLOCK(report_lock);
 
-void kasan_report_error(struct kasan_access_info *info)
+static void kasan_report_error(struct kasan_access_info *info)
 {
        unsigned long flags;
+       const char *bug_type;
 
        /*
         * Make sure we don't end up in loop.
        spin_lock_irqsave(&report_lock, flags);
        pr_err("================================="
                "=================================\n");
-       print_error_description(info);
-       print_address_description(info);
-       print_shadow_for_address(info->first_bad_addr);
-       pr_err("================================="
-               "=================================\n");
-       spin_unlock_irqrestore(&report_lock, flags);
-       kasan_enable_current();
-}
-
-void kasan_report_user_access(struct kasan_access_info *info)
-{
-       unsigned long flags;
-
-       /*
-        * Make sure we don't end up in loop.
-        */
-       kasan_disable_current();
-       spin_lock_irqsave(&report_lock, flags);
-       pr_err("================================="
-               "=================================\n");
-       pr_err("BUG: KASan: user-memory-access on address %p\n",
-               info->access_addr);
-       pr_err("%s of size %zu by task %s/%d\n",
-               info->is_write ? "Write" : "Read",
-               info->access_size, current->comm, task_pid_nr(current));
-       dump_stack();
+       if (info->access_addr <
+                       kasan_shadow_to_mem((void *)KASAN_SHADOW_START)) {
+               if ((unsigned long)info->access_addr < PAGE_SIZE)
+                       bug_type = "null-ptr-deref";
+               else if ((unsigned long)info->access_addr < TASK_SIZE)
+                       bug_type = "user-memory-access";
+               else
+                       bug_type = "wild-memory-access";
+               pr_err("BUG: KASan: %s on address %p\n",
+                       bug_type, info->access_addr);
+               pr_err("%s of size %zu by task %s/%d\n",
+                       info->is_write ? "Write" : "Read",
+                       info->access_size, current->comm,
+                       task_pid_nr(current));
+               dump_stack();
+       } else {
+               print_error_description(info);
+               print_address_description(info);
+               print_shadow_for_address(info->first_bad_addr);
+       }
        pr_err("================================="
                "=================================\n");
        spin_unlock_irqrestore(&report_lock, flags);
        info.access_size = size;
        info.is_write = is_write;
        info.ip = ip;
+
        kasan_report_error(&info);
 }