qcow2: Add falloc and full preallocation option
preallocation=falloc allocates disk space by posix_fallocate(), preallocation=full allocates disk space by writing zeros to disk. Both modes imply preallocation=metadata. Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
06247428be
commit
0e4271b711
@ -1772,6 +1772,56 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||
Error *local_err = NULL;
|
||||
int ret;
|
||||
|
||||
if (prealloc == PREALLOC_MODE_FULL || prealloc == PREALLOC_MODE_FALLOC) {
|
||||
int64_t meta_size = 0;
|
||||
uint64_t nreftablee, nrefblocke, nl1e, nl2e;
|
||||
int64_t aligned_total_size = align_offset(total_size, cluster_size);
|
||||
|
||||
/* header: 1 cluster */
|
||||
meta_size += cluster_size;
|
||||
|
||||
/* total size of L2 tables */
|
||||
nl2e = aligned_total_size / cluster_size;
|
||||
nl2e = align_offset(nl2e, cluster_size / sizeof(uint64_t));
|
||||
meta_size += nl2e * sizeof(uint64_t);
|
||||
|
||||
/* total size of L1 tables */
|
||||
nl1e = nl2e * sizeof(uint64_t) / cluster_size;
|
||||
nl1e = align_offset(nl1e, cluster_size / sizeof(uint64_t));
|
||||
meta_size += nl1e * sizeof(uint64_t);
|
||||
|
||||
/* total size of refcount blocks
|
||||
*
|
||||
* note: every host cluster is reference-counted, including metadata
|
||||
* (even refcount blocks are recursively included).
|
||||
* Let:
|
||||
* a = total_size (this is the guest disk size)
|
||||
* m = meta size not including refcount blocks and refcount tables
|
||||
* c = cluster size
|
||||
* y1 = number of refcount blocks entries
|
||||
* y2 = meta size including everything
|
||||
* then,
|
||||
* y1 = (y2 + a)/c
|
||||
* y2 = y1 * sizeof(u16) + y1 * sizeof(u16) * sizeof(u64) / c + m
|
||||
* we can get y1:
|
||||
* y1 = (a + m) / (c - sizeof(u16) - sizeof(u16) * sizeof(u64) / c)
|
||||
*/
|
||||
nrefblocke = (aligned_total_size + meta_size + cluster_size) /
|
||||
(cluster_size - sizeof(uint16_t) -
|
||||
1.0 * sizeof(uint16_t) * sizeof(uint64_t) / cluster_size);
|
||||
nrefblocke = align_offset(nrefblocke, cluster_size / sizeof(uint16_t));
|
||||
meta_size += nrefblocke * sizeof(uint16_t);
|
||||
|
||||
/* total size of refcount tables */
|
||||
nreftablee = nrefblocke * sizeof(uint16_t) / cluster_size;
|
||||
nreftablee = align_offset(nreftablee, cluster_size / sizeof(uint64_t));
|
||||
meta_size += nreftablee * sizeof(uint64_t);
|
||||
|
||||
qemu_opt_set_number(opts, BLOCK_OPT_SIZE,
|
||||
aligned_total_size + meta_size);
|
||||
qemu_opt_set(opts, BLOCK_OPT_PREALLOC, PreallocMode_lookup[prealloc]);
|
||||
}
|
||||
|
||||
ret = bdrv_create_file(filename, opts, &local_err);
|
||||
if (ret < 0) {
|
||||
error_propagate(errp, local_err);
|
||||
@ -1877,7 +1927,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
|
||||
}
|
||||
|
||||
/* And if we're supposed to preallocate metadata, do that now */
|
||||
if (prealloc == PREALLOC_MODE_METADATA) {
|
||||
if (prealloc != PREALLOC_MODE_OFF) {
|
||||
BDRVQcowState *s = bs->opaque;
|
||||
qemu_co_mutex_lock(&s->lock);
|
||||
ret = preallocate(bs);
|
||||
@ -1958,14 +2008,6 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
|
||||
flags |= BLOCK_FLAG_LAZY_REFCOUNTS;
|
||||
}
|
||||
|
||||
if (prealloc != PREALLOC_MODE_OFF &&
|
||||
prealloc != PREALLOC_MODE_METADATA) {
|
||||
ret = -EINVAL;
|
||||
error_setg(errp, "Unsupported preallocate mode: %s",
|
||||
PreallocMode_lookup[prealloc]);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (backing_file && prealloc != PREALLOC_MODE_OFF) {
|
||||
error_setg(errp, "Backing file and preallocation cannot be used at "
|
||||
"the same time");
|
||||
@ -2526,7 +2568,8 @@ static QemuOptsList qcow2_create_opts = {
|
||||
{
|
||||
.name = BLOCK_OPT_PREALLOC,
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "Preallocation mode (allowed values: off, metadata)"
|
||||
.help = "Preallocation mode (allowed values: off, metadata, "
|
||||
"falloc, full)"
|
||||
},
|
||||
{
|
||||
.name = BLOCK_OPT_LAZY_REFCOUNTS,
|
||||
|
@ -584,9 +584,11 @@ sizes can improve the image file size whereas larger cluster sizes generally
|
||||
provide better performance.
|
||||
|
||||
@item preallocation
|
||||
Preallocation mode (allowed values: off, metadata). An image with preallocated
|
||||
metadata is initially larger but can improve performance when the image needs
|
||||
to grow.
|
||||
Preallocation mode (allowed values: @code{off}, @code{metadata}, @code{falloc},
|
||||
@code{full}). An image with preallocated metadata is initially larger but can
|
||||
improve performance when the image needs to grow. @code{falloc} and @code{full}
|
||||
preallocations are like the same options of @code{raw} format, but sets up
|
||||
metadata also.
|
||||
|
||||
@item lazy_refcounts
|
||||
If this option is set to @code{on}, reference count updates are postponed with
|
||||
|
@ -476,9 +476,11 @@ sizes can improve the image file size whereas larger cluster sizes generally
|
||||
provide better performance.
|
||||
|
||||
@item preallocation
|
||||
Preallocation mode (allowed values: off, metadata). An image with preallocated
|
||||
metadata is initially larger but can improve performance when the image needs
|
||||
to grow.
|
||||
Preallocation mode (allowed values: @code{off}, @code{metadata}, @code{falloc},
|
||||
@code{full}). An image with preallocated metadata is initially larger but can
|
||||
improve performance when the image needs to grow. @code{falloc} and @code{full}
|
||||
preallocations are like the same options of @code{raw} format, but sets up
|
||||
metadata also.
|
||||
|
||||
@item lazy_refcounts
|
||||
If this option is set to @code{on}, reference count updates are postponed with
|
||||
|
@ -64,7 +64,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -76,7 +76,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -88,7 +88,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -100,7 +100,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -112,7 +112,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -124,7 +124,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -136,7 +136,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -148,7 +148,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -175,7 +175,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
|
||||
Testing: create -o help
|
||||
@ -253,7 +253,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -265,7 +265,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -277,7 +277,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -289,7 +289,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -301,7 +301,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -313,7 +313,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -325,7 +325,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -337,7 +337,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -364,7 +364,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
|
||||
Testing: convert -o help
|
||||
@ -431,7 +431,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -443,7 +443,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -455,7 +455,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -467,7 +467,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -479,7 +479,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -491,7 +491,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -503,7 +503,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -515,7 +515,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
nocow Turn off copy-on-write (valid only on btrfs)
|
||||
|
||||
@ -544,7 +544,7 @@ backing_file File name of a base image
|
||||
backing_fmt Image format of the base image
|
||||
encryption Encrypt the image
|
||||
cluster_size qcow2 cluster size
|
||||
preallocation Preallocation mode (allowed values: off, metadata)
|
||||
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
lazy_refcounts Postpone refcount updates
|
||||
|
||||
Testing: convert -o help
|
||||
|
Loading…
Reference in New Issue
Block a user