[libvirt] [PATCH v3 02/31] util: Introduce virFileInData

Michal Privoznik mprivozn at redhat.com
Wed May 17 12:41:20 UTC 2017


On 05/16/2017 10:55 PM, John Ferlan wrote:
> 
> 
> On 05/16/2017 10:03 AM, Michal Privoznik wrote:
>> This function takes a FD and determines whether the current
>> position is in data section or in a hole. In addition to that,
>> it also determines how much bytes are there remaining till the
>> current section ends.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  src/libvirt_private.syms |   1 +
>>  src/util/virfile.c       |  82 +++++++++++++++++++
>>  src/util/virfile.h       |   4 +
>>  tests/virfiletest.c      | 203 +++++++++++++++++++++++++++++++++++++++++++++++
>>  4 files changed, 290 insertions(+)
>>
>> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>> index bbe283529..4102a002b 100644
>> --- a/src/libvirt_private.syms
>> +++ b/src/libvirt_private.syms
>> @@ -1628,6 +1628,7 @@ virFileGetHugepageSize;
>>  virFileGetMountReverseSubtree;
>>  virFileGetMountSubtree;
>>  virFileHasSuffix;
>> +virFileInData;
>>  virFileIsAbsPath;
>>  virFileIsDir;
>>  virFileIsExecutable;
>> diff --git a/src/util/virfile.c b/src/util/virfile.c
>> index ea44a647c..5b10f9489 100644
>> --- a/src/util/virfile.c
>> +++ b/src/util/virfile.c
>> @@ -3793,6 +3793,88 @@ virFileComparePaths(const char *p1, const char *p2)
>>   cleanup:
>>      VIR_FREE(res1);
>>      VIR_FREE(res2);
>> +
>> +    return ret;
>> +}
>> +
>> +
> 
> Still undocumented.
> 
> I know it got discussed a few times...  I guess the odd thing I find
> about "long long" is that all the stream mgmt lengths/sizes, etc. are
> size_t.   You also only test for smaller values only.  Just saying...

That's true for areas where we need to address individual bytes in
buffers, e.g. virStreamRecv & virStreamSend. When it comes to file
offsets like in virStorageVolDownload and virStorageVolUpload we use ULL.

> 
> Please just add the function description *and* why a long long is being
> used here.  Also a brief summary of what's being done and of course that
> lseek @cleanup:

How about this:

+/**
+ * virFileInData:
+ * @fd: file to check
+ * @inData: true if current position in the @fd is in data section
+ * @length: amount of bytes until the end of the current section
+ *
+ * With sparse files not every extent has to be physically stored on
+ * the disk. This results in so called data or hole sections.  This
+ * functions checks whether the current position in the file @fd is
+ * in a data section (@inData = 1) or in a hole (@inData = 0). Also,
+ * it sets @length to match the number of bytes remaining until the
+ * end of the current section.
+ *
+ * As a special case, there is an implicit hole at the end of any
+ * file. In this case, the function sets @inData = 0, @length = 0.
+ *
+ * Upon its return, the position in the @fd is left unchanged, i.e.
+ * despite this function lseek()-ing back and forth it always
+ * restores the original position in the file.
+ *
+ * NB, @length is type of long long because it corresponds to off_t
+ * the best.
+ *
+ * Returns 0 on success,
+ *        -1 otherwise.
+ */

Michal




More information about the libvir-list mailing list