Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2021-06-04 04:36:11 +0300
committerJunio C Hamano <gitster@pobox.com>2021-06-05 16:13:40 +0300
commitcccdfd22436ede80b37311e73a5c8339054a7ff1 (patch)
tree1de394e2112a271deebf6413fdbbe44f524bd2c5 /write-or-die.c
parent48bf2fa8bad054d66bd79c6ba903c89c704201f7 (diff)
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.c5
1 files changed, 3 insertions, 2 deletions
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);
}
}