bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bug#532814: coreutils: cp -aL creates hardlinks where none were pres


From: Jim Meyering
Subject: Re: Bug#532814: coreutils: cp -aL creates hardlinks where none were present before
Date: Mon, 15 Jun 2009 18:48:53 +0200

[resending to bug-coreutils, not just to the debian bug tracker]

Jim Meyering wrote:
> brian m. carlson wrote:
>> Package: coreutils
>> Version: 7.4-2
>
> Thanks for taking the time to report that.
>
>> If I create a directory structure such as the following:
>>
>>   a:
>>   total 2
>>   drwxr-xr-x 2 bmc bmc 1024 2009-06-11 21:06 dir
>>   lrwxrwxrwx 1 bmc bmc    4 2009-06-11 21:06 link -> ../b
>>
>>   a/dir:
>>   total 0
>>   lrwxrwxrwx 1 bmc bmc 7 2009-06-11 21:06 link -> ../../b
>>
>>   b:
>>   total 2
>>   -rw-r--r-- 1 bmc bmc 5 2009-06-11 21:06 file
>>
>> and then run "cp -aL a/* c", then the copies of file (in c) become hard
>> links to each other.  This behavior is not documented, and it does not
>> occur if I use -LR instead of -aL.  It appears to be triggered by
>> --preserve=links.
>
> That is correct, and deliberate.
> With --preserve=links, when cp detects two source files with the
> same inode, it must arrange for the corresponding names to be hard
> linked in the destination tree.  That is what "preserve=links" means.
>
> The trick is to realize that when you invoke cp with -L,
> that tells cp to use stat (which never sees a symlink) rather
> than lstat to determine inode numbers.  So those two symlinks
> to the same file appear (to cp -L) as hard links, and it preserves
> that attribute because you used -a, which includes --preserve=links.
>
>> My opinion is that this behavior is incorrect[0], but I don't care very
>> much one way or the other.  If this behavior is intentional, it should
>> be clearly documented in the manual page, at the very least.  Either
>> changing the behavior or documenting the behavior[1] is satisfactory for
>> me.
>
> I reproduced with this:
>
>     $ mkdir c; touch f; ln -s f a; ln -s f b; cp -aL a b c; ls -i1 c
>     74161745 a
>     74161745 b
>
>> [0] That is, --preserve=links should preserve symlinks as symlinks and
>> hard links as hard links.  Just because -L forces all symlinks to be
>> dereferenced does not mean that I want to "preserve" symlinks as hard
>> links.
>
> --preserve=links preserves *hard* links.
> By definition (POSIX), cp -L can never produce a symlink.
>
>> [1] This information should be present in the manual page, not just in
>> the info page (which I almost never read).
>
> Sorry, but this corner is obscure enough that any explanation
> belongs in the info documentation.
> In fact, there are already comments in the texinfo sources
> saying that this deserves explanation.
>
> I wrote a few words on -L and added to the --preserve=links description:
>
>     `links'
>           Preserve in the destination files any links between
>           corresponding source files.  Note that with `-L' or `-H',
>           this option can convert symbolic links to hard links.  For
>           example,
>                $ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
>                74161745 a
>                74161745 b
>           Note the inputs: `b' is a symlink to regular file `a', yet
>           the files in destination directory, `c/', are hard-linked.
>           Since `-a' implies `--preserve=links', and since `-H' tells
>           `cp' to dereference command line arguments, it sees two files
>           with the same inode number, and preserves the perceived hard
>           link.
>
>           Here is a similar example that exercises `cp''s `-L' option:
>                $ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b
>                74163295 a
>                74163295 b
>
> Here's the patch:
>
> From 7d350170ae78e1aca68aff81a08116109dd33be5 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Mon, 15 Jun 2009 09:10:50 +0200
> Subject: [PATCH] doc: cp: describe an oddity of combining -H/-L and 
> --preserve=links
>
> * doc/coreutils.texi (cp invocation) [-L]: Elaborate.
> [--preserve=links]: Remove comments saying that we need documentation
> for just this situation.  Provide more explanation and examples.
> Reported by Brian M. Carlson in http://bugs.debian.org/525048.
> ---
>  doc/coreutils.texi |   26 ++++++++++++++++++++++++--
>  1 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/doc/coreutils.texi b/doc/coreutils.texi
> index 155858b..1806295 100644
> --- a/doc/coreutils.texi
> +++ b/doc/coreutils.texi
> @@ -7388,6 +7388,9 @@ cp invocation
>  @opindex -L
>  @opindex --dereference
>  Follow symbolic links when copying from them.
> +With this option, @command{cp} cannot create a symbolic link.
> +For example, a symlink (to regular file) in the source tree will be copied to
> +a regular file in the destination tree.
>
>  @item -n
>  @itemx --no-clobber
> @@ -7435,8 +7438,27 @@ cp invocation
>  @itemx links
>  Preserve in the destination files
>  any links between corresponding source files.
> address@hidden Give examples illustrating how hard links are preserved.
> address@hidden Also, show how soft links map to hard links with -L and -H.
> +Note that with @option{-L} or @option{-H}, this option can convert
> +symbolic links to hard links.  For example,
> address@hidden
> +$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c
> +74161745 a
> +74161745 b
> address@hidden example
> address@hidden
> +Note the inputs: @file{b} is a symlink to regular file @file{a},
> +yet the files in destination directory, @file{c/}, are hard-linked.
> +Since @option{-a} implies @option{--preserve=links}, and since @option{-H}
> +tells @command{cp} to dereference command line arguments, it sees two files
> +with the same inode number, and preserves the perceived hard link.
> +
> +Here is a similar example that exercises @command{cp}'s @option{-L} option:
> address@hidden
> +$ mkdir b c; (cd b; : > a; ln -s a b); cp -aL b c; ls -i1 c/b
> +74163295 a
> +74163295 b
> address@hidden smallexample
> +
>  @itemx context
>  Preserve SELinux security context of the file. @command{cp} will fail
>  if the preserving of SELinux security context is not succesful.
> --
> 1.6.3.2.406.gd6a466




reply via email to

[Prev in Thread] Current Thread [Next in Thread]