hammer - Fix coredump bug which can stall processes
authorMatthew Dillon <dillon@apollo.backplane.com>
Sat, 5 Mar 2016 03:17:28 +0000 (19:17 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sat, 5 Mar 2016 03:17:28 +0000 (19:17 -0800)
* Fix a coredump bug which can stall the process.  If a process > 100MB is
  in the process of being coredumped, a signal will cause the hammer_write()
  path to hit tstop() due to the core-dump being in progress.  Unfortunately
  the write might be happening from the kernel core generator itself which
  will stall the process forever with a number of locks held.

  hammer only checks for signals on very large (> 100MB) read() and write()
  calls so the issue does not effect coredumps of smaller processes.

* Use CURSIG_NOBLOCK() instead of CURSIG().

sys/vfs/hammer/hammer_signal.c
sys/vfs/hammer2/hammer2_subr.c

index 70765c1..935655d 100644 (file)
@@ -42,9 +42,9 @@
 #include "hammer.h"
 
 /*
- * Check for a user signal interrupting a long operation
- *
- * MPSAFE
+ * Check for a user signal interrupting a long operation.  Do not allow
+ * stopping or blocking, just check to see if an actionable signal is
+ * pending.
  */
 int
 hammer_signal_check(hammer_mount_t hmp)
@@ -56,7 +56,7 @@ hammer_signal_check(hammer_mount_t hmp)
                return(0);
        hmp->check_interrupt = 0;
 
-       if ((sig = CURSIG(curthread->td_lwp)) != 0)
+       if ((sig = CURSIG_NOBLOCK(curthread->td_lwp)) != 0)
                return(EINTR);
        return(0);
 }
index 0f161e7..6857d01 100644 (file)
@@ -404,7 +404,7 @@ hammer2_signal_check(time_t *timep)
        lwkt_user_yield();
        if (*timep != time_second) {
                *timep = time_second;
-               if (CURSIG(curthread->td_lwp) != 0)
+               if (CURSIG_NOBLOCK(curthread->td_lwp) != 0)
                        error = EINTR;
        }
        return error;