diff options
author | Junio C Hamano <gitster@pobox.com> | 2021-06-04 01:36:11 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-06-05 13:13:40 (GMT) |
commit | cccdfd22436ede80b37311e73a5c8339054a7ff1 (patch) | |
tree | 1de394e2112a271deebf6413fdbbe44f524bd2c5 /write-or-die.c | |
parent | 48bf2fa8bad054d66bd79c6ba903c89c704201f7 (diff) | |
download | git-cccdfd22436ede80b37311e73a5c8339054a7ff1.zip git-cccdfd22436ede80b37311e73a5c8339054a7ff1.tar.gz git-cccdfd22436ede80b37311e73a5c8339054a7ff1.tar.bz2 |
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 <randall.becker@nexbridge.ca>
Helped-by: Jeff King <peff@peff.net>
Helped-by: Taylor Blau <me@ttaylorr.com>
[jc: the above two did most of the work---I just tied the loose end]
Helped-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'write-or-die.c')
-rw-r--r-- | write-or-die.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/write-or-die.c b/write-or-die.c index eab8c8d..d33e68f 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); } } |