diff options
author | Wayne Davison <wayned@samba.org> | 2011-03-26 09:15:26 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2011-03-26 10:01:37 -0700 |
commit | a7271fb30f37490618fb03ff83461fd24acab20a (patch) | |
tree | 5d0127e72ca7e0c1b23e19e71e6404d99b00d1d2 | |
parent | 277036153a966b6e312693f502ab867f67074929 (diff) | |
download | rsync-a7271fb30f37490618fb03ff83461fd24acab20a.tar.gz |
Avoid re-setting xattrs on a hard-linked file w/the same xattrs.
Improved the xattrs testing to include hard-linking.
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile.in | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | receiver.c | 5 | ||||
-rw-r--r-- | testsuite/hardlinks.test | 2 | ||||
-rw-r--r-- | testsuite/xattrs.test | 44 |
6 files changed, 49 insertions, 10 deletions
@@ -38,4 +38,5 @@ config.status /support/savetransfer /testsuite/chown-fake.test /testsuite/devices-fake.test +/testsuite/xattrs-hlink.test /patches diff --git a/Makefile.in b/Makefile.in index 38986da7..6f753acf 100644 --- a/Makefile.in +++ b/Makefile.in @@ -48,7 +48,7 @@ TLS_OBJ = tls.o syscall.o lib/compat.o lib/snprintf.o lib/permstring.o lib/sysxa CHECK_PROGS = rsync$(EXEEXT) tls$(EXEEXT) getgroups$(EXEEXT) getfsdev$(EXEEXT) \ trimslash$(EXEEXT) t_unsafe$(EXEEXT) wildtest$(EXEEXT) -CHECK_SYMLINKS = testsuite/chown-fake.test testsuite/devices-fake.test +CHECK_SYMLINKS = testsuite/chown-fake.test testsuite/devices-fake.test testsuite/xattrs-hlink.test # Objects for CHECK_PROGS to clean CHECK_OBJS=tls.o getgroups.o getfsdev.o t_stub.o t_unsafe.o trimslash.o wildtest.o @@ -249,6 +249,9 @@ testsuite/chown-fake.test: testsuite/devices-fake.test: ln -s devices.test $(srcdir)/testsuite/devices-fake.test +testsuite/xattrs-hlink.test: + ln -s xattrs.test $(srcdir)/testsuite/xattrs-hlink.test + # This does *not* depend on building or installing: you can use it to # check a version installed from a binary or some other source tree, # if you want. @@ -83,6 +83,8 @@ Changes since 3.0.7: - Fixed a bug setting xattrs on new files that aren't user writable. + - Avoid re-setting xattrs on a hard-linked file w/the same xattrs. + - Fixed a bug with --fake-super when copying files and dirs that aren't user writable. @@ -503,14 +503,15 @@ int recv_files(int f_in, char *local_name) rprintf(FINFO, "recv_files(%s)\n", fname); #ifdef SUPPORT_XATTRS - if (iflags & ITEM_REPORT_XATTR && do_xfers) + if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers) recv_xattr_request(file, f_in); #endif if (!(iflags & ITEM_TRANSFER)) { maybe_log_item(file, iflags, itemizing, xname); #ifdef SUPPORT_XATTRS - if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers) + if (preserve_xattrs && iflags & ITEM_REPORT_XATTR && do_xfers + && !BITS_SET(iflags, ITEM_XNAME_FOLLOWS|ITEM_LOCAL_CHANGE)) set_file_attrs(fname, file, NULL, fname, 0); #endif continue; diff --git a/testsuite/hardlinks.test b/testsuite/hardlinks.test index 1737b352..a0db2d03 100644 --- a/testsuite/hardlinks.test +++ b/testsuite/hardlinks.test @@ -28,7 +28,7 @@ name2="$fromdir/name2" name3="$fromdir/name3" name4="$fromdir/name4" echo "This is the file" > "$name1" -ln "$name1" "$name2" || fail "Can't create hardlink" +ln "$name1" "$name2" || test_skipped "Can't create hardlink" ln "$name2" "$name3" || fail "Can't create hardlink" cp "$name2" "$name4" || fail "Can't copy file" cat $srcdir/*.c >"$fromdir/text" diff --git a/testsuite/xattrs.test b/testsuite/xattrs.test index 97056b7f..50e262be 100644 --- a/testsuite/xattrs.test +++ b/testsuite/xattrs.test @@ -6,6 +6,7 @@ # Test that rsync handles basic xattr preservation. . $srcdir/testsuite/rsync.fns +lnkdir="$tmpdir/lnk" $RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync is configured without xattr support" @@ -38,7 +39,7 @@ case "`xattr 2>&1`" in ;; esac -makepath "$fromdir/foo/bar" +makepath "$lnkdir" "$fromdir/foo/bar" echo now >"$fromdir/file0" echo something >"$fromdir/file1" echo else >"$fromdir/file2" @@ -73,32 +74,60 @@ xset user.dir1 'need to test directory xattrs too' foo xset user.dir2 'another xattr' foo xset user.dir3 'this is one last one for the moment' foo +xset user.dir4 'another dir test' foo/bar +xset user.dir5 'one last one' foo/bar + xset user.foo 'new foo' foo/file3 foo/bar/file5 xset user.bar 'new bar' foo/file3 foo/bar/file5 xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3 foo/bar/file5 xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' foo/file3 foo/bar/file5 +xset user.dir0 'old extra value' "$chkdir/foo" +xset user.dir1 'old dir value' "$chkdir/foo" + xset user.short 'old short' "$chkdir/file1" xset user.extra 'remove me' "$chkdir/file1" xset user.foo 'old foo' "$chkdir/foo/file3" xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3" +case $0 in +*hlink*) + ln foo/bar/file5 foo/bar/file6 || test_skipped "Can't create hardlink" + files="$files foo/bar/file6" + dashH='-H' + altDest='--link-dest' + ;; +*) + dashH='' + altDest='--copy-dest' + ;; +esac + xls $dirs $files >"$scratchdir/xattrs.txt" # OK, let's try a simple xattr copy. -checkit "$RSYNC -avX --super . '$chkdir/'" "$fromdir" "$chkdir" +checkit "$RSYNC -avX $dashH --super . '$chkdir/'" "$fromdir" "$chkdir" cd "$chkdir" xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" - cd "$fromdir" -checkit "$RSYNC -aiX --super --copy-dest=../chk . ../to" "$fromdir" "$todir" +if [ "$dashH" ]; then + for fn in $files; do + name=`basename $fn` + ln $fn ../lnk/$name + done +fi + +checkit "$RSYNC -aiX $dashH --super $altDest=../chk . ../to" "$fromdir" "$todir" cd "$todir" xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" - +[ "$dashH" ] && rm -rf "$lnkdir" + cd "$fromdir" rm -rf "$todir" @@ -106,7 +135,7 @@ xset user.nice 'this is nice, but different' file1 xls $dirs $files >"$scratchdir/xattrs.txt" -checkit "$RSYNC -aiX --fake-super --link-dest=../chk . ../to" "$chkdir" "$todir" +checkit "$RSYNC -aiX $dashH --fake-super --link-dest=../chk . ../to" "$chkdir" "$todir" cd "$todir" xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" - @@ -136,7 +165,7 @@ cd "$fromdir" rm -rf "$todir" # When run by a non-root tester, this checks if no-user-perm files/dirs can be copied. -checkit "$RSYNC -aiX --fake-super --chmod=a= . ../to" "$chkdir" "$todir" # 2>"$scratchdir/errors.txt" +checkit "$RSYNC -aiX $dashH --fake-super --chmod=a= . ../to" "$chkdir" "$todir" # 2>"$scratchdir/errors.txt" cd "$todir" xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" - @@ -148,10 +177,13 @@ $RSYNC -aX file1 file2 $RSYNC -aX file1 file2 ../chk/ $RSYNC -aX --del ../chk/ . $RSYNC -aX file1 ../lnk/ +[ "$dashH" ] && ln "$chkdir/file1" ../lnk/extra-link xls file1 file2 >"$scratchdir/xattrs.txt" -checkit "$RSYNC -aiiX --copy-dest=../lnk . ../to" "$chkdir" "$todir" +checkit "$RSYNC -aiiX $dashH $altDest=../lnk . ../to" "$chkdir" "$todir" + +[ "$dashH" ] && rm ../lnk/extra-link cd "$todir" xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" - |