Don't force nanoseconds if a file wasn't transferred or checksummed.
authorWayne Davison <wayned@samba.org>
Mon, 15 Jan 2018 18:52:15 +0000 (10:52 -0800)
committerWayne Davison <wayned@samba.org>
Mon, 15 Jan 2018 18:58:31 +0000 (10:58 -0800)
backup.c
generator.c
rsync.c
rsync.h

index bc5653296c9604bf532c8f624fd8daeb91d39d39..5f40b39af9592ef5017d341cf953cde93565fc2c 100644 (file)
--- a/backup.c
+++ b/backup.c
@@ -336,7 +336,7 @@ int make_backup(const char *fname, BOOL prefer_rename)
 
        save_preserve_xattrs = preserve_xattrs;
        preserve_xattrs = 0;
-       set_file_attrs(buf, file, NULL, fname, 0);
+       set_file_attrs(buf, file, NULL, fname, ATTRS_SET_NANO);
        preserve_xattrs = save_preserve_xattrs;
 
        unmake_file(file);
index 4b0a60e4c4f65a47e4ea203ff648e6e4769f7881..a112da6e97d5998479a838b6f9837e56db23a00d 100644 (file)
@@ -99,6 +99,7 @@ extern struct file_list *cur_flist, *first_flist, *dir_flist;
 extern filter_rule_list filter_list, daemon_filter_list;
 
 int maybe_ATTRS_REPORT = 0;
+int maybe_ATTRS_SET_NANO = 0;
 
 static dev_t dev_zero;
 static int deldelay_size = 0, deldelay_cnt = 0;
@@ -1214,6 +1215,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                return;
        }
 
+       maybe_ATTRS_SET_NANO = always_checksum ? ATTRS_SET_NANO : 0;
+
        if (skip_dir) {
                if (is_below(file, skip_dir)) {
                        if (is_dir)
@@ -1762,7 +1765,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx,
                        do_unlink(partialptr);
                        handle_partial_dir(partialptr, PDIR_DELETE);
                }
-               set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT);
+               set_file_attrs(fname, file, &sx, NULL, maybe_ATTRS_REPORT | maybe_ATTRS_SET_NANO);
                if (itemizing)
                        itemize(fnamecmp, file, ndx, statret, &sx, 0, 0, NULL);
 #ifdef SUPPORT_HARD_LINKS
diff --git a/rsync.c b/rsync.c
index ae036a6b2b7141974b304bd6b90101061ea8dddc..a0b948dc386c7772f3bba9846c310d40013169c1 100644 (file)
--- a/rsync.c
+++ b/rsync.c
@@ -556,7 +556,7 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,
        if (!(flags & ATTRS_SKIP_MTIME)
         && (sxp->st.st_mtime != file->modtime
 #ifdef ST_MTIME_NSEC
-         || (NSEC_BUMP(file) && (uint32)sxp->st.ST_MTIME_NSEC != F_MOD_NSEC(file))
+         || (flags & ATTRS_SET_NANO && NSEC_BUMP(file) && (uint32)sxp->st.ST_MTIME_NSEC != F_MOD_NSEC(file))
 #endif
          )) {
                int ret = set_modtime(fname, file->modtime, F_MOD_NSEC(file), sxp->st.st_mode);
@@ -672,7 +672,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
 
        /* Change permissions before putting the file into place. */
        set_file_attrs(fnametmp, file, NULL, fnamecmp,
-                      ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);
+                      ok_to_set_time ? ATTRS_SET_NANO : ATTRS_SKIP_MTIME);
 
        /* move tmp file over real file */
        if (DEBUG_GTE(RECV, 1))
@@ -697,7 +697,7 @@ int finish_transfer(const char *fname, const char *fnametmp,
 
   do_set_file_attrs:
        set_file_attrs(fnametmp, file, NULL, fnamecmp,
-                      ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);
+                      ok_to_set_time ? ATTRS_SET_NANO : ATTRS_SKIP_MTIME);
 
        if (temp_copy_name) {
                if (do_rename(fnametmp, fname) < 0) {
diff --git a/rsync.h b/rsync.h
index 6c732db38896d256aca6ce97652197ead6efd724..53fff2d630f4a1f7036d06c01459c58698906381 100644 (file)
--- a/rsync.h
+++ b/rsync.h
 
 #define ATTRS_REPORT           (1<<0)
 #define ATTRS_SKIP_MTIME       (1<<1)
+#define ATTRS_SET_NANO         (1<<2)
 
 #define FULL_FLUSH     1
 #define NORMAL_FLUSH   0