X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/c0c7984e7f6009b6ab18ad3da998a56a9c0f083d..refs/heads/master:/fsync.diff diff --git a/fsync.diff b/fsync.diff index e0cdbbf..4e1b545 100644 --- a/fsync.diff +++ b/fsync.diff @@ -7,6 +7,7 @@ To use this patch, run these commands for a successful build: ./configure (optional if already run) make +based-on: a01e3b490eb36ccf9e704840e1b6683dab867550 diff --git a/options.c b/options.c --- a/options.c +++ b/options.c @@ -18,15 +19,15 @@ diff --git a/options.c b/options.c int preserve_links = 0; int preserve_hard_links = 0; int preserve_acls = 0; -@@ -383,6 +384,7 @@ void usage(enum logcode F) +@@ -731,6 +732,7 @@ void usage(enum logcode F) rprintf(F," --partial-dir=DIR put a partially transferred file into DIR\n"); rprintf(F," --delay-updates put all updated files into place at transfer's end\n"); rprintf(F," -m, --prune-empty-dirs prune empty directory chains from the file-list\n"); + rprintf(F," --fsync fsync every written file\n"); rprintf(F," --numeric-ids don't map uid/gid values by user/group name\n"); - rprintf(F," --timeout=SECONDS set I/O timeout in seconds\n"); - rprintf(F," --contimeout=SECONDS set daemon connection timeout in seconds\n"); -@@ -626,6 +628,7 @@ static struct poptOption long_options[] = { + rprintf(F," --usermap=STRING custom username mapping\n"); + rprintf(F," --groupmap=STRING custom groupname mapping\n"); +@@ -989,6 +991,7 @@ static struct poptOption long_options[] = { {"no-timeout", 0, POPT_ARG_VAL, &io_timeout, 0, 0, 0 }, {"contimeout", 0, POPT_ARG_INT, &connect_timeout, 0, 0, 0 }, {"no-contimeout", 0, POPT_ARG_VAL, &connect_timeout, 0, 0, 0 }, @@ -34,7 +35,7 @@ diff --git a/options.c b/options.c {"rsh", 'e', POPT_ARG_STRING, &shell_cmd, 0, 0, 0 }, {"rsync-path", 0, POPT_ARG_STRING, &rsync_path, 0, 0, 0 }, {"temp-dir", 'T', POPT_ARG_STRING, &tmpdir, 0, 0, 0 }, -@@ -2003,6 +2006,9 @@ void server_options(char **args, int *argc_p) +@@ -2607,6 +2610,9 @@ void server_options(char **args, int *argc_p) args[ac++] = tmpdir; } @@ -47,7 +48,7 @@ diff --git a/options.c b/options.c diff --git a/receiver.c b/receiver.c --- a/receiver.c +++ b/receiver.c -@@ -39,6 +39,7 @@ extern int relative_paths; +@@ -38,6 +38,7 @@ extern int relative_paths; extern int preserve_hard_links; extern int preserve_perms; extern int preserve_xattrs; @@ -55,9 +56,9 @@ diff --git a/receiver.c b/receiver.c extern int basis_dir_cnt; extern int make_backups; extern int cleanup_got_literal; -@@ -298,6 +299,12 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, - exit_cleanup(RERR_FILEIO); - } +@@ -337,6 +338,12 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r, + if (sum_end(file_sum1) != checksum_len) + overflow_exit("checksum_len"); /* Impossible... */ + if (do_fsync && fd != -1 && fsync(fd) != 0) { + rsyserr(FERROR, errno, "fsync failed on %s", @@ -65,9 +66,9 @@ diff --git a/receiver.c b/receiver.c + exit_cleanup(RERR_FILEIO); + } + - sum_len = sum_end(file_sum1); - if (mapbuf) + unmap_file(mapbuf); + diff --git a/t_stub.c b/t_stub.c --- a/t_stub.c +++ b/t_stub.c @@ -82,15 +83,15 @@ diff --git a/t_stub.c b/t_stub.c diff --git a/util.c b/util.c --- a/util.c +++ b/util.c -@@ -26,6 +26,7 @@ - extern int verbose; +@@ -27,6 +27,7 @@ + extern int dry_run; extern int module_id; +extern int do_fsync; extern int modify_window; extern int relative_paths; - extern int human_readable; -@@ -315,6 +316,13 @@ int copy_file(const char *source, const char *dest, int ofd, + extern int preserve_xattrs; +@@ -382,6 +383,13 @@ int copy_file(const char *source, const char *dest, int ofd, mode_t mode) full_fname(source)); } @@ -102,5 +103,5 @@ diff --git a/util.c b/util.c + } + if (close(ofd) < 0) { + int save_errno = errno; rsyserr(FERROR_XFER, errno, "close failed on %s", - full_fname(dest));