cp: optional --reflink support

function                                             old     new   delta
cp_main                                              428     512     +84
copy_file                                           1676    1742     +66

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2018-07-13 20:30:02 +02:00
parent 253f555f01
commit 79fb6ac7a5
3 changed files with 46 additions and 0 deletions

View File

@ -339,9 +339,28 @@ int FAST_FUNC copy_file(const char *source, const char *dest, int flags)
freecon(con);
}
}
#endif
#if ENABLE_FEATURE_CP_REFLINK
# undef BTRFS_IOCTL_MAGIC
# define BTRFS_IOCTL_MAGIC 0x94
# undef BTRFS_IOC_CLONE
# define BTRFS_IOC_CLONE _IOW (BTRFS_IOCTL_MAGIC, 9, int)
if (flags & FILEUTILS_REFLINK) {
retval = ioctl(dst_fd, BTRFS_IOC_CLONE, src_fd);
if (retval == 0)
goto do_close;
/* reflink did not work */
if (flags & FILEUTILS_REFLINK_ALWAYS) {
bb_perror_msg("failed to clone '%s' from '%s'", dest, source);
goto do_close;
}
/* fall through to standard copy */
retval = 0;
}
#endif
if (bb_copyfd_eof(src_fd, dst_fd) == -1)
retval = -1;
IF_FEATURE_CP_REFLINK(do_close:)
/* Careful with writing... */
if (close(dst_fd) < 0) {
bb_perror_msg("error writing to '%s'", dest);