rsync-2.6.2: NFS clients confused after an rsync [PATCH included]

Brian Childs brian at rentec.com
Tue May 11 13:20:37 GMT 2004


On Fri, May 07, 2004 at 11:18:46AM -0400, Brian Childs wrote:
> As a response to my original post, here's a patch that implements my
> proposed solution.
> 
> I've tested it, and it fixes the problem, but I'm afraid there may be
> some hidden consequences of doing this.
> 

I've refined my patch to eliminate the extra 'lstat'.  It makes it a
larger patch, but I believe it's correct and more efficient.

I kept the check for IS_SDIR in the set_modtime function because I
didn't want to push that responsibility to the caller of the function.
That's a sure way for this bug to return.

The 'backup dir' code sets the modtime on newly created directories
only.  I've opted to keep that in the code.  A new dir can't be in
anyones dentry cache.

Anyway, here's the new patch.

Thanks,
Brian

diff -x '*~' -x '*.o' -ur rsync-2.6.2/backup.c rsync-2.6.2-rentec/backup.c
--- rsync-2.6.2/backup.c	2004-03-13 15:18:03.000000000 -0500
+++ rsync-2.6.2-rentec/backup.c	2004-05-11 09:03:15.000000000 -0400
@@ -101,7 +101,7 @@
 				    "make_bak_dir stat %s failed: %s\n",
 				    full_fname(rel), strerror(errno));
 			} else {
-				set_modtime(fullpath, st.st_mtime);
+				set_modtime(fullpath, st.st_mtime, st.st_mode);
 				do_lchown(fullpath, st.st_uid, st.st_gid);
 				do_chmod(fullpath, st.st_mode);
 			}
diff -x '*~' -x '*.o' -ur rsync-2.6.2/proto.h rsync-2.6.2-rentec/proto.h
--- rsync-2.6.2/proto.h	2004-04-22 05:58:09.000000000 -0400
+++ rsync-2.6.2-rentec/proto.h	2004-05-11 09:01:28.000000000 -0400
@@ -242,7 +242,7 @@
 void print_child_argv(char **cmd);
 void out_of_memory(char *str);
 void overflow(char *str);
-int set_modtime(char *fname, time_t modtime);
+int set_modtime(char *fname, time_t modtime, mode_t mode);
 int create_directory_path(char *fname, int base_umask);
 int copy_file(char *source, char *dest, mode_t mode);
 int robust_unlink(char *fname);
diff -x '*~' -x '*.o' -ur rsync-2.6.2/rsync.c rsync-2.6.2-rentec/rsync.c
--- rsync-2.6.2/rsync.c	2004-03-23 11:16:15.000000000 -0500
+++ rsync-2.6.2-rentec/rsync.c	2004-05-11 09:03:38.000000000 -0400
@@ -144,7 +144,7 @@
 	    cmp_modtime(st->st_mtime, file->modtime) != 0) {
 		/* don't complain about not setting times on directories
 		 * because some filesystems can't do it */
-		if (set_modtime(fname,file->modtime) != 0 &&
+		if (set_modtime(fname,file->modtime,file->mode) != 0 &&
 		    !S_ISDIR(st->st_mode)) {
 			rprintf(FERROR, "failed to set times on %s: %s\n",
 				full_fname(fname), strerror(errno));
diff -x '*~' -x '*.o' -ur rsync-2.6.2/util.c rsync-2.6.2-rentec/util.c
--- rsync-2.6.2/util.c	2004-04-27 15:59:37.000000000 -0400
+++ rsync-2.6.2-rentec/util.c	2004-05-11 09:00:45.000000000 -0400
@@ -124,12 +124,18 @@
 
 
 
-int set_modtime(char *fname, time_t modtime)
+int set_modtime(char *fname, time_t modtime, mode_t mode)
 {
 	extern int dry_run;
+	extern int make_backups;
+
 	if (dry_run)
 		return 0;
 
+	if(make_backups && S_ISDIR(mode)) {
+		  return 0;
+	}
+
 	if (verbose > 2) {
 		rprintf(FINFO, "set modtime of %s to (%ld) %s",
 			fname, (long) modtime,


More information about the rsync mailing list