Annotation of embedaddon/rsync/patches/direct-io.diff, revision 1.1
1.1 ! misho 1: This patch adds the --direct-io option, which opens files with O_DIRECT.
! 2:
! 3: TODO: we probably need to make our I/O aligned on 512-byte boundaries.
! 4:
! 5: Written by: Dag Wieers
! 6:
! 7: To use this patch, run these commands for a successful build:
! 8:
! 9: patch -p1 <patches/direct-io.diff
! 10: ./configure (optional if already run)
! 11: make
! 12:
! 13: based-on: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
! 14: diff --git a/options.c b/options.c
! 15: --- a/options.c
! 16: +++ b/options.c
! 17: @@ -24,6 +24,7 @@
! 18: #include "ifuncs.h"
! 19: #include <popt.h>
! 20:
! 21: +extern int direct_io;
! 22: extern int module_id;
! 23: extern int local_server;
! 24: extern int sanitize_paths;
! 25: @@ -754,6 +755,8 @@ static struct poptOption long_options[] = {
! 26: {"partial-dir", 0, POPT_ARG_STRING, &partial_dir, 0, 0, 0 },
! 27: {"delay-updates", 0, POPT_ARG_VAL, &delay_updates, 1, 0, 0 },
! 28: {"no-delay-updates", 0, POPT_ARG_VAL, &delay_updates, 0, 0, 0 },
! 29: + {"direct-io", 'n', POPT_ARG_VAL, &direct_io, 1, 0, 0 },
! 30: + {"no-direct-io", 0, POPT_ARG_VAL, &direct_io, 0, 0, 0 },
! 31: {"prune-empty-dirs",'m', POPT_ARG_VAL, &prune_empty_dirs, 1, 0, 0 },
! 32: {"no-prune-empty-dirs",0,POPT_ARG_VAL, &prune_empty_dirs, 0, 0, 0 },
! 33: {"no-m", 0, POPT_ARG_VAL, &prune_empty_dirs, 0, 0, 0 },
! 34: diff --git a/rsync.1.md b/rsync.1.md
! 35: --- a/rsync.1.md
! 36: +++ b/rsync.1.md
! 37: @@ -409,6 +409,7 @@ detailed description below for a complete description.
! 38: --partial keep partially transferred files
! 39: --partial-dir=DIR put a partially transferred file into DIR
! 40: --delay-updates put all updated files into place at end
! 41: +--direct-io don't use buffer cache for xfer file I/O
! 42: --prune-empty-dirs, -m prune empty directory chains from file-list
! 43: --numeric-ids don't map uid/gid values by user/group name
! 44: --usermap=STRING custom username mapping
! 45: @@ -3012,6 +3013,16 @@ your home directory (remove the '=' for that).
! 46: update algorithm that is even more atomic (it uses `--link-dest` and a
! 47: parallel hierarchy of files).
! 48:
! 49: +0. `--direct-io`
! 50: +
! 51: + This option opens files with a direct-I/O flag that makes the file I/O
! 52: + avoid the buffer cache. The option only affects one side of the transfer
! 53: + (unless the transfer is local). If you want it to affect both sides, use
! 54: + the `--remote-option` (`-M`) option to specify it for the remote side. For
! 55: + instance, this specifies it for both sides:
! 56: +
! 57: + > rsync -av {,-M}--direct-io /src/ host:/dest/
! 58: +
! 59: 0. `--prune-empty-dirs`, `-m`
! 60:
! 61: This option tells the receiving rsync to get rid of empty directories from
! 62: diff --git a/syscall.c b/syscall.c
! 63: --- a/syscall.c
! 64: +++ b/syscall.c
! 65: @@ -44,6 +44,8 @@ extern int preserve_perms;
! 66: extern int preserve_executability;
! 67: extern int open_noatime;
! 68:
! 69: +int direct_io = 0;
! 70: +
! 71: #ifndef S_BLKSIZE
! 72: # if defined hpux || defined __hpux__ || defined __hpux
! 73: # define S_BLKSIZE 1024
! 74: @@ -91,7 +93,12 @@ int do_symlink(const char *lnk, const char *fname)
! 75: * and write the lnk into it. */
! 76: if (am_root < 0) {
! 77: int ok, len = strlen(lnk);
! 78: - int fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
! 79: + int flags = O_WRONLY|O_CREAT|O_TRUNC;
! 80: +
! 81: + if (direct_io)
! 82: + flags |= O_DIRECT;
! 83: +
! 84: + int fd = open(fname, flags, S_IWUSR|S_IRUSR);
! 85: if (fd < 0)
! 86: return -1;
! 87: ok = write(fd, lnk, len) == len;
! 88: @@ -220,6 +227,8 @@ int do_open(const char *pathname, int flags, mode_t mode)
! 89: if (open_noatime)
! 90: flags |= O_NOATIME;
! 91: #endif
! 92: + if (direct_io)
! 93: + flags |= O_DIRECT;
! 94:
! 95: return open(pathname, flags | O_BINARY, mode);
! 96: }
! 97: @@ -624,6 +633,9 @@ int do_open_nofollow(const char *pathname, int flags)
! 98: #endif
! 99: }
! 100:
! 101: + if (direct_io)
! 102: + flags |= O_DIRECT;
! 103: +
! 104: #ifdef O_NOFOLLOW
! 105: fd = open(pathname, flags|O_NOFOLLOW);
! 106: #else
! 107: diff -Nurp a/rsync.1 b/rsync.1
! 108: --- a/rsync.1
! 109: +++ b/rsync.1
! 110: @@ -485,6 +485,7 @@ detailed description below for a complet
! 111: --partial keep partially transferred files
! 112: --partial-dir=DIR put a partially transferred file into DIR
! 113: --delay-updates put all updated files into place at end
! 114: +--direct-io don't use buffer cache for xfer file I/O
! 115: --prune-empty-dirs, -m prune empty directory chains from file-list
! 116: --numeric-ids don't map uid/gid values by user/group name
! 117: --usermap=STRING custom username mapping
! 118: @@ -3073,6 +3074,18 @@ delayed updates will fail if they can't
! 119: See also the "atomic-rsync" perl script in the "support" subdir for an
! 120: update algorithm that is even more atomic (it uses \fB\-\-link-dest\fP and a
! 121: parallel hierarchy of files).
! 122: +.IP "\fB\-\-direct-io\fP"
! 123: +This option opens files with a direct-I/O flag that makes the file I/O
! 124: +avoid the buffer cache. The option only affects one side of the transfer
! 125: +(unless the transfer is local). If you want it to affect both sides, use
! 126: +the \fB\-\-remote-option\fP (\fB\-M\fP) option to specify it for the remote side. For
! 127: +instance, this specifies it for both sides:
! 128: +.RS 4
! 129: +.IP
! 130: +.nf
! 131: +rsync -av {,-M}--direct-io /src/ host:/dest/
! 132: +.fi
! 133: +.RE
! 134: .IP "\fB\-\-prune-empty-dirs\fP, \fB\-m\fP"
! 135: This option tells the receiving rsync to get rid of empty directories from
! 136: the file-list, including nested directories that have no non-directory
! 137: diff -Nurp a/rsync.1.html b/rsync.1.html
! 138: --- a/rsync.1.html
! 139: +++ b/rsync.1.html
! 140: @@ -400,6 +400,7 @@ detailed description below for a complet
! 141: --partial keep partially transferred files
! 142: --partial-dir=DIR put a partially transferred file into DIR
! 143: --delay-updates put all updated files into place at end
! 144: +--direct-io don't use buffer cache for xfer file I/O
! 145: --prune-empty-dirs, -m prune empty directory chains from file-list
! 146: --numeric-ids don't map uid/gid values by user/group name
! 147: --usermap=STRING custom username mapping
! 148: @@ -2845,6 +2846,18 @@ update algorithm that is even more atomi
! 149: parallel hierarchy of files).</p>
! 150: </dd>
! 151:
! 152: +<dt><code>--direct-io</code></dt><dd>
! 153: +<p>This option opens files with a direct-I/O flag that makes the file I/O
! 154: +avoid the buffer cache. The option only affects one side of the transfer
! 155: +(unless the transfer is local). If you want it to affect both sides, use
! 156: +the <code>--remote-option</code> (<code>-M</code>) option to specify it for the remote side. For
! 157: +instance, this specifies it for both sides:</p>
! 158: +<blockquote>
! 159: +<pre><code>rsync -av {,-M}--direct-io /src/ host:/dest/
! 160: +</code></pre>
! 161: +</blockquote>
! 162: +</dd>
! 163: +
! 164: <dt><code>--prune-empty-dirs</code>, <code>-m</code></dt><dd>
! 165: <p>This option tells the receiving rsync to get rid of empty directories from
! 166: the file-list, including nested directories that have no non-directory
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>