xfs
[Top] [All Lists]

[PATCH v2 2/7] xfsdump: process EPIPE instead of catching SIGPIPE

To: xfs@xxxxxxxxxxx
Subject: [PATCH v2 2/7] xfsdump: process EPIPE instead of catching SIGPIPE
From: Bill Kendall <wkendall@xxxxxxx>
Date: Thu, 4 Aug 2011 17:30:06 -0500
Cc: Bill Kendall <wkendall@xxxxxxx>
In-reply-to: <1312497011-24840-1-git-send-email-wkendall@xxxxxxx>
References: <1312497011-24840-1-git-send-email-wkendall@xxxxxxx>
Looking forward towards a multi-threaded xfsdump, it's simpler to
handle pipe failures as a system call failure (EPIPE) rather than
through a signal handler which may run in a separate thread. The
existing error handling code handles EPIPE just fine, so the only
required change is to ignore SIGPIPE. Some sections of code already
temporarily ignore SIGPIPE -- they no longer need to do so since it
will already be ignored.

Signed-off-by: Bill Kendall <wkendall@xxxxxxx>
---
 common/main.c       |   49 ++++++-------------------------------------------
 common/ring.c       |    1 -
 librmt/rmtcommand.c |    7 +------
 librmt/rmtwrite.c   |    5 -----
 4 files changed, 7 insertions(+), 55 deletions(-)

diff --git a/common/main.c b/common/main.c
index c4d6878..d21b559 100644
--- a/common/main.c
+++ b/common/main.c
@@ -135,7 +135,6 @@ static time32_t stop_deadline;
 static bool_t stop_in_progress;
 static bool_t sighup_received;
 static bool_t sigterm_received;
-static bool_t sigpipe_received;
 static bool_t sigquit_received;
 static bool_t sigint_received;
 static size_t prbcld_cnt;
@@ -547,13 +546,18 @@ main( int argc, char *argv[] )
         * be released at pre-emption points and upon pausing in the main
         * loop.
         */
+
+       /* always ignore SIGPIPE, instead handle EPIPE as part
+        * of normal sys call error handling
+        */
+       sigset( SIGPIPE, SIG_IGN );
+
        if ( ! miniroot && ! pipeline ) {
                stop_in_progress = BOOL_FALSE;
                coredump_requested = BOOL_FALSE;
                sighup_received = BOOL_FALSE;
                sigterm_received = BOOL_FALSE;
                sigint_received = BOOL_FALSE;
-               sigpipe_received = BOOL_FALSE;
                sigquit_received = BOOL_FALSE;
                sigstray_received = BOOL_FALSE;
                prbcld_cnt = 0;
@@ -563,8 +567,6 @@ main( int argc, char *argv[] )
                sighold( SIGHUP );
                sigset( SIGTERM, sighandler );
                sighold( SIGTERM );
-               sigset( SIGPIPE, sighandler );
-               sighold( SIGPIPE );
                sigset( SIGQUIT, sighandler );
                sighold( SIGQUIT );
                alarm( 0 );
@@ -596,7 +598,6 @@ main( int argc, char *argv[] )
                sigset( SIGINT, sighandler );
                sigset( SIGHUP, sighandler );
                sigset( SIGTERM, sighandler );
-               sigset( SIGPIPE, sighandler );
 
                ok = drive_init2( argc,
                                  argv,
@@ -804,16 +805,6 @@ main( int argc, char *argv[] )
                        sigterm_received = BOOL_FALSE;
                }
 
-               /* request a stop on loss of write pipe
-                */
-               if ( sigpipe_received ) {
-                       mlog( MLOG_DEBUG | MLOG_PROC,
-                             "SIGPIPE received\n" );
-                       stop_requested = BOOL_TRUE;
-                       stop_timeout = STOP_TIMEOUT;
-                       sigpipe_received = BOOL_FALSE;
-               }
-               
                /* operator send SIGQUIT. treat like an interrupt,
                 * but force a core dump
                 */
@@ -889,14 +880,12 @@ main( int argc, char *argv[] )
                sigrelse( SIGINT );
                sigrelse( SIGHUP );
                sigrelse( SIGTERM );
-               sigrelse( SIGPIPE );
                sigrelse( SIGQUIT );
                sigrelse( SIGALRM );
                ( void )sigpause( SIGCLD );
                sighold( SIGCLD );
                sighold( SIGALRM );
                sighold( SIGQUIT );
-               sighold( SIGPIPE );
                sighold( SIGTERM );
                sighold( SIGHUP );
                sighold( SIGINT );
@@ -1130,11 +1119,9 @@ preemptchk( int flg )
        sigrelse( SIGINT );
        sigrelse( SIGHUP );
        sigrelse( SIGTERM );
-       sigrelse( SIGPIPE );
        sigrelse( SIGQUIT );
 
        sighold( SIGQUIT );
-       sighold( SIGPIPE );
        sighold( SIGTERM );
        sighold( SIGHUP );
        sighold( SIGINT );
@@ -1170,13 +1157,6 @@ preemptchk( int flg )
                sigterm_received = BOOL_FALSE;
        }
 
-       if ( sigpipe_received ) {
-               mlog( MLOG_DEBUG | MLOG_PROC,
-                     "SIGPIPE received\n" );
-               preempt_requested = BOOL_TRUE;
-               sigpipe_received = BOOL_FALSE;
-       }
-       
        if ( sigquit_received ) {
                mlog( MLOG_DEBUG | MLOG_PROC,
                      "SIGQUIT received (preempt)\n" );
@@ -1602,14 +1582,6 @@ sighandler( int signo )
                        dlog_desist( );
                        sigquit_received = BOOL_TRUE;
                        return;
-               case SIGPIPE:
-                       /* immediately disable further dialogs,
-                        * and ignore subsequent signals
-                        */
-                       dlog_desist( );
-                       sigpipe_received = BOOL_TRUE;
-                       ( void )sigset( signo, SIG_IGN );
-                       return;
                case SIGALRM:
                        return;
                default:
@@ -1638,14 +1610,6 @@ sighandler( int signo )
                        /* can get SIGQUIT during dialog: just dismiss
                         */
                        return;
-               case SIGPIPE:
-                       /* forward write pipe failures to parent,
-                        * and ignore subsequent failures
-                        */
-                       dlog_desist( );
-                       kill( parentpid, SIGPIPE );
-                       ( void )sigset( signo, SIG_IGN );
-                       return;
                case SIGALRM:
                        /* accept and do nothing about alarm signals
                         */
@@ -1678,7 +1642,6 @@ childmain( void *arg1 )
        sigset( SIGTERM, SIG_IGN );
        sigset( SIGINT, SIG_IGN );
        sigset( SIGQUIT, SIG_IGN );
-       sigset( SIGPIPE, SIG_IGN );
        sigset( SIGALRM, SIG_IGN );
        sigset( SIGCLD, SIG_IGN );
 
diff --git a/common/ring.c b/common/ring.c
index f6fc64d..b132ab9 100644
--- a/common/ring.c
+++ b/common/ring.c
@@ -412,7 +412,6 @@ ring_slave_entry( void *ringctxp )
        sigset( SIGHUP, SIG_IGN );
        sigset( SIGINT, SIG_IGN );
        sigset( SIGQUIT, SIG_IGN );
-       sigset( SIGPIPE, SIG_IGN );
        sigset( SIGALRM, SIG_IGN );
        sigset( SIGCLD, SIG_IGN );
 
diff --git a/librmt/rmtcommand.c b/librmt/rmtcommand.c
index 42587e4..fbd7a6a 100644
--- a/librmt/rmtcommand.c
+++ b/librmt/rmtcommand.c
@@ -21,7 +21,6 @@
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <signal.h>
 #include <errno.h>
 
 #include "rmtlib.h"
@@ -36,19 +35,16 @@ int fildes;
 char *buf;
 {
        register int blen;
-       void (*pstat)();
 
        _rmt_msg(RMTDBG, "rmtcommand: fd = %d, buf = %s\n", fildes, buf);
 
 /*
- *     save current pipe status and try to make the request
+ *     try to make the request
  */
 
        blen = strlen(buf);
-       pstat = signal(SIGPIPE, SIG_IGN);
        if (write(WRITE(fildes), buf, blen) == blen)
        {
-               signal(SIGPIPE, pstat);
                return(0);
        }
 
@@ -56,7 +52,6 @@ char *buf;
  *     something went wrong. close down and go home
  */
 
-       signal(SIGPIPE, pstat);
        _rmt_abort(fildes);
 
        setoserror( EIO );
diff --git a/librmt/rmtwrite.c b/librmt/rmtwrite.c
index 7f373ee..c42b1ab 100644
--- a/librmt/rmtwrite.c
+++ b/librmt/rmtwrite.c
@@ -21,7 +21,6 @@
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <signal.h>
 #include <errno.h>
 
 #include "rmtlib.h"
@@ -55,20 +54,16 @@ unsigned int nbyte;
 static int _rmt_write(int fildes, char *buf, unsigned int nbyte)
 {
        char buffer[BUFMAGIC];
-       void (*pstat)();
 
        sprintf(buffer, "W%d\n", nbyte);
        if (_rmt_command(fildes, buffer) == -1)
                return(-1);
 
-       pstat = signal(SIGPIPE, SIG_IGN);
        if (write(WRITE(fildes), buf, nbyte) == nbyte)
        {
-               signal (SIGPIPE, pstat);
                return(_rmt_status(fildes));
        }
 
-       signal (SIGPIPE, pstat);
        _rmt_abort(fildes);
        setoserror( EIO );
        return(-1);
-- 
1.7.0.4

<Prev in Thread] Current Thread [Next in Thread>