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>