Added a comment: more details on coreutils cp treatment of reflink
This commit is contained in:
parent
79643e1e54
commit
9f908c8856
1 changed files with 76 additions and 0 deletions
|
@ -0,0 +1,76 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="yarikoptic"
|
||||||
|
avatar="http://cdn.libravatar.org/avatar/f11e9c84cb18d26a1748c33b48c924b4"
|
||||||
|
subject="more details on coreutils cp treatment of reflink"
|
||||||
|
date="2019-03-06T16:00:35Z"
|
||||||
|
content="""
|
||||||
|
> git-annex looks at the file's stat() and only if the device id is the same
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>They are indeed not the same across subvolumes of the same BTRFS file system</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
$> time cp --reflink=auto home/yoh/reprotraining.ova scrap/tmp
|
||||||
|
cp --reflink=auto home/yoh/reprotraining.ova scrap/tmp 0.00s user 0.00s system 92% cpu 0.004 total
|
||||||
|
|
||||||
|
$> stat home/yoh/reprotraining.ova scrap/tmp/reprotraining.ova
|
||||||
|
File: home/yoh/reprotraining.ova
|
||||||
|
Size: 5081213952 Blocks: 9924248 IO Block: 4096 regular file
|
||||||
|
Device: 2fh/47d Inode: 61771704 Links: 1
|
||||||
|
Access: (0600/-rw-------) Uid: (47521/ yoh) Gid: (47522/ yoh)
|
||||||
|
Access: 2018-06-14 19:23:25.000000000 -0400
|
||||||
|
Modify: 2018-06-11 15:35:57.000000000 -0400
|
||||||
|
Change: 2018-06-14 19:23:25.891351983 -0400
|
||||||
|
Birth: -
|
||||||
|
File: scrap/tmp/reprotraining.ova
|
||||||
|
Size: 5081213952 Blocks: 9924248 IO Block: 4096 regular file
|
||||||
|
Device: 30h/48d Inode: 190040764 Links: 1
|
||||||
|
Access: (0600/-rw-------) Uid: (47521/ yoh) Gid: (47522/ yoh)
|
||||||
|
Access: 2019-03-06 10:38:02.610657786 -0500
|
||||||
|
Modify: 2019-03-06 10:38:02.610657786 -0500
|
||||||
|
Change: 2019-03-06 10:38:02.610657786 -0500
|
||||||
|
Birth: -
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
`cp` seems to just to attempt a cheap clone
|
||||||
|
|
||||||
|
```
|
||||||
|
/* Perform the O(1) btrfs clone operation, if possible.
|
||||||
|
Upon success, return 0. Otherwise, return -1 and set errno. */
|
||||||
|
static inline int
|
||||||
|
clone_file (int dest_fd, int src_fd)
|
||||||
|
{
|
||||||
|
#ifdef FICLONE
|
||||||
|
return ioctl (dest_fd, FICLONE, src_fd);
|
||||||
|
#else
|
||||||
|
(void) dest_fd;
|
||||||
|
(void) src_fd;
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
and if that one fails, assumes that full copy is required:
|
||||||
|
|
||||||
|
```c
|
||||||
|
/* --attributes-only overrides --reflink. */
|
||||||
|
if (data_copy_required && x->reflink_mode)
|
||||||
|
{
|
||||||
|
bool clone_ok = clone_file (dest_desc, source_desc) == 0;
|
||||||
|
if (clone_ok || x->reflink_mode == REFLINK_ALWAYS)
|
||||||
|
{
|
||||||
|
if (!clone_ok)
|
||||||
|
{
|
||||||
|
error (0, errno, _(\"failed to clone %s from %s\"),
|
||||||
|
quoteaf_n (0, dst_name), quoteaf_n (1, src_name));
|
||||||
|
return_val = false;
|
||||||
|
goto close_src_and_dst_desc;
|
||||||
|
}
|
||||||
|
data_copy_required = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
BTW, why `rsync` instead of a regular `cp` for local filesystem if it is across the devices?
|
||||||
|
"""]]
|
Loading…
Add table
Add a link
Reference in a new issue