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:
@ -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);
|
||||
|
Reference in New Issue
Block a user