mv: fail when moving a file to a hardlink
commit222d7ac0c4f5f005438c534f3aba62fd94d96dc2
authorBoris Ranto <branto@redhat.com>
Tue, 18 Nov 2014 19:20:50 +0000 (18 20:20 +0100)
committerPádraig Brady <P@draigBrady.com>
Fri, 21 Nov 2014 02:48:45 +0000 (21 02:48 +0000)
tree55263d170dd91118391d3fddd0598311f33d43d7
parentf43c072a04ba881debf35ccdb509ee0a145b255c
mv: fail when moving a file to a hardlink

We may run into a race condition if we treat hard links to the same file
as distinct files.  If we do 'mv a b' and 'mv b a' in parallel, both a
and b can disappear from the file system.  The reason is that in this
case the unlink on src is called and the system calls can end up being
run in the order where unlink(a) and unlink(b) are the last two system
calls.  Therefore exit with an error code so that we avoid the potential
data loss.

* src/copy.c (same_file_ok): Don't set unlink_src that was used by mv,
and return false for two hardlinks to a file in move_mode.
*src/copy.c (copy_internal): No longer honor the unlink_src option,
used only by mv.
NEWS: Mention the change in behavior.
* tests/cp/same-file.sh: Augment to cover the `cp -a hlsl1 sl1` case.
* tests/mv/hard-verbose.sh: Remove no longer needed test.
* tests/local.mk: Remove the reference to hard-verbose.sh.
* tests/mv/hard-4.sh: Adjust so we fail in this case.
* tests/mv/i-4.sh: Likewise.
* tests/mv/symlink-onto-hardlink-to-self.sh: Likewise.
NEWS
src/copy.c
tests/cp/same-file.sh
tests/local.mk
tests/mv/force.sh [moved from tests/mv/hard-verbose.sh with 51% similarity]
tests/mv/hard-4.sh
tests/mv/i-4.sh
tests/mv/symlink-onto-hardlink-to-self.sh