Thanks for your review.

> On 05/03/2011 03:47 PM, jeff.liu wrote:
>> Hello All,
>> 
>> I'd like to introduce the ocfs2 reflink support to cp(1) when it was called 
>> with
>> "--reflink=[WHEN]".
>> With this patch, `cp' will try OCFS2 reflink first, if it fails with EEXIST, 
>> IMHO, it definitely
>> means the user is intended to perform reflink on OCFS2, but the destination 
>> file is already exists,
>> so set the retval = false and return, or try Btrfs clone again.
>> 
>> I have done some tests, includes reflink on OCFS2, reflink to an existing 
>> file, reflink files
>> cross-filesystems, and reflink attributes only, all works fine.
>> 
>> For the test automation, the existing reflink test are presume the tests 
>> running on either file
>> systems with Cow support IMO, maybe we can improve them with real 
>> filesystems on loop device?
>> 
>> Also, the old bug ticket for this topic will be closed at:
>> http://lists.gnu.org/archive/html/bug-coreutils/2010-04/msg00185.html
> 
> Thanks for doing this.
> 
> It's a pity we've to try different file system specific CoW methods.
> Is there any news on the reflink system call?
> https://lkml.org/lkml/2009/9/14/532

Looks there is no update recently;

Hi Joel and Sunil,
Would you please add some comments in this point.

> 
> I notice that xattrs are copied with REFLINK_ATTR_NONE.


> xattrs will not copied if call ioctl(2) with REFLINK_ATTR_NONE,
> reflink xattrs only if
> REFLINK_ATTR_PRESERVE is specified, which were shown as following:
> 
> Firstly, invoking cp(1) without "-p" option:
> jeff@jeff-laptop:~/opensource/coreutils$ setfacl -m user:jeff:rwx /ocfs2/test
> jeff@jeff-laptop:~/opensource/coreutils$ ./src/cp --reflink=always
> /ocfs2/test /ocfs2/test.reflink
> 
> jeff@jeff-laptop:~/opensource/coreutils$ ls -l /ocfs2/test.reflink
> -rw-r-xr-- 1 jeff jeff 0 2011-08-21 21:16 /ocfs2/test.reflink
> 
> jeff@jeff-laptop:~/opensource/coreutils$ getfacl /ocfs2/test.reflink
> getfacl: Removing leading '/' from absolute path names
> # file: ocfs2/test.reflink
> # owner: jeff
> # group: jeff
> user::rw-
> group::r-x
> other::r--
> 
> Next, try to copy xattrs too by specifying "-p":
> --------------------------------------------------------------
> jeff@jeff-laptop:~/opensource/coreutils$ ./src/cp --reflink=always -p
> /ocfs2/test /ocfs2/test.reflink_with_xattr
> 
> jeff@jeff-laptop:~/opensource/coreutils$ getfacl 
> /ocfs2/test.reflink_with_xattr
> getfacl: Removing leading '/' from absolute path names
> # file: ocfs2/test.reflink_with_xattr
> # owner: jeff
> # group: jeff
> user::rw-
> user:jeff:rwx
> group::r--
> mask::rwx
> other::r--
> 
>  Is that also the case for BTRFS clone?
Btrfs will not try to clone the xattrs by default too.

> In any case that's a change I'm not sure is desired, or worth noting at least.
> 
> I don't understand this bit...
> 
>> +      if (reflink_ok)
>> +        {
>             ...
>> +        }
>> +      else
>> +        {
>> +          /* When the destination file is aready exists on OCFS2, the
>> +             above reflink should fails with EEXIST.  If that happens,
>> +             we need not try btrfs clone again since it means the user
>> +             is definitely want a OCFS2 reflink.  */
>> +          if (errno == EEXIST)
> 
> Should this not be errno != ENOTSUP

Thanks for pointing this out! I should checking errno != ENOTSUP here, then 
break if "--sparse=always" was
specified, otherwise, let copy process go ahead.

> Or why not try to unlink() (dependent on -f, -n etc.).
> At least shouldn't we be falling back to a regular copy when --reflink=auto
The current patch will fall back to a normal copy if reflink falled in both 
cases(ocfs2, btrfs), if cp(1) was
invoked with "--reflink=auto". :-P.

Thanks,
-Jeff
> 
>> +            {
>> +              error (0, errno, _("failed to reflink ..."));
>> +              return_val = false;
>> +              goto close_src_desc;
>> +            }
> 
> cheers,
> Pádraig.

Reply via email to