diff mbox

[V9,3/4] raw-posix: Add full image preallocation option

Message ID 50ef9e885d2a614cfd625cb30e8e8d49999c2a91.1401177674.git.hutao@cn.fujitsu.com
State New
Headers show

Commit Message

chenfan May 27, 2014, 8:22 a.m. UTC
From: Hu Tao <hutao@cn.fujitsu.com>

This patch adds a new option preallocation for raw format, and implements
full preallocation by writing zeros to disk.

The metadata option is changed to use posix_fallocate() to ensure
subsquent writes to image file won't fail because of lack of disk space.

The purpose is to ensure disk space for image file. In cases
posix_fallocate() is supported, metadata option can be used, otherwise
(posix_fallocate() is not supported by filesystem, or in case of thin
 provisioning), full option has to be used. User has to choose the proper
way to use.

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
---
 block/raw-posix.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 54 insertions(+), 7 deletions(-)

Comments

Eric Blake May 27, 2014, 7:24 p.m. UTC | #1
On 05/27/2014 02:22 AM, Chen Fan wrote:
> From: Hu Tao <hutao@cn.fujitsu.com>
> 
> This patch adds a new option preallocation for raw format, and implements
> full preallocation by writing zeros to disk.
> 
> The metadata option is changed to use posix_fallocate() to ensure
> subsquent writes to image file won't fail because of lack of disk space.
> 
> The purpose is to ensure disk space for image file. In cases
> posix_fallocate() is supported, metadata option can be used, otherwise
> (posix_fallocate() is not supported by filesystem, or in case of thin
>  provisioning), full option has to be used. User has to choose the proper
> way to use.
> 
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>  block/raw-posix.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 54 insertions(+), 7 deletions(-)
> 

> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
>          if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
>              total_size = (options->value.n + BDRV_SECTOR_SIZE) &
>                  BDRV_SECTOR_MASK;
> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
> +                prealloc = PREALLOC_MODE_OFF;
> +            } else if (!strcmp(options->value.s, "metadata")) {
> +                prealloc = PREALLOC_MODE_METADATA;
> +            } else if (!strcmp(options->value.s, "full")) {
> +                prealloc = PREALLOC_MODE_FULL;
> +            } else {

Instead of open-coding this conversion from string to enum, can you
reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
to somewhere public, not just blockdev.c)

https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
Peter Lieven May 27, 2014, 8:59 p.m. UTC | #2
Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:

> On 05/27/2014 02:22 AM, Chen Fan wrote:
>> From: Hu Tao <hutao@cn.fujitsu.com>
>> 
>> This patch adds a new option preallocation for raw format, and implements
>> full preallocation by writing zeros to disk.
>> 
>> The metadata option is changed to use posix_fallocate() to ensure
>> subsquent writes to image file won't fail because of lack of disk space.
>> 
>> The purpose is to ensure disk space for image file. In cases
>> posix_fallocate() is supported, metadata option can be used, otherwise
>> (posix_fallocate() is not supported by filesystem, or in case of thin
>> provisioning), full option has to be used. User has to choose the proper
>> way to use.
>> 
>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
>> ---
>> block/raw-posix.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 54 insertions(+), 7 deletions(-)
>> 
> 
>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
>>                 BDRV_SECTOR_MASK;
>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
>> +                prealloc = PREALLOC_MODE_OFF;
>> +            } else if (!strcmp(options->value.s, "metadata")) {
>> +                prealloc = PREALLOC_MODE_METADATA;
>> +            } else if (!strcmp(options->value.s, "full")) {
>> +                prealloc = PREALLOC_MODE_FULL;
>> +            } else {
> 
> Instead of open-coding this conversion from string to enum, can you
> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
> to somewhere public, not just blockdev.c)
> 
> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html

I don't mind if this function is made public. You can send a patch for it.
Please don't forget to remove the static declaration. You might
also want to remove the inline. This was just to avoid an unused
function error. I don't know if blockdev.c is still the right
place for this function then.

Peter

> 
> -- 
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
>
Markus Armbruster May 28, 2014, 5:36 a.m. UTC | #3
Peter Lieven <pl@kamp.de> writes:

> Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
>
>> On 05/27/2014 02:22 AM, Chen Fan wrote:
>>> From: Hu Tao <hutao@cn.fujitsu.com>
>>> 
>>> This patch adds a new option preallocation for raw format, and implements
>>> full preallocation by writing zeros to disk.
>>> 
>>> The metadata option is changed to use posix_fallocate() to ensure
>>> subsquent writes to image file won't fail because of lack of disk space.
>>> 
>>> The purpose is to ensure disk space for image file. In cases
>>> posix_fallocate() is supported, metadata option can be used, otherwise
>>> (posix_fallocate() is not supported by filesystem, or in case of thin
>>> provisioning), full option has to be used. User has to choose the proper
>>> way to use.
>>> 
>>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
>>> ---
>>> block/raw-posix.c | 61
>>> ++++++++++++++++++++++++++++++++++++++++++++++++-------
>>> 1 file changed, 54 insertions(+), 7 deletions(-)
>>> 
>> 
>>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
>>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
>>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
>>>                 BDRV_SECTOR_MASK;
>>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
>>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
>>> +                prealloc = PREALLOC_MODE_OFF;
>>> +            } else if (!strcmp(options->value.s, "metadata")) {
>>> +                prealloc = PREALLOC_MODE_METADATA;
>>> +            } else if (!strcmp(options->value.s, "full")) {
>>> +                prealloc = PREALLOC_MODE_FULL;
>>> +            } else {
>> 
>> Instead of open-coding this conversion from string to enum, can you
>> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
>> to somewhere public, not just blockdev.c)
>> 
>> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
>
> I don't mind if this function is made public. You can send a patch for it.
> Please don't forget to remove the static declaration. You might
> also want to remove the inline. This was just to avoid an unused
> function error. I don't know if blockdev.c is still the right
> place for this function then.

Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
If no existing file fits, create a new one, say qapi/qapi-util.c.
Hu Tao May 29, 2014, 1:55 a.m. UTC | #4
On Wed, May 28, 2014 at 07:36:26AM +0200, Markus Armbruster wrote:
> Peter Lieven <pl@kamp.de> writes:
> 
> > Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
> >
> >> On 05/27/2014 02:22 AM, Chen Fan wrote:
> >>> From: Hu Tao <hutao@cn.fujitsu.com>
> >>> 
> >>> This patch adds a new option preallocation for raw format, and implements
> >>> full preallocation by writing zeros to disk.
> >>> 
> >>> The metadata option is changed to use posix_fallocate() to ensure
> >>> subsquent writes to image file won't fail because of lack of disk space.
> >>> 
> >>> The purpose is to ensure disk space for image file. In cases
> >>> posix_fallocate() is supported, metadata option can be used, otherwise
> >>> (posix_fallocate() is not supported by filesystem, or in case of thin
> >>> provisioning), full option has to be used. User has to choose the proper
> >>> way to use.
> >>> 
> >>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> >>> ---
> >>> block/raw-posix.c | 61
> >>> ++++++++++++++++++++++++++++++++++++++++++++++++-------
> >>> 1 file changed, 54 insertions(+), 7 deletions(-)
> >>> 
> >> 
> >>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
> >>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
> >>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
> >>>                 BDRV_SECTOR_MASK;
> >>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
> >>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
> >>> +                prealloc = PREALLOC_MODE_OFF;
> >>> +            } else if (!strcmp(options->value.s, "metadata")) {
> >>> +                prealloc = PREALLOC_MODE_METADATA;
> >>> +            } else if (!strcmp(options->value.s, "full")) {
> >>> +                prealloc = PREALLOC_MODE_FULL;
> >>> +            } else {
> >> 
> >> Instead of open-coding this conversion from string to enum, can you
> >> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
> >> to somewhere public, not just blockdev.c)
> >> 
> >> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
> >
> > I don't mind if this function is made public. You can send a patch for it.
> > Please don't forget to remove the static declaration. You might
> > also want to remove the inline. This was just to avoid an unused
> > function error. I don't know if blockdev.c is still the right
> > place for this function then.
> 
> Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
> If no existing file fits, create a new one, say qapi/qapi-util.c.


Thanks. I'll use the function in next version.
Peter Lieven May 29, 2014, 6:55 p.m. UTC | #5
Am 29.05.2014 03:55, schrieb Hu Tao:
> On Wed, May 28, 2014 at 07:36:26AM +0200, Markus Armbruster wrote:
>> Peter Lieven <pl@kamp.de> writes:
>>
>>> Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
>>>
>>>> On 05/27/2014 02:22 AM, Chen Fan wrote:
>>>>> From: Hu Tao <hutao@cn.fujitsu.com>
>>>>>
>>>>> This patch adds a new option preallocation for raw format, and implements
>>>>> full preallocation by writing zeros to disk.
>>>>>
>>>>> The metadata option is changed to use posix_fallocate() to ensure
>>>>> subsquent writes to image file won't fail because of lack of disk space.
>>>>>
>>>>> The purpose is to ensure disk space for image file. In cases
>>>>> posix_fallocate() is supported, metadata option can be used, otherwise
>>>>> (posix_fallocate() is not supported by filesystem, or in case of thin
>>>>> provisioning), full option has to be used. User has to choose the proper
>>>>> way to use.
>>>>>
>>>>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
>>>>> ---
>>>>> block/raw-posix.c | 61
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++-------
>>>>> 1 file changed, 54 insertions(+), 7 deletions(-)
>>>>>
>>>>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
>>>>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
>>>>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
>>>>>                 BDRV_SECTOR_MASK;
>>>>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
>>>>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
>>>>> +                prealloc = PREALLOC_MODE_OFF;
>>>>> +            } else if (!strcmp(options->value.s, "metadata")) {
>>>>> +                prealloc = PREALLOC_MODE_METADATA;
>>>>> +            } else if (!strcmp(options->value.s, "full")) {
>>>>> +                prealloc = PREALLOC_MODE_FULL;
>>>>> +            } else {
>>>> Instead of open-coding this conversion from string to enum, can you
>>>> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
>>>> to somewhere public, not just blockdev.c)
>>>>
>>>> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
>>> I don't mind if this function is made public. You can send a patch for it.
>>> Please don't forget to remove the static declaration. You might
>>> also want to remove the inline. This was just to avoid an unused
>>> function error. I don't know if blockdev.c is still the right
>>> place for this function then.
>> Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
>> If no existing file fits, create a new one, say qapi/qapi-util.c.
>
> Thanks. I'll use the function in next version.

Will you introduce a patch to move it to QAPI or shall I?

Peter
Hu Tao June 5, 2014, 5:39 a.m. UTC | #6
On Thu, May 29, 2014 at 08:55:59PM +0200, Peter Lieven wrote:
> Am 29.05.2014 03:55, schrieb Hu Tao:
> > On Wed, May 28, 2014 at 07:36:26AM +0200, Markus Armbruster wrote:
> >> Peter Lieven <pl@kamp.de> writes:
> >>
> >>> Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
> >>>
> >>>> On 05/27/2014 02:22 AM, Chen Fan wrote:
> >>>>> From: Hu Tao <hutao@cn.fujitsu.com>
> >>>>>
> >>>>> This patch adds a new option preallocation for raw format, and implements
> >>>>> full preallocation by writing zeros to disk.
> >>>>>
> >>>>> The metadata option is changed to use posix_fallocate() to ensure
> >>>>> subsquent writes to image file won't fail because of lack of disk space.
> >>>>>
> >>>>> The purpose is to ensure disk space for image file. In cases
> >>>>> posix_fallocate() is supported, metadata option can be used, otherwise
> >>>>> (posix_fallocate() is not supported by filesystem, or in case of thin
> >>>>> provisioning), full option has to be used. User has to choose the proper
> >>>>> way to use.
> >>>>>
> >>>>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> >>>>> ---
> >>>>> block/raw-posix.c | 61
> >>>>> ++++++++++++++++++++++++++++++++++++++++++++++++-------
> >>>>> 1 file changed, 54 insertions(+), 7 deletions(-)
> >>>>>
> >>>>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
> >>>>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
> >>>>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
> >>>>>                 BDRV_SECTOR_MASK;
> >>>>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
> >>>>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
> >>>>> +                prealloc = PREALLOC_MODE_OFF;
> >>>>> +            } else if (!strcmp(options->value.s, "metadata")) {
> >>>>> +                prealloc = PREALLOC_MODE_METADATA;
> >>>>> +            } else if (!strcmp(options->value.s, "full")) {
> >>>>> +                prealloc = PREALLOC_MODE_FULL;
> >>>>> +            } else {
> >>>> Instead of open-coding this conversion from string to enum, can you
> >>>> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
> >>>> to somewhere public, not just blockdev.c)
> >>>>
> >>>> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
> >>> I don't mind if this function is made public. You can send a patch for it.
> >>> Please don't forget to remove the static declaration. You might
> >>> also want to remove the inline. This was just to avoid an unused
> >>> function error. I don't know if blockdev.c is still the right
> >>> place for this function then.
> >> Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
> >> If no existing file fits, create a new one, say qapi/qapi-util.c.
> >
> > Thanks. I'll use the function in next version.
> 
> Will you introduce a patch to move it to QAPI or shall I?

I will include the patch in next version of this series, but if you'd
like I can send a seperate patch.

Thanks.
Peter Lieven June 5, 2014, 5:48 a.m. UTC | #7
On 05.06.2014 07:39, Hu Tao wrote:
> On Thu, May 29, 2014 at 08:55:59PM +0200, Peter Lieven wrote:
>> Am 29.05.2014 03:55, schrieb Hu Tao:
>>> On Wed, May 28, 2014 at 07:36:26AM +0200, Markus Armbruster wrote:
>>>> Peter Lieven <pl@kamp.de> writes:
>>>>
>>>>> Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
>>>>>
>>>>>> On 05/27/2014 02:22 AM, Chen Fan wrote:
>>>>>>> From: Hu Tao <hutao@cn.fujitsu.com>
>>>>>>>
>>>>>>> This patch adds a new option preallocation for raw format, and implements
>>>>>>> full preallocation by writing zeros to disk.
>>>>>>>
>>>>>>> The metadata option is changed to use posix_fallocate() to ensure
>>>>>>> subsquent writes to image file won't fail because of lack of disk space.
>>>>>>>
>>>>>>> The purpose is to ensure disk space for image file. In cases
>>>>>>> posix_fallocate() is supported, metadata option can be used, otherwise
>>>>>>> (posix_fallocate() is not supported by filesystem, or in case of thin
>>>>>>> provisioning), full option has to be used. User has to choose the proper
>>>>>>> way to use.
>>>>>>>
>>>>>>> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
>>>>>>> ---
>>>>>>> block/raw-posix.c | 61
>>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++-------
>>>>>>> 1 file changed, 54 insertions(+), 7 deletions(-)
>>>>>>>
>>>>>>> @@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
>>>>>>>          if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
>>>>>>>              total_size = (options->value.n + BDRV_SECTOR_SIZE) &
>>>>>>>                  BDRV_SECTOR_MASK;
>>>>>>> +        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
>>>>>>> +            if (!options->value.s || !strcmp(options->value.s, "off")) {
>>>>>>> +                prealloc = PREALLOC_MODE_OFF;
>>>>>>> +            } else if (!strcmp(options->value.s, "metadata")) {
>>>>>>> +                prealloc = PREALLOC_MODE_METADATA;
>>>>>>> +            } else if (!strcmp(options->value.s, "full")) {
>>>>>>> +                prealloc = PREALLOC_MODE_FULL;
>>>>>>> +            } else {
>>>>>> Instead of open-coding this conversion from string to enum, can you
>>>>>> reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
>>>>>> to somewhere public, not just blockdev.c)
>>>>>>
>>>>>> https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
>>>>> I don't mind if this function is made public. You can send a patch for it.
>>>>> Please don't forget to remove the static declaration. You might
>>>>> also want to remove the inline. This was just to avoid an unused
>>>>> function error. I don't know if blockdev.c is still the right
>>>>> place for this function then.
>>>> Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
>>>> If no existing file fits, create a new one, say qapi/qapi-util.c.
>>> Thanks. I'll use the function in next version.
>> Will you introduce a patch to move it to QAPI or shall I?
> I will include the patch in next version of this series, but if you'd
> like I can send a seperate patch.

I would include the patch in the series if the series depends on this patch.

Peter

>
> Thanks.
>
Hu Tao June 5, 2014, 5:49 a.m. UTC | #8
On Thu, Jun 05, 2014 at 07:48:12AM +0200, Peter Lieven wrote:
> On 05.06.2014 07:39, Hu Tao wrote:
> >On Thu, May 29, 2014 at 08:55:59PM +0200, Peter Lieven wrote:
> >>Am 29.05.2014 03:55, schrieb Hu Tao:
> >>>On Wed, May 28, 2014 at 07:36:26AM +0200, Markus Armbruster wrote:
> >>>>Peter Lieven <pl@kamp.de> writes:
> >>>>
> >>>>>Am 27.05.2014 um 21:24 schrieb Eric Blake <eblake@redhat.com>:
> >>>>>
> >>>>>>On 05/27/2014 02:22 AM, Chen Fan wrote:
> >>>>>>>From: Hu Tao <hutao@cn.fujitsu.com>
> >>>>>>>
> >>>>>>>This patch adds a new option preallocation for raw format, and implements
> >>>>>>>full preallocation by writing zeros to disk.
> >>>>>>>
> >>>>>>>The metadata option is changed to use posix_fallocate() to ensure
> >>>>>>>subsquent writes to image file won't fail because of lack of disk space.
> >>>>>>>
> >>>>>>>The purpose is to ensure disk space for image file. In cases
> >>>>>>>posix_fallocate() is supported, metadata option can be used, otherwise
> >>>>>>>(posix_fallocate() is not supported by filesystem, or in case of thin
> >>>>>>>provisioning), full option has to be used. User has to choose the proper
> >>>>>>>way to use.
> >>>>>>>
> >>>>>>>Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> >>>>>>>---
> >>>>>>>block/raw-posix.c | 61
> >>>>>>>++++++++++++++++++++++++++++++++++++++++++++++++-------
> >>>>>>>1 file changed, 54 insertions(+), 7 deletions(-)
> >>>>>>>
> >>>>>>>@@ -1254,6 +1255,18 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
> >>>>>>>         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
> >>>>>>>             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
> >>>>>>>                 BDRV_SECTOR_MASK;
> >>>>>>>+        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
> >>>>>>>+            if (!options->value.s || !strcmp(options->value.s, "off")) {
> >>>>>>>+                prealloc = PREALLOC_MODE_OFF;
> >>>>>>>+            } else if (!strcmp(options->value.s, "metadata")) {
> >>>>>>>+                prealloc = PREALLOC_MODE_METADATA;
> >>>>>>>+            } else if (!strcmp(options->value.s, "full")) {
> >>>>>>>+                prealloc = PREALLOC_MODE_FULL;
> >>>>>>>+            } else {
> >>>>>>Instead of open-coding this conversion from string to enum, can you
> >>>>>>reuse Peter's pending patch?  (Hmm, that means Peter needs to export it
> >>>>>>to somewhere public, not just blockdev.c)
> >>>>>>
> >>>>>>https://lists.gnu.org/archive/html/qemu-devel/2014-05/msg03772.html
> >>>>>I don't mind if this function is made public. You can send a patch for it.
> >>>>>Please don't forget to remove the static declaration. You might
> >>>>>also want to remove the inline. This was just to avoid an unused
> >>>>>function error. I don't know if blockdev.c is still the right
> >>>>>place for this function then.
> >>>>Probably not.  I'd rename to qapi_enum_parse(), and move it to qapi/.
> >>>>If no existing file fits, create a new one, say qapi/qapi-util.c.
> >>>Thanks. I'll use the function in next version.
> >>Will you introduce a patch to move it to QAPI or shall I?
> >I will include the patch in next version of this series, but if you'd
> >like I can send a seperate patch.
> 
> I would include the patch in the series if the series depends on this patch.

OK.
diff mbox

Patch

diff --git a/block/raw-posix.c b/block/raw-posix.c
index 710ea9b..07e2088 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -1246,6 +1246,7 @@  static int raw_create(const char *filename, QEMUOptionParameter *options,
     int fd;
     int result = 0;
     int64_t total_size = 0;
+    PreallocMode prealloc = PREALLOC_MODE_OFF;
 
     strstart(filename, "file:", &filename);
 
@@ -1254,6 +1255,18 @@  static int raw_create(const char *filename, QEMUOptionParameter *options,
         if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
             total_size = (options->value.n + BDRV_SECTOR_SIZE) &
                 BDRV_SECTOR_MASK;
+        } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
+            if (!options->value.s || !strcmp(options->value.s, "off")) {
+                prealloc = PREALLOC_MODE_OFF;
+            } else if (!strcmp(options->value.s, "metadata")) {
+                prealloc = PREALLOC_MODE_METADATA;
+            } else if (!strcmp(options->value.s, "full")) {
+                prealloc = PREALLOC_MODE_FULL;
+            } else {
+                error_setg(errp, "Invalid preallocation mode: '%s'",
+                           options->value.s);
+                return -EINVAL;
+            }
         }
         options++;
     }
@@ -1263,16 +1276,45 @@  static int raw_create(const char *filename, QEMUOptionParameter *options,
     if (fd < 0) {
         result = -errno;
         error_setg_errno(errp, -result, "Could not create file");
-    } else {
-        if (ftruncate(fd, total_size) != 0) {
-            result = -errno;
-            error_setg_errno(errp, -result, "Could not resize file");
+        goto out;
+    }
+    if (ftruncate(fd, total_size) != 0) {
+        result = -errno;
+        error_setg_errno(errp, -result, "Could not resize file");
+        goto out_close;
+    }
+    if (prealloc == PREALLOC_MODE_METADATA) {
+        /* posix_fallocate() doesn't set errno. */
+        result = -posix_fallocate(fd, 0, total_size);
+        if (result != 0) {
+            error_setg_errno(errp, -result,
+                             "Could not preallocate data for the new file");
         }
-        if (qemu_close(fd) != 0) {
-            result = -errno;
-            error_setg_errno(errp, -result, "Could not close the new file");
+    } else if (prealloc == PREALLOC_MODE_FULL) {
+        char *buf = g_malloc0(65536);
+        int64_t num = 0, left = total_size;
+
+        while (left > 0) {
+            num = MIN(left, 65536);
+            result = write(fd, buf, num);
+            if (result < 0) {
+                result = -errno;
+                error_setg_errno(errp, -result,
+                                 "Could not write to the new file");
+                g_free(buf);
+                goto out_close;
+            }
+            left -= num;
         }
+        fsync(fd);
+        g_free(buf);
+    }
+out_close:
+    if (qemu_close(fd) != 0 && result == 0) {
+        result = -errno;
+        error_setg_errno(errp, -result, "Could not close the new file");
     }
+out:
     return result;
 }
 
@@ -1447,6 +1489,11 @@  static QEMUOptionParameter raw_create_options[] = {
         .type = OPT_SIZE,
         .help = "Virtual disk size"
     },
+    {
+        .name = BLOCK_OPT_PREALLOC,
+        .type = OPT_STRING,
+        .help = "Preallocation mode (allowed values: off, metadata, full)"
+    },
     { NULL }
 };