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