virStorageVolDefPtr inputvol,
int fd,
unsigned long long *total,
- bool want_sparse)
+ bool want_sparse,
+ bool reflink_copy)
{
int inputfd = -1;
int amtread = -1;
goto cleanup;
}
+ if (reflink_copy) {
+ if (btrfsCloneFile(fd, inputfd) < 0) {
+ ret = -errno;
+ virReportSystemError(errno,
+ _("failed to clone files from '%s'"),
+ inputvol->target.path);
+ goto cleanup;
+ } else {
+ VIR_DEBUG("btrfs clone finished.");
+ goto cleanup;
+ }
+ }
+
while (amtread != 0) {
int amtleft;
struct stat st;
gid_t gid;
uid_t uid;
+ bool reflink_copy = false;
- virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, -1);
+ virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA |
+ VIR_STORAGE_VOL_CREATE_REFLINK,
+ -1);
if (flags & VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
goto cleanup;
}
+ if (flags & VIR_STORAGE_VOL_CREATE_REFLINK)
+ reflink_copy = true;
+
if ((fd = open(vol->target.path, O_RDWR)) < 0) {
virReportSystemError(errno,
_("cannot create path '%s'"),
if (inputvol) {
int res = virStorageBackendCopyToFD(vol, inputvol,
- fd, &remain, false);
+ fd, &remain, false, reflink_copy);
if (res < 0)
goto cleanup;
}
static int
createRawFile(int fd, virStorageVolDefPtr vol,
- virStorageVolDefPtr inputvol)
+ virStorageVolDefPtr inputvol,
+ bool reflink_copy)
{
bool need_alloc = true;
int ret = 0;
bool want_sparse = !need_alloc ||
(vol->target.allocation < inputvol->target.capacity);
- ret = virStorageBackendCopyToFD(vol, inputvol, fd, &remain, want_sparse);
+ ret = virStorageBackendCopyToFD(vol, inputvol, fd, &remain,
+ want_sparse, reflink_copy);
if (ret < 0)
goto cleanup;
}
int ret = -1;
int fd = -1;
int operation_flags;
+ bool reflink_copy = false;
- virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, -1);
+ virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA |
+ VIR_STORAGE_VOL_CREATE_REFLINK,
+ -1);
if (flags & VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
goto cleanup;
}
+ if (flags & VIR_STORAGE_VOL_CREATE_REFLINK)
+ reflink_copy = true;
+
+
if (vol->target.encryption != NULL) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("storage pool does not support encrypted volumes"));
#endif
}
- if ((ret = createRawFile(fd, vol, inputvol)) < 0)
+ if ((ret = createRawFile(fd, vol, inputvol, reflink_copy)) < 0)
/* createRawFile already reported the exact error. */
ret = -1;
virStorageVolDefPtr vol,
unsigned int flags)
{
- virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, -1);
+ virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA |
+ VIR_STORAGE_VOL_CREATE_REFLINK,
+ -1);
return _virStorageBackendFileSystemVolBuild(conn, pool, vol, NULL, flags);
}
virStorageVolDefPtr inputvol,
unsigned int flags)
{
- virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA, -1);
+ virCheckFlags(VIR_STORAGE_VOL_CREATE_PREALLOC_METADATA |
+ VIR_STORAGE_VOL_CREATE_REFLINK,
+ -1);
return _virStorageBackendFileSystemVolBuild(conn, pool, vol, inputvol, flags);
}