[libvirt] [PATCH v3 29/31] Introduce virStorageVol{Download, Upload}Flags
John Ferlan
jferlan at redhat.com
Wed May 17 17:06:28 UTC 2017
On 05/17/2017 12:30 PM, Michal Privoznik wrote:
> On 05/17/2017 05:42 PM, John Ferlan wrote:
>>
>>
>> On 05/16/2017 10:04 AM, Michal Privoznik wrote:
>>> These flags to APIs will tell if caller wants to use sparse
>>> stream for storage transfer. At the same time, it's safe to
>>> enable them in storage driver frontend and rely on our backends
>>> checking the flags. This way we can enable specific flags only on
>>> some specific backends, e.g. enable
>>> VIR_STORAGE_VOL_DOWNLOAD_SPARSE_STREAM for filesystem backend but
>>> not iSCSI backend.
>>>
>>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>>> ---
>>> include/libvirt/libvirt-storage.h | 9 +++++++++
>>> src/libvirt-storage.c | 4 ++--
>>> src/remote/remote_protocol.x | 2 ++
>>> src/storage/storage_driver.c | 4 ++--
>>> src/storage/storage_util.c | 10 ++++++----
>>> 5 files changed, 21 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/include/libvirt/libvirt-storage.h b/include/libvirt/libvirt-storage.h
>>> index 45ec72065..4517f713c 100644
>>> --- a/include/libvirt/libvirt-storage.h
>>> +++ b/include/libvirt/libvirt-storage.h
>>> @@ -346,11 +346,20 @@ virStorageVolPtr virStorageVolCreateXMLFrom (virStoragePoolPtr pool,
>>> const char *xmldesc,
>>> virStorageVolPtr clonevol,
>>> unsigned int flags);
>>> +
>>> +typedef enum {
>>> + VIR_STORAGE_VOL_DOWNLOAD_SPARSE_STREAM = 1 << 0, /* Use sparse stream */
>>> +} virStorageVolDownloadFlags;
>>> +
>>> int virStorageVolDownload (virStorageVolPtr vol,
>>> virStreamPtr stream,
>>> unsigned long long offset,
>>> unsigned long long length,
>>> unsigned int flags);
>>> +typedef enum {
>>> + VIR_STORAGE_VOL_UPLOAD_SPARSE_STREAM = 1 << 0, /* Use sparse stream */
>>> +} virStorageVolUploadFlags;
>>> +
>>
>> /me wonders should the backend specific concerns be described in
>> comments prior to each enum or is that too specific. Maybe it's more of
>> a 'specific backends' that perform "file based manipulation" (rather
>> than block based)... I dunno. I'll leave it to you though - the more
>> documentation now while it's fresh in your mind the better.
>>
>>
>>> int virStorageVolUpload (virStorageVolPtr vol,
>>> virStreamPtr stream,
>>> unsigned long long offset,
>>> diff --git a/src/libvirt-storage.c b/src/libvirt-storage.c
>>> index 05eec8a9d..64202998b 100644
>>> --- a/src/libvirt-storage.c
>>> +++ b/src/libvirt-storage.c
>>> @@ -1549,7 +1549,7 @@ virStorageVolCreateXMLFrom(virStoragePoolPtr pool,
>>> * @stream: stream to use as output
>>> * @offset: position in @vol to start reading from
>>> * @length: limit on amount of data to download
>>> - * @flags: extra flags; not used yet, so callers should always pass 0
>>> + * @flags: bitwise-OR of virStorageVolDownloadFlags
>>> *
>>> * Download the content of the volume as a stream. If @length
>>> * is zero, then the remaining contents of the volume after
>>> @@ -1613,7 +1613,7 @@ virStorageVolDownload(virStorageVolPtr vol,
>>> * @stream: stream to use as input
>>> * @offset: position to start writing to
>>> * @length: limit on amount of data to upload
>>> - * @flags: extra flags; not used yet, so callers should always pass 0
>>> + * @flags: bitwise-OR of virStorageVolUploadFlags
>>> *
>>> * Upload new content to the volume from a stream. This call
>>> * will fail if @offset + @length exceeds the size of the
>>
>> I suppose for each you c(sh)ould have documented what the specific FLAG
>> does and the expectations therein..
>
> How about this?
>
Fine -
Reviewed-by: John Ferlan <jferlan at redhat.com>
John
> iff --git i/src/libvirt-storage.c w/src/libvirt-storage.c
> index 64202998b..35f9926d5 100644
> --- i/src/libvirt-storage.c
> +++ w/src/libvirt-storage.c
> @@ -1555,6 +1555,13 @@ virStorageVolCreateXMLFrom(virStoragePoolPtr pool,
> * is zero, then the remaining contents of the volume after
> * @offset will be downloaded.
> *
> + * If VIR_STORAGE_VOL_DOWNLOAD_SPARSE_STREAM is set in @flags
> + * effective transmission of holes is enabled. This assumes using
> + * the @stream with combination of virStreamSparseRecvAll() or
> + * virStreamRecvFlags(stream, ..., flags =
> + * VIR_STREAM_RECV_STOP_AT_HOLE) for honouring holes sent by
> + * server.
> + *
> * This call sets up an asynchronous stream; subsequent use of
> * stream APIs is necessary to transfer the actual data,
> * determine how much data is successfully transferred, and
> @@ -1621,6 +1628,11 @@ virStorageVolDownload(virStorageVolPtr vol,
> * will be raised if an attempt is made to upload greater
> * than @length bytes of data.
> *
> + * If VIR_STORAGE_VOL_UPLOAD_SPARSE_STREAM is set in @flags
> + * effective transmission of holes is enabled. This assumes using
> + * the @stream with combination of virStreamSparseSendAll() or
> + * virStreamSendHole() to preserve source file sparseness.
> + *
> * This call sets up an asynchronous stream; subsequent use of
> * stream APIs is necessary to transfer the actual data,
> * determine how much data is successfully transferred, and
>
> Michal
>
More information about the libvir-list
mailing list