Re: [libvirt] [PATCH v3 30/31] virsh: Implement sparse stream to vol-download

2017-05-17 Thread John Ferlan


On 05/16/2017 10:04 AM, Michal Privoznik wrote:
> The command grew new --sparse switch that does nothing more than

s/The command grew new/Add a new/

> enables the sparse streams feature for this command. Among with
> the switch new helper function is introduced: virshStreamSkip().
> This is the callback that is called whenever daemon sends us a
> hole. In the callback we reflect the hole in underlying file by
> seeking as many bytes as told.
> 
> Signed-off-by: Michal Privoznik 
> ---
>  tools/virsh-util.c   | 18 ++
>  tools/virsh-util.h   |  5 +
>  tools/virsh-volume.c | 12 ++--
>  tools/virsh.pod  |  3 ++-
>  4 files changed, 35 insertions(+), 3 deletions(-)
> 

Reviewed-by: John Ferlan 

John

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v3 30/31] virsh: Implement sparse stream to vol-download

2017-05-16 Thread Michal Privoznik
The command grew new --sparse switch that does nothing more than
enables the sparse streams feature for this command. Among with
the switch new helper function is introduced: virshStreamSkip().
This is the callback that is called whenever daemon sends us a
hole. In the callback we reflect the hole in underlying file by
seeking as many bytes as told.

Signed-off-by: Michal Privoznik 
---
 tools/virsh-util.c   | 18 ++
 tools/virsh-util.h   |  5 +
 tools/virsh-volume.c | 12 ++--
 tools/virsh.pod  |  3 ++-
 4 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/tools/virsh-util.c b/tools/virsh-util.c
index 4b86e29cb..198625bdb 100644
--- a/tools/virsh-util.c
+++ b/tools/virsh-util.c
@@ -153,6 +153,24 @@ virshStreamSink(virStreamPtr st ATTRIBUTE_UNUSED,
 }
 
 
+int
+virshStreamSkip(virStreamPtr st ATTRIBUTE_UNUSED,
+long long offset,
+void *opaque)
+{
+int *fd = opaque;
+off_t cur;
+
+if ((cur = lseek(*fd, offset, SEEK_CUR)) == (off_t) -1)
+return -1;
+
+if (ftruncate(*fd, cur) < 0)
+return -1;
+
+return 0;
+}
+
+
 void
 virshDomainFree(virDomainPtr dom)
 {
diff --git a/tools/virsh-util.h b/tools/virsh-util.h
index 64cef23c0..0aba247f6 100644
--- a/tools/virsh-util.h
+++ b/tools/virsh-util.h
@@ -57,6 +57,11 @@ virshStreamSink(virStreamPtr st,
 size_t nbytes,
 void *opaque);
 
+int
+virshStreamSkip(virStreamPtr st,
+long long offset,
+void *opaque);
+
 int
 virshDomainGetXMLFromDom(vshControl *ctl,
  virDomainPtr dom,
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 66fe70ea7..3d19b745e 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -763,6 +763,10 @@ static const vshCmdOptDef opts_vol_download[] = {
  .type = VSH_OT_INT,
  .help = N_("amount of data to download")
 },
+{.name = "sparse",
+ .type = VSH_OT_BOOL,
+ .help = N_("preserve sparseness of volume")
+},
 {.name = NULL}
 };
 
@@ -778,6 +782,7 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
 unsigned long long offset = 0, length = 0;
 bool created = false;
 virshControlPtr priv = ctl->privData;
+unsigned int flags = 0;
 
 if (vshCommandOptULongLong(ctl, cmd, "offset", &offset) < 0)
 return false;
@@ -791,6 +796,9 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
 if (vshCommandOptStringReq(ctl, cmd, "file", &file) < 0)
 goto cleanup;
 
+if (vshCommandOptBool(cmd, "sparse"))
+flags |= VIR_STORAGE_VOL_DOWNLOAD_SPARSE_STREAM;
+
 if ((fd = open(file, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0) {
 if (errno != EEXIST ||
 (fd = open(file, O_WRONLY|O_TRUNC, 0666)) < 0) {
@@ -806,12 +814,12 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd)
 goto cleanup;
 }
 
-if (virStorageVolDownload(vol, st, offset, length, 0) < 0) {
+if (virStorageVolDownload(vol, st, offset, length, flags) < 0) {
 vshError(ctl, _("cannot download from volume %s"), name);
 goto cleanup;
 }
 
-if (virStreamRecvAll(st, virshStreamSink, &fd) < 0) {
+if (virStreamSparseRecvAll(st, virshStreamSink, virshStreamSkip, &fd) < 0) 
{
 vshError(ctl, _("cannot receive data from volume %s"), name);
 goto cleanup;
 }
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 727acf6e6..dcaa0c170 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -3942,12 +3942,13 @@ regarding possible target volume and pool changes as a 
result of the
 pool refresh when the upload is attempted.
 
 =item B [I<--pool> I] [I<--offset> I]
-[I<--length> I] I I
+[I<--length> I] [I<--sparse>] I I
 
 Download the contents of a storage volume to I.
 I<--pool> I is the name or UUID of the storage pool the volume
 is in.
 I is the name or key or path of the volume to 
download.
+If I<--sparse> is specified, this command will preserve volume sparseness.
 I<--offset> is the position in the storage volume at which to start reading
 the data. The value must be 0 or larger. I<--length> is an upper bound of
 the amount of data to be downloaded. A negative value is interpreted as
-- 
2.13.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list