| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | $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 */ 
 |