#endif
        printk("%s(%d): %s %ld\n", current->comm, task_pid_nr(current), str, err);
        dik_show_regs(regs, r9_15);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        dik_show_trace((unsigned long *)(regs+1));
        dik_show_code((unsigned int *)regs->pc);
 
 
 
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        if (!die_nest_count)
                /* Nest count reaches zero, release the lock. */
 
                crash_kexec(regs);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        raw_spin_unlock_irq(&die_lock);
        oops_exit();
 
 
        show_regs_log_lvl(regs, KERN_EMERG);
        show_stack_log_lvl(current, regs->sp, regs, KERN_EMERG);
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
 
        if (in_interrupt())
 
        do_show_stack(current, ®s->r30, pt_elr(regs));
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        spin_unlock_irq(&die.lock);
 
 
 
        bust_spinlocks(0);
        die.lock_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die.lock);
 
        if (!regs)
 
        console_verbose();
        printk("%s: %08x\n",str,nr);
        show_registers(fp);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        do_exit(SIGSEGV);
 }
 
 
 
        printk("%s[#%d]:\n", str, ++die_counter);
        show_registers(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        raw_spin_unlock_irq(&die_lock);
 
        oops_exit();
 
 
        show_regs(regs);
        dump_stack();
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
 {
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        oops_exit();
        printk("\n");
 
        print_modules();
        show_regs(regs);
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        if (in_interrupt())
                panic("Fatal exception in interrupt");
 
        notify_die(DIE_OOPS, str, regs, err, 255, SIGSEGV);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        oops_exit();
 
 
                        break;
                }
                cheetah_pcache_forced_on = 1;
-               add_taint(TAINT_MACHINE_CHECK);
+               add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
                cheetah_enable_pcache();
                break;
 
 
 
        printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);
        show_regs(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
 
        __SAVE; __SAVE; __SAVE; __SAVE;
        __SAVE; __SAVE; __SAVE; __SAVE;
 
        notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);
        __asm__ __volatile__("flushw");
        show_regs(regs);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        if (regs->tstate & TSTATE_PRIV) {
                struct thread_info *tp = current_thread_info();
                struct reg_window *rw = (struct reg_window *)
 
        ret = __die(str, err, thread, regs);
 
        bust_spinlocks(0);
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
        oops_exit();
 
 
         */
        WARN_ONCE(1, "WARNING: This combination of AMD"
                " processors is not suitable for SMP.\n");
-       if (!test_taint(TAINT_UNSAFE_SMP))
-               add_taint(TAINT_UNSAFE_SMP);
+       add_taint(TAINT_UNSAFE_SMP, LOCKDEP_NOW_UNRELIABLE);
 
 valid_k7:
        ;
 
                /*
                 * Set taint even when machine check was not enabled.
                 */
-               add_taint(TAINT_MACHINE_CHECK);
+               add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 
                severity = mce_severity(&m, cfg->tolerant, NULL);
 
 
                        smp_processor_id());
        }
 
-       add_taint(TAINT_MACHINE_CHECK);
+       add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /* Set up machine check reporting for processors with Intel style MCE: */
 
 static void winchip_machine_check(struct pt_regs *regs, long error_code)
 {
        printk(KERN_EMERG "CPU0: Machine Check Exception.\n");
-       add_taint(TAINT_MACHINE_CHECK);
+       add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /* Set up machine check reporting on the Winchip C6 series */
 
 
                if (tmp != mask_lo) {
                        printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n");
-                       add_taint(TAINT_FIRMWARE_WORKAROUND);
+                       add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
                        mask_lo = tmp;
                }
        }
 
 
        bust_spinlocks(0);
        die_owner = -1;
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        die_nest_count--;
        if (!die_nest_count)
                /* Nest count reaches zero, release the lock. */
 
        if (!user_mode(regs))
                show_stack(NULL, (unsigned long*)regs->areg[1]);
 
-       add_taint(TAINT_DIE);
+       add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
        spin_unlock_irq(&die_lock);
 
        if (in_interrupt())
 
                buf = NULL;
                if (ACPI_FAILURE(status))
                        return -EINVAL;
-               add_taint(TAINT_OVERRIDDEN_ACPI_TABLE);
+               add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
        }
 
        return count;
 
        pr_warn(PREFIX
                "Override [%4.4s-%8.8s], this is unsafe: tainting kernel\n",
                table->signature, table->oem_table_id);
-       add_taint(TAINT_OVERRIDDEN_ACPI_TABLE);
+       add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 
 
                return -EINVAL;
 
        /* Userspace has been fiddling around behind the kernel's back */
-       add_taint(TAINT_USER);
+       add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
 
        regmap_write(map, reg, value);
        return buf_size;
 
 extern int panic_on_io_nmi;
 extern int sysctl_panic_on_stackoverflow;
 extern const char *print_tainted(void);
-extern void add_taint(unsigned flag);
+enum lockdep_ok {
+       LOCKDEP_STILL_OK,
+       LOCKDEP_NOW_UNRELIABLE
+};
+extern void add_taint(unsigned flag, enum lockdep_ok);
 extern int test_taint(unsigned flag);
 extern unsigned long get_taint(void);
 extern int root_mountflags;
 
                return -ENOENT;
 }
 
-static inline void add_taint_module(struct module *mod, unsigned flag)
+static inline void add_taint_module(struct module *mod, unsigned flag,
+                                   enum lockdep_ok lockdep_ok)
 {
-       add_taint(flag);
+       add_taint(flag, lockdep_ok);
        mod->taints |= (1U << flag);
 }
 
 {
        int ret = (flags & O_TRUNC);
        if (ret)
-               add_taint(TAINT_FORCED_RMMOD);
+               add_taint(TAINT_FORCED_RMMOD, LOCKDEP_NOW_UNRELIABLE);
        return ret;
 }
 #else
        if (!test_taint(TAINT_FORCED_MODULE))
                printk(KERN_WARNING "%s: %s: kernel tainted.\n",
                       mod->name, reason);
-       add_taint_module(mod, TAINT_FORCED_MODULE);
+       add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_NOW_UNRELIABLE);
        return 0;
 #else
        return -ENOEXEC;
                if (!test_taint(TAINT_PROPRIETARY_MODULE))
                        printk(KERN_WARNING "%s: module license '%s' taints "
                                "kernel.\n", mod->name, license);
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
        }
 }
 
        }
 
        if (!get_modinfo(info, "intree"))
-               add_taint_module(mod, TAINT_OOT_MODULE);
+               add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
 
        if (get_modinfo(info, "staging")) {
-               add_taint_module(mod, TAINT_CRAP);
+               add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
                printk(KERN_WARNING "%s: module is from the staging directory,"
                       " the quality is unknown, you have been warned.\n",
                       mod->name);
         * using GPL-only symbols it needs.
         */
        if (strcmp(mod->name, "ndiswrapper") == 0)
-               add_taint(TAINT_PROPRIETARY_MODULE);
+               add_taint(TAINT_PROPRIETARY_MODULE, LOCKDEP_NOW_UNRELIABLE);
 
        /* driverloader was caught wrongly pretending to be under GPL */
        if (strcmp(mod->name, "driverloader") == 0)
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
 
        /* lve claims to be GPL but upstream won't provide source */
        if (strcmp(mod->name, "lve") == 0)
-               add_taint_module(mod, TAINT_PROPRIETARY_MODULE);
+               add_taint_module(mod, TAINT_PROPRIETARY_MODULE,
+                                LOCKDEP_NOW_UNRELIABLE);
 
 #ifdef CONFIG_MODVERSIONS
        if ((mod->num_syms && !mod->crcs)
                            "%s: module verification failed: signature and/or"
                            " required key missing - tainting kernel\n",
                            mod->name);
-               add_taint_module(mod, TAINT_FORCED_MODULE);
+               add_taint_module(mod, TAINT_FORCED_MODULE, LOCKDEP_STILL_OK);
        }
 #endif
 
 
        return tainted_mask;
 }
 
-void add_taint(unsigned flag)
+/**
+ * add_taint: add a taint flag if not already set.
+ * @flag: one of the TAINT_* constants.
+ * @lockdep_ok: whether lock debugging is still OK.
+ *
+ * If something bad has gone wrong, you'll want @lockdebug_ok = false, but for
+ * some notewortht-but-not-corrupting cases, it can be set to true.
+ */
+void add_taint(unsigned flag, enum lockdep_ok lockdep_ok)
 {
-       /*
-        * Can't trust the integrity of the kernel anymore.
-        * We don't call directly debug_locks_off() because the issue
-        * is not necessarily serious enough to set oops_in_progress to 1
-        * Also we want to keep up lockdep for staging/out-of-tree
-        * development and post-warning case.
-        */
-       switch (flag) {
-       case TAINT_CRAP:
-       case TAINT_OOT_MODULE:
-       case TAINT_WARN:
-       case TAINT_FIRMWARE_WORKAROUND:
-               break;
-
-       default:
-               if (__debug_locks_off())
-                       printk(KERN_WARNING "Disabling lock debugging due to kernel taint\n");
-       }
+       if (lockdep_ok == LOCKDEP_NOW_UNRELIABLE && __debug_locks_off())
+               printk(KERN_WARNING
+                      "Disabling lock debugging due to kernel taint\n");
 
        set_bit(flag, &tainted_mask);
 }
        print_modules();
        dump_stack();
        print_oops_end_marker();
-       add_taint(taint);
+       /* Just a warning, don't kill lockdep. */
+       add_taint(taint, LOCKDEP_STILL_OK);
 }
 
 void warn_slowpath_fmt(const char *file, int line, const char *fmt, ...)
 
        if (irqs_disabled())
                print_irqtrace_events(prev);
        dump_stack();
-       add_taint(TAINT_WARN);
+       add_taint(TAINT_WARN, LOCKDEP_STILL_OK);
 }
 
 /*
 
                int i;
                for (i = 0; i < BITS_PER_LONG && tmptaint >> i; i++) {
                        if ((tmptaint >> i) & 1)
-                               add_taint(i);
+                               add_taint(i, LOCKDEP_STILL_OK);
                }
        }
 
 
                print_modules();
                show_regs(regs);
                print_oops_end_marker();
-               add_taint(BUG_GET_TAINT(bug));
+               /* Just a warning, don't kill lockdep. */
+               add_taint(BUG_GET_TAINT(bug), LOCKDEP_STILL_OK);
                return BUG_TRAP_TYPE_WARN;
        }
 
 
                print_symbol(KERN_ALERT "vma->vm_file->f_op->mmap: %s\n",
                                (unsigned long)vma->vm_file->f_op->mmap);
        dump_stack();
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 static inline bool is_cow_mapping(vm_flags_t flags)
 
 out:
        /* Leave bad fields for debug, except PageBuddy could make trouble */
        reset_page_mapcount(page); /* remove PageBuddy */
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 /*
 
        printk(KERN_ERR "slab error in %s(): cache `%s': %s\n",
               function, cachep->name, msg);
        dump_stack();
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 #endif
 
 
        printk(KERN_ERR "----------------------------------------"
                        "-------------------------------------\n\n");
 
-       add_taint(TAINT_BAD_PAGE);
+       add_taint(TAINT_BAD_PAGE, LOCKDEP_NOW_UNRELIABLE);
 }
 
 static void slab_fix(struct kmem_cache *s, char *fmt, ...)
 
                return -EINVAL;
 
        /* Userspace has been fiddling around behind the kernel's back */
-       add_taint(TAINT_USER);
+       add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE);
 
        snd_soc_write(codec, reg, value);
        return buf_size;