patch-copy_xfs_copy_c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. --- xfsprogs-4.3.0.orig/copy/xfs_copy.c 2015-10-15 23:31:26.000000000 +0200
  2. +++ xfsprogs-4.3.0/copy/xfs_copy.c 2015-11-27 06:04:00.000000000 +0100
  3. @@ -236,6 +236,10 @@ handler(int sig)
  4. {
  5. pid_t pid;
  6. int status, i;
  7. + struct sigaction action;
  8. +
  9. + action.sa_handler = handler;
  10. + action.sa_flags = 0;
  11. pid = wait(&status);
  12. @@ -268,7 +272,7 @@ handler(int sig)
  13. pthread_exit(NULL);
  14. }
  15. - signal(SIGCHLD, handler);
  16. + sigaction(SIGCHLD, &action, NULL);
  17. return;
  18. } else {
  19. /* it just croaked it bigtime, log it */
  20. @@ -290,7 +294,7 @@ handler(int sig)
  21. do_warn(_("%s: Unknown child died (should never happen!)\n"), progname);
  22. die_perror();
  23. pthread_exit(NULL);
  24. - signal(SIGCHLD, handler);
  25. + sigaction(SIGCHLD, &action, NULL);
  26. }
  27. void
  28. @@ -466,6 +470,11 @@ void
  29. write_wbuf(void)
  30. {
  31. int i;
  32. + sigset_t unblock, initial;
  33. +
  34. + sigemptyset(&unblock);
  35. + sigaddset(&unblock, SIGCHLD);
  36. +
  37. /* verify target threads */
  38. for (i = 0; i < num_targets; i++)
  39. @@ -477,9 +486,9 @@ write_wbuf(void)
  40. if (target[i].state != INACTIVE)
  41. pthread_mutex_unlock(&targ[i].wait); /* wake up */
  42. - sigrelse(SIGCHLD);
  43. + sigprocmask(SIG_UNBLOCK, &unblock, &initial);
  44. pthread_mutex_lock(&mainwait);
  45. - sighold(SIGCHLD);
  46. + sigprocmask(SIG_SETMASK, &initial, NULL);
  47. }
  48. void
  49. @@ -551,6 +560,12 @@ main(int argc, char **argv)
  50. libxfs_init_t xargs;
  51. thread_args *tcarg;
  52. struct stat64 statbuf;
  53. + struct sigaction saction;
  54. + sigset_t sigblock, initial;
  55. +
  56. + saction.sa_handler = handler;
  57. + saction.sa_flags = 0;
  58. +
  59. progname = basename(argv[0]);
  60. @@ -892,8 +907,11 @@ main(int argc, char **argv)
  61. /* set up sigchild signal handler */
  62. - signal(SIGCHLD, handler);
  63. - sighold(SIGCHLD);
  64. + sigaction(SIGCHLD, &saction, NULL);
  65. + sigemptyset(&sigblock);
  66. + sigaddset(&sigblock, SIGCHLD);
  67. + sigprocmask(SIG_BLOCK, &sigblock, &initial);
  68. +
  69. /* make children */