From: Jan Beulich Rather than blindly re-enabling interrupts in die(), save their state upon entry and then restore that state. If the kernel is in really bad condition and faults with interrupts disabled, re-enabling them in die() may cause even more trouble, implying more chances of data corruption. Signed-off-by: Andrew Morton --- arch/i386/kernel/traps.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff -puN arch/i386/kernel/traps.c~i386-dont-blindly-enable-interrupts-in-die arch/i386/kernel/traps.c --- devel/arch/i386/kernel/traps.c~i386-dont-blindly-enable-interrupts-in-die 2005-11-09 17:48:23.000000000 -0800 +++ devel-akpm/arch/i386/kernel/traps.c 2005-11-09 17:48:23.000000000 -0800 @@ -306,14 +306,17 @@ void die(const char * str, struct pt_reg .lock_owner_depth = 0 }; static int die_counter; + unsigned long flags; if (die.lock_owner != raw_smp_processor_id()) { console_verbose(); - spin_lock_irq(&die.lock); + spin_lock_irqsave(&die.lock, flags); die.lock_owner = smp_processor_id(); die.lock_owner_depth = 0; bust_spinlocks(1); } + else + local_save_flags(flags); if (++die.lock_owner_depth < 3) { int nl = 0; @@ -340,7 +343,7 @@ void die(const char * str, struct pt_reg bust_spinlocks(0); die.lock_owner = -1; - spin_unlock_irq(&die.lock); + spin_unlock_irqrestore(&die.lock, flags); if (kexec_should_crash(current)) crash_kexec(regs); _