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.
|