Annotation of embedaddon/rsync/patches/fsync.diff, revision 1.1
1.1 ! misho 1: This patch from Sami Farin lets you specify --fsync if you want fsync()
! 2: to be called on every file we write.
! 3:
! 4: To use this patch, run these commands for a successful build:
! 5:
! 6: patch -p1 <patches/fsync.diff
! 7: ./configure (optional if already run)
! 8: make
! 9:
! 10: based-on: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
! 11: diff --git a/options.c b/options.c
! 12: --- a/options.c
! 13: +++ b/options.c
! 14: @@ -66,6 +66,7 @@ int open_noatime = 0;
! 15: int cvs_exclude = 0;
! 16: int dry_run = 0;
! 17: int do_xfers = 1;
! 18: +int do_fsync = 0;
! 19: int ignore_times = 0;
! 20: int delete_mode = 0;
! 21: int delete_during = 0;
! 22: @@ -789,6 +790,7 @@ static struct poptOption long_options[] = {
! 23: {"no-timeout", 0, POPT_ARG_VAL, &io_timeout, 0, 0, 0 },
! 24: {"contimeout", 0, POPT_ARG_INT, &connect_timeout, 0, 0, 0 },
! 25: {"no-contimeout", 0, POPT_ARG_VAL, &connect_timeout, 0, 0, 0 },
! 26: + {"fsync", 0, POPT_ARG_NONE, &do_fsync, 0, 0, 0 },
! 27: {"stop-after", 0, POPT_ARG_STRING, 0, OPT_STOP_AFTER, 0, 0 },
! 28: {"time-limit", 0, POPT_ARG_STRING, 0, OPT_STOP_AFTER, 0, 0 }, /* earlier stop-after name */
! 29: {"stop-at", 0, POPT_ARG_STRING, 0, OPT_STOP_AT, 0, 0 },
! 30: @@ -2845,6 +2847,9 @@ void server_options(char **args, int *argc_p)
! 31: args[ac++] = tmpdir;
! 32: }
! 33:
! 34: + if (do_fsync)
! 35: + args[ac++] = "--fsync";
! 36: +
! 37: if (basis_dir[0]) {
! 38: /* the server only needs this option if it is not the sender,
! 39: * and it may be an older version that doesn't know this
! 40: diff --git a/receiver.c b/receiver.c
! 41: --- a/receiver.c
! 42: +++ b/receiver.c
! 43: @@ -41,6 +41,7 @@ extern int preserve_hard_links;
! 44: extern int preserve_perms;
! 45: extern int write_devices;
! 46: extern int preserve_xattrs;
! 47: +extern int do_fsync;
! 48: extern int basis_dir_cnt;
! 49: extern int make_backups;
! 50: extern int cleanup_got_literal;
! 51: @@ -394,6 +395,12 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
! 52:
! 53: sum_len = sum_end(file_sum1);
! 54:
! 55: + if (do_fsync && fd != -1 && fsync(fd) != 0) {
! 56: + rsyserr(FERROR, errno, "fsync failed on %s",
! 57: + full_fname(fname));
! 58: + exit_cleanup(RERR_FILEIO);
! 59: + }
! 60: +
! 61: if (mapbuf)
! 62: unmap_file(mapbuf);
! 63:
! 64: diff --git a/rsync.1.md b/rsync.1.md
! 65: --- a/rsync.1.md
! 66: +++ b/rsync.1.md
! 67: @@ -410,6 +410,7 @@ detailed description below for a complete description.
! 68: --partial-dir=DIR put a partially transferred file into DIR
! 69: --delay-updates put all updated files into place at end
! 70: --prune-empty-dirs, -m prune empty directory chains from file-list
! 71: +--fsync fsync every written file
! 72: --numeric-ids don't map uid/gid values by user/group name
! 73: --usermap=STRING custom username mapping
! 74: --groupmap=STRING custom groupname mapping
! 75: diff --git a/t_stub.c b/t_stub.c
! 76: --- a/t_stub.c
! 77: +++ b/t_stub.c
! 78: @@ -21,6 +21,7 @@
! 79:
! 80: #include "rsync.h"
! 81:
! 82: +int do_fsync = 0;
! 83: int inplace = 0;
! 84: int modify_window = 0;
! 85: int preallocate_files = 0;
! 86: diff --git a/util.c b/util.c
! 87: --- a/util.c
! 88: +++ b/util.c
! 89: @@ -27,6 +27,7 @@
! 90:
! 91: extern int dry_run;
! 92: extern int module_id;
! 93: +extern int do_fsync;
! 94: extern int protect_args;
! 95: extern int modify_window;
! 96: extern int relative_paths;
! 97: @@ -412,6 +413,13 @@ int copy_file(const char *source, const char *dest, int ofd, mode_t mode)
! 98: rsyserr(FERROR_XFER, errno, "ftruncate %s", full_fname(dest));
! 99: }
! 100:
! 101: + if (do_fsync && fsync(ofd) < 0) {
! 102: + rsyserr(FERROR, errno, "fsync failed on %s",
! 103: + full_fname(dest));
! 104: + close(ofd);
! 105: + return -1;
! 106: + }
! 107: +
! 108: if (close(ofd) < 0) {
! 109: int save_errno = errno;
! 110: rsyserr(FERROR_XFER, errno, "close failed on %s",
! 111: diff -Nurp a/rsync.1 b/rsync.1
! 112: --- a/rsync.1
! 113: +++ b/rsync.1
! 114: @@ -486,6 +486,7 @@ detailed description below for a complet
! 115: --partial-dir=DIR put a partially transferred file into DIR
! 116: --delay-updates put all updated files into place at end
! 117: --prune-empty-dirs, -m prune empty directory chains from file-list
! 118: +--fsync fsync every written file
! 119: --numeric-ids don't map uid/gid values by user/group name
! 120: --usermap=STRING custom username mapping
! 121: --groupmap=STRING custom groupname mapping
! 122: diff -Nurp a/rsync.1.html b/rsync.1.html
! 123: --- a/rsync.1.html
! 124: +++ b/rsync.1.html
! 125: @@ -401,6 +401,7 @@ detailed description below for a complet
! 126: --partial-dir=DIR put a partially transferred file into DIR
! 127: --delay-updates put all updated files into place at end
! 128: --prune-empty-dirs, -m prune empty directory chains from file-list
! 129: +--fsync fsync every written file
! 130: --numeric-ids don't map uid/gid values by user/group name
! 131: --usermap=STRING custom username mapping
! 132: --groupmap=STRING custom groupname mapping
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>