summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2011-03-26 09:15:26 -0700
committerWayne Davison <wayned@samba.org>2011-03-26 10:01:37 -0700
commita7271fb30f37490618fb03ff83461fd24acab20a (patch)
tree5d0127e72ca7e0c1b23e19e71e6404d99b00d1d2
parent277036153a966b6e312693f502ab867f67074929 (diff)
downloadrsync-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--.gitignore1
-rw-r--r--Makefile.in5
-rw-r--r--NEWS2
-rw-r--r--receiver.c5
-rw-r--r--testsuite/hardlinks.test2
-rw-r--r--testsuite/xattrs.test44
6 files changed, 49 insertions, 10 deletions
diff --git a/.gitignore b/.gitignore
index 76693bb4..1fea441f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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.
diff --git a/NEWS b/NEWS
index 625c27bb..18226145 100644
--- a/NEWS
+++ b/NEWS
@@ -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.
diff --git a/receiver.c b/receiver.c
index fc7ab575..d90fa25f 100644
--- a/receiver.c
+++ b/receiver.c
@@ -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" -