Renamed flags.diff fileflags.diff.
[rsync/rsync-patches.git] / preallocate.diff
index 3481313..74f3238 100644 (file)
@@ -9,76 +9,77 @@ To use this patch, run these commands for a successful build:
     ./configure
     make
 
     ./configure
     make
 
---- old/configure.in
-+++ new/configure.in
-@@ -560,7 +560,7 @@ AC_CHECK_FUNCS(waitpid wait4 getcwd strd
+diff --git a/configure.in b/configure.in
+--- a/configure.in
++++ b/configure.in
+@@ -552,7 +552,7 @@ AC_CHECK_FUNCS(waitpid wait4 getcwd strdup chown chmod lchmod mknod mkfifo \
      strlcat strlcpy strtol mallinfo getgroups setgroups geteuid getegid \
      setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \
      strlcat strlcpy strtol mallinfo getgroups setgroups geteuid getegid \
      setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \
-     strerror putenv iconv_open locale_charset nl_langinfo \
--    sigaction sigprocmask)
-+    sigaction sigprocmask posix_fallocate)
+     strerror putenv iconv_open locale_charset nl_langinfo getxattr \
+-    extattr_get_link sigaction sigprocmask setattrlist)
++    extattr_get_link sigaction sigprocmask setattrlist posix_fallocate)
  
  
- AC_CHECK_FUNCS(getpgrp tcgetpgrp)
- if test $ac_cv_func_getpgrp = yes; then
---- old/options.c
-+++ new/options.c
-@@ -70,6 +70,7 @@ int remove_source_files = 0;
+ dnl cygwin iconv.h defines iconv_open as libiconv_open
+ if test x"$ac_cv_func_iconv_open" != x"yes"; then
+diff --git a/options.c b/options.c
+--- a/options.c
++++ b/options.c
+@@ -72,6 +72,7 @@ int remove_source_files = 0;
  int one_file_system = 0;
  int protocol_version = PROTOCOL_VERSION;
  int sparse_files = 0;
 +int preallocate_files = 0;
  int do_compression = 0;
  int def_compress_level = Z_DEFAULT_COMPRESSION;
  int one_file_system = 0;
  int protocol_version = PROTOCOL_VERSION;
  int sparse_files = 0;
 +int preallocate_files = 0;
  int do_compression = 0;
  int def_compress_level = Z_DEFAULT_COMPRESSION;
- int am_root = 0;
-@@ -205,6 +206,7 @@ static void print_rsync_version(enum log
-       char const *xattrs = "no ";
+ int am_root = 0; /* 0 = normal, 1 = root, 2 = --super, -1 = --fake-super */
+@@ -224,6 +225,7 @@ static void print_rsync_version(enum logcode f)
        char const *links = "no ";
        char const *links = "no ";
+       char const *iconv = "no ";
        char const *ipv6 = "no ";
 +      char const *preallocation = "no ";
        STRUCT_STAT *dumstat;
  
        char const *ipv6 = "no ";
 +      char const *preallocation = "no ";
        STRUCT_STAT *dumstat;
  
- #ifdef HAVE_SOCKETPAIR
-@@ -233,6 +235,10 @@ static void print_rsync_version(enum log
-       ipv6 = "";
+ #if SUBPROTOCOL_VERSION != 0
+@@ -256,6 +258,9 @@ static void print_rsync_version(enum logcode f)
+ #if defined HAVE_LUTIMES && defined HAVE_UTIMES
+       symtimes = "";
  #endif
  #endif
 +#ifdef SUPPORT_PREALLOCATION
 +      preallocation = "";
 +#endif
 +#ifdef SUPPORT_PREALLOCATION
 +      preallocation = "";
 +#endif
-+
-       rprintf(f, "%s  version %s  protocol version %d\n",
-               RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION);
-       rprintf(f, "Copyright (C) 1996-2007 by Andrew Tridgell, Wayne Davison, and others.\n");
-@@ -243,8 +249,8 @@ static void print_rsync_version(enum log
+       rprintf(f, "%s  version %s  protocol version %d%s\n",
+               RSYNC_NAME, RSYNC_VERSION, PROTOCOL_VERSION, subprotocol);
+@@ -269,8 +274,8 @@ static void print_rsync_version(enum logcode f)
                (int)(sizeof (int64) * 8));
        rprintf(f, "    %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
                got_socketpair, hardlinks, links, ipv6, have_inplace);
                (int)(sizeof (int64) * 8));
        rprintf(f, "    %ssocketpairs, %shardlinks, %ssymlinks, %sIPv6, batchfiles, %sinplace,\n",
                got_socketpair, hardlinks, links, ipv6, have_inplace);
--      rprintf(f, "    %sappend, %sACLs, %sxattrs\n",
--              have_inplace, acls, xattrs);
-+      rprintf(f, "    %sappend, %sACLs, %sxattrs, %spreallocation\n",
-+              have_inplace, acls, xattrs, preallocation);
+-      rprintf(f, "    %sappend, %sACLs, %sxattrs, %siconv, %ssymtimes\n",
+-              have_inplace, acls, xattrs, iconv, symtimes);
++      rprintf(f, "    %sappend, %sACLs, %sxattrs, %siconv, %ssymtimes, %spreallocation\n",
++              have_inplace, acls, xattrs, iconv, symtimes, preallocation);
  
  #ifdef MAINTAINER_MODE
        rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
  
  #ifdef MAINTAINER_MODE
        rprintf(f, "Panic Action: \"%s\"\n", get_panic_action());
-@@ -327,6 +333,9 @@ void usage(enum logcode F)
-   rprintf(F," -O, --omit-dir-times        omit directories when preserving times\n");
-   rprintf(F,"     --super                 receiver attempts super-user activities\n");
+@@ -357,6 +362,9 @@ void usage(enum logcode F)
+   rprintf(F,"     --fake-super            store/recover privileged attrs using xattrs\n");
+ #endif
    rprintf(F," -S, --sparse                handle sparse files efficiently\n");
 +#ifdef SUPPORT_PREALLOCATION
 +  rprintf(F,"     --preallocate           posix_fallocate dest files before writing them\n");
 +#endif
    rprintf(F," -S, --sparse                handle sparse files efficiently\n");
 +#ifdef SUPPORT_PREALLOCATION
 +  rprintf(F,"     --preallocate           posix_fallocate dest files before writing them\n");
 +#endif
-   rprintf(F," -n, --dry-run               show what would have been transferred\n");
-   rprintf(F," -W, --whole-file            copy files whole (without rsync algorithm)\n");
+   rprintf(F," -n, --dry-run               perform a trial run with no changes made\n");
+   rprintf(F," -W, --whole-file            copy files whole (without delta-xfer algorithm)\n");
    rprintf(F," -x, --one-file-system       don't cross filesystem boundaries\n");
    rprintf(F," -x, --one-file-system       don't cross filesystem boundaries\n");
-@@ -494,6 +503,7 @@ static struct poptOption long_options[] 
+@@ -537,6 +545,7 @@ static struct poptOption long_options[] = {
    {"max-size",         0,  POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
    {"min-size",         0,  POPT_ARG_STRING, &min_size_arg, OPT_MIN_SIZE, 0, 0 },
    {"sparse",          'S', POPT_ARG_NONE,   &sparse_files, 0, 0, 0 },
 +  {"preallocate",      0,  POPT_ARG_NONE,   &preallocate_files, 0, 0, 0},
    {"inplace",          0,  POPT_ARG_NONE,   &inplace, 0, 0, 0 },
    {"max-size",         0,  POPT_ARG_STRING, &max_size_arg, OPT_MAX_SIZE, 0, 0 },
    {"min-size",         0,  POPT_ARG_STRING, &min_size_arg, OPT_MIN_SIZE, 0, 0 },
    {"sparse",          'S', POPT_ARG_NONE,   &sparse_files, 0, 0, 0 },
 +  {"preallocate",      0,  POPT_ARG_NONE,   &preallocate_files, 0, 0, 0},
    {"inplace",          0,  POPT_ARG_NONE,   &inplace, 0, 0, 0 },
-   {"append",           0,  POPT_ARG_VAL,    &append_mode, 1, 0, 0 },
-   {"del",              0,  POPT_ARG_NONE,   &delete_during, 0, 0, 0 },
-@@ -1187,6 +1197,15 @@ int parse_arguments(int *argc, const cha
+   {"append",           0,  POPT_ARG_NONE,   0, OPT_APPEND, 0, 0 },
+   {"append-verify",    0,  POPT_ARG_VAL,    &append_mode, 2, 0, 0 },
+@@ -1311,6 +1320,15 @@ int parse_arguments(int *argc_p, const char ***argv_p, int frommain)
        }
  #endif
  
        }
  #endif
  
@@ -94,18 +95,19 @@ To use this patch, run these commands for a successful build:
        if (write_batch && read_batch) {
                snprintf(err_buf, sizeof err_buf,
                        "--write-batch and --read-batch can not be used together\n");
        if (write_batch && read_batch) {
                snprintf(err_buf, sizeof err_buf,
                        "--write-batch and --read-batch can not be used together\n");
-@@ -1838,6 +1857,9 @@ void server_options(char **args,int *arg
+@@ -2022,6 +2040,9 @@ void server_options(char **args, int *argc_p)
        else if (remove_source_files)
                args[ac++] = "--remove-sent-files";
  
 +      if (preallocate_files && am_sender)
 +              args[ac++] = "--preallocate";
 +
        else if (remove_source_files)
                args[ac++] = "--remove-sent-files";
  
 +      if (preallocate_files && am_sender)
 +              args[ac++] = "--preallocate";
 +
-       *argc = ac;
+       *argc_p = ac;
        return;
  
        return;
  
---- old/receiver.c
-+++ new/receiver.c
+diff --git a/receiver.c b/receiver.c
+--- a/receiver.c
++++ b/receiver.c
 @@ -45,6 +45,7 @@ extern int cleanup_got_literal;
  extern int remove_source_files;
  extern int append_mode;
 @@ -45,6 +45,7 @@ extern int cleanup_got_literal;
  extern int remove_source_files;
  extern int append_mode;
@@ -114,12 +116,12 @@ To use this patch, run these commands for a successful build:
  extern int keep_partial;
  extern int checksum_seed;
  extern int inplace;
  extern int keep_partial;
  extern int checksum_seed;
  extern int inplace;
-@@ -138,6 +139,19 @@ static int receive_data(int f_in, char *
+@@ -175,6 +176,19 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
        int32 i;
        char *map = NULL;
  
 +#ifdef SUPPORT_PREALLOCATION
        int32 i;
        char *map = NULL;
  
 +#ifdef SUPPORT_PREALLOCATION
-+      int preallocated_len = 0;
++      OFF_T preallocated_len = 0;
 +
 +      if (preallocate_files && fd != -1 && total_size > 0) {
 +              /* Preallocate enough space for file's eventual length if
 +
 +      if (preallocate_files && fd != -1 && total_size > 0) {
 +              /* Preallocate enough space for file's eventual length if
@@ -134,7 +136,7 @@ To use this patch, run these commands for a successful build:
        read_sum_head(f_in, &sum);
  
        if (fd_r >= 0 && size_r > 0) {
        read_sum_head(f_in, &sum);
  
        if (fd_r >= 0 && size_r > 0) {
-@@ -245,8 +259,18 @@ static int receive_data(int f_in, char *
+@@ -284,8 +298,18 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
                goto report_write_error;
  
  #ifdef HAVE_FTRUNCATE
                goto report_write_error;
  
  #ifdef HAVE_FTRUNCATE
@@ -151,13 +153,14 @@ To use this patch, run these commands for a successful build:
 +              if (ftruncate(fd, offset) < 0)
 +                      /* If we fail to truncate, the dest file may be wrong, so we
 +                       * must trigger the "partial transfer" error. */
 +              if (ftruncate(fd, offset) < 0)
 +                      /* If we fail to truncate, the dest file may be wrong, so we
 +                       * must trigger the "partial transfer" error. */
-+                      rsyserr(FERROR, errno, "ftruncate %s", full_fname(fname));
++                      rsyserr(FERROR_XFER, errno, "ftruncate %s", full_fname(fname));
  #endif
  
        if (do_progress)
  #endif
  
        if (do_progress)
---- old/rsync.h
-+++ new/rsync.h
-@@ -549,6 +549,10 @@ struct idev_node {
+diff --git a/rsync.h b/rsync.h
+--- a/rsync.h
++++ b/rsync.h
+@@ -602,6 +602,10 @@ struct ht_int64_node {
  #define ACLS_NEED_MASK 1
  #endif
  
  #define ACLS_NEED_MASK 1
  #endif
  
@@ -165,20 +168,21 @@ To use this patch, run these commands for a successful build:
 +#define SUPPORT_PREALLOCATION 1
 +#endif
 +
 +#define SUPPORT_PREALLOCATION 1
 +#endif
 +
- #define GID_NONE ((gid_t)-1)
  union file_extras {
  union file_extras {
---- old/rsync.yo
-+++ new/rsync.yo
-@@ -334,6 +334,7 @@ to the detailed description below for a 
-  -O, --omit-dir-times        omit directories when preserving times
+       int32 num;
+       uint32 unum;
+diff --git a/rsync.yo b/rsync.yo
+--- a/rsync.yo
++++ b/rsync.yo
+@@ -352,6 +352,7 @@ to the detailed description below for a complete description.  verb(
       --super                 receiver attempts super-user activities
       --super                 receiver attempts super-user activities
+      --fake-super            store/recover privileged attrs using xattrs
   -S, --sparse                handle sparse files efficiently
 +     --preallocate           posix_fallocate dest files before writing
   -S, --sparse                handle sparse files efficiently
 +     --preallocate           posix_fallocate dest files before writing
-  -n, --dry-run               show what would have been transferred
-  -W, --whole-file            copy files whole (without rsync algorithm)
+  -n, --dry-run               perform a trial run with no changes made
+  -W, --whole-file            copy files whole (w/o delta-xfer algorithm)
   -x, --one-file-system       don't cross filesystem boundaries
   -x, --one-file-system       don't cross filesystem boundaries
-@@ -920,6 +921,19 @@ NOTE: Don't use this option when the des
+@@ -1036,6 +1037,19 @@ NOTE: Don't use this option when the destination is a Solaris "tmpfs"
  filesystem. It doesn't seem to handle seeks over null regions
  correctly and ends up corrupting the files.
  
  filesystem. It doesn't seem to handle seeks over null regions
  correctly and ends up corrupting the files.
  
@@ -195,11 +199,12 @@ To use this patch, run these commands for a successful build:
 +fragments to one.  However, on Linux, this option appears to just waste
 +disk I/O.
 +
 +fragments to one.  However, on Linux, this option appears to just waste
 +disk I/O.
 +
- dit(bf(-n, --dry-run)) This tells rsync to not do any file transfers,
- instead it will just report the actions it would have taken.
---- old/t_stub.c
-+++ new/t_stub.c
+ dit(bf(-n, --dry-run)) This makes rsync perform a trial run that doesn't
+ make any changes (and produces mostly the same output as a real run).  It
+ is most commonly used in combination with the bf(-v, --verbose) and/or
+diff --git a/t_stub.c b/t_stub.c
+--- a/t_stub.c
++++ b/t_stub.c
 @@ -22,6 +22,7 @@
  #include "rsync.h"
  
 @@ -22,6 +22,7 @@
  #include "rsync.h"
  
@@ -208,9 +213,10 @@ To use this patch, run these commands for a successful build:
  int module_id = -1;
  int relative_paths = 0;
  int human_readable = 0;
  int module_id = -1;
  int relative_paths = 0;
  int human_readable = 0;
---- old/util.c
-+++ new/util.c
-@@ -24,6 +24,7 @@
+diff --git a/util.c b/util.c
+--- a/util.c
++++ b/util.c
+@@ -25,6 +25,7 @@
  
  extern int verbose;
  extern int dry_run;
  
  extern int verbose;
  extern int dry_run;
@@ -218,19 +224,19 @@ To use this patch, run these commands for a successful build:
  extern int module_id;
  extern int modify_window;
  extern int relative_paths;
  extern int module_id;
  extern int modify_window;
  extern int relative_paths;
-@@ -269,6 +270,10 @@ int copy_file(const char *source, const 
-       int ofd;
+@@ -273,6 +274,10 @@ int copy_file(const char *source, const char *dest, int ofd,
+       int ifd;
        char buf[1024 * 8];
        int len;   /* Number of bytes read into `buf'. */
 +#ifdef SUPPORT_PREALLOCATION
        char buf[1024 * 8];
        int len;   /* Number of bytes read into `buf'. */
 +#ifdef SUPPORT_PREALLOCATION
-+      int preallocated_len = 0;
-+      int offset = 0;
++      OFF_T preallocated_len = 0;
++      OFF_T offset = 0;
 +#endif
  
 +#endif
  
-       ifd = do_open(source, O_RDONLY, 0);
-       if (ifd == -1) {
-@@ -288,7 +293,27 @@ int copy_file(const char *source, const 
-               return -1;
+       if ((ifd = do_open(source, O_RDONLY, 0)) < 0) {
+               rsyserr(FERROR_XFER, errno, "open %s", full_fname(source));
+@@ -294,7 +299,27 @@ int copy_file(const char *source, const char *dest, int ofd,
+               }
        }
  
 +#ifdef SUPPORT_PREALLOCATION
        }
  
 +#ifdef SUPPORT_PREALLOCATION
@@ -255,9 +261,9 @@ To use this patch, run these commands for a successful build:
 +              offset += len;
 +#endif
                if (full_write(ofd, buf, len) < 0) {
 +              offset += len;
 +#endif
                if (full_write(ofd, buf, len) < 0) {
-                       rsyserr(FERROR, errno, "write %s", full_fname(dest));
+                       rsyserr(FERROR_XFER, errno, "write %s", full_fname(dest));
                        close(ifd);
                        close(ifd);
-@@ -309,6 +334,16 @@ int copy_file(const char *source, const 
+@@ -315,6 +340,16 @@ int copy_file(const char *source, const char *dest, int ofd,
                        full_fname(source));
        }
  
                        full_fname(source));
        }
  
@@ -268,9 +274,9 @@ To use this patch, run these commands for a successful build:
 +              if (ftruncate(ofd, offset) < 0)
 +                      /* If we fail to truncate, the dest file may be wrong, so we
 +                       * must trigger the "partial transfer" error. */
 +              if (ftruncate(ofd, offset) < 0)
 +                      /* If we fail to truncate, the dest file may be wrong, so we
 +                       * must trigger the "partial transfer" error. */
-+                      rsyserr(FERROR, errno, "ftruncate %s", full_fname(dest));
++                      rsyserr(FERROR_XFER, errno, "ftruncate %s", full_fname(dest));
 +#endif
 +
        if (close(ofd) < 0) {
 +#endif
 +
        if (close(ofd) < 0) {
-               rsyserr(FERROR, errno, "close failed on %s",
+               rsyserr(FERROR_XFER, errno, "close failed on %s",
                        full_fname(dest));
                        full_fname(dest));