Message ID | 50ef9e885d2a614cfd625cb30e8e8d49999c2a91.1401177674.git.hutao@cn.fujitsu.com |
---|---|
State | New |
Headers | show |
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
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 >
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.
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.
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
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.
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. >
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 --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 } };