From: Junio C Hamano Date: Fri, 4 Jun 2021 01:36:11 +0000 (+0900) Subject: fsync(): be prepared to see EINTR X-Git-Tag: v2.32.0~3^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cccdfd22436ede80b37311e73a5c8339054a7ff1;p=thirdparty%2Fgit.git fsync(): be prepared to see EINTR Some platforms, like NonStop do not automatically restart fsync() when interrupted by a signal, even when that signal is setup with SA_RESTART. This can lead to test breakage, e.g., where "--progress" is used, thus SIGALRM is sent often, and can interrupt an fsync() syscall. Make sure we deal with such a case by retrying the syscall ourselves. Luckily, we call fsync() fron a single wrapper, fsync_or_die(), so the fix is fairly isolated. Reported-by: Randall S. Becker Helped-by: Jeff King Helped-by: Taylor Blau [jc: the above two did most of the work---I just tied the loose end] Helped-by: René Scharfe Signed-off-by: Junio C Hamano --- diff --git a/write-or-die.c b/write-or-die.c index eab8c8d0b9..d33e68f6ab 100644 --- a/write-or-die.c +++ b/write-or-die.c @@ -57,8 +57,9 @@ void fprintf_or_die(FILE *f, const char *fmt, ...) void fsync_or_die(int fd, const char *msg) { - if (fsync(fd) < 0) { - die_errno("fsync error on '%s'", msg); + while (fsync(fd) < 0) { + if (errno != EINTR) + die_errno("fsync error on '%s'", msg); } }