diff options
Diffstat (limited to 'package/xfsprogs/patches/patch-copy_xfs_copy_c')
-rw-r--r-- | package/xfsprogs/patches/patch-copy_xfs_copy_c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/package/xfsprogs/patches/patch-copy_xfs_copy_c b/package/xfsprogs/patches/patch-copy_xfs_copy_c new file mode 100644 index 000000000..f5205398e --- /dev/null +++ b/package/xfsprogs/patches/patch-copy_xfs_copy_c @@ -0,0 +1,80 @@ +$Id: update-patches 24 2008-08-31 14:56:13Z wbx $ +--- xfsprogs-3.0.0.orig/copy/xfs_copy.c 2009-02-04 23:29:25.000000000 +0100 ++++ xfsprogs-3.0.0/copy/xfs_copy.c 2009-03-27 11:40:33.000000000 +0100 +@@ -240,7 +240,10 @@ handler(int sig) + { + pid_t pid = getpid(); + int status, i; ++ struct sigaction action; + ++ action.sa_handler = handler; ++ action.sa_flags = 0; + pid = wait(&status); + + kids--; +@@ -272,7 +275,7 @@ handler(int sig) + pthread_exit(NULL); + } + +- signal(SIGCHLD, handler); ++ sigaction(SIGCHLD, &action, NULL); + return; + } else { + /* it just croaked it bigtime, log it */ +@@ -294,7 +297,7 @@ handler(int sig) + do_warn(_("%s: Unknown child died (should never happen!)\n"), progname); + die_perror(); + pthread_exit(NULL); +- signal(SIGCHLD, handler); ++ sigaction(SIGCHLD, &action, NULL); + } + + void +@@ -467,6 +470,10 @@ void + write_wbuf(void) + { + int i; ++ sigset_t unblock, initial; ++ ++ sigemptyset(&unblock); ++ sigaddset(&unblock, SIGCHLD); + + /* verify target threads */ + for (i = 0; i < num_targets; i++) +@@ -478,9 +485,9 @@ write_wbuf(void) + if (target[i].state != INACTIVE) + pthread_mutex_unlock(&targ[i].wait); /* wake up */ + +- sigrelse(SIGCHLD); ++ sigprocmask(SIG_UNBLOCK, &unblock, &initial); + pthread_mutex_lock(&mainwait); +- sighold(SIGCHLD); ++ sigprocmask(SIG_SETMASK, &initial, NULL); + } + + +@@ -521,6 +528,11 @@ main(int argc, char **argv) + libxfs_init_t xargs; + thread_args *tcarg; + struct stat64 statbuf; ++ struct sigaction saction; ++ sigset_t sigblock, initial; ++ ++ saction.sa_handler = handler; ++ saction.sa_flags = 0; + + progname = basename(argv[0]); + +@@ -846,8 +858,10 @@ main(int argc, char **argv) + + /* set up sigchild signal handler */ + +- signal(SIGCHLD, handler); +- sighold(SIGCHLD); ++ sigaction(SIGCHLD, &saction, NULL); ++ sigemptyset(&sigblock); ++ sigaddset(&sigblock, SIGCHLD); ++ sigprocmask(SIG_BLOCK, &sigblock, &initial); + + /* make children */ + |