fix #3580: plugins: make preallocation mode selectable for qcow2 and raw images

the plugins for file based storages
 * BTRFS
 * CIFS
 * Dir
 * Glusterfs
 * NFS
now allow the option 'preallocation'.

'preallocation' can have four values:
 * default
 * off
 * metadata
 * falloc
 * full
see man pages for `qemu-img` for what these mean exactly. [0]

the defualt value was chosen to be
 * qcow2: metadata (as previously)
 * raw: off

when using 'metadata' as preallocation mode, for raw images 'off'
is used.

[0] https://qemu.readthedocs.io/en/latest/system/images.html#disk-image-file-formats

Signed-off-by: Lorenz Stechauner <l.stechauner@proxmox.com>
Reviewed-by: Fabian Ebner <f.ebner@proxmox.com>
Tested-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
Lorenz Stechauner
2021-10-12 14:32:32 +02:00
committed by Thomas Lamprecht
parent 2caa1194e9
commit 95ff5dbd64
6 changed files with 54 additions and 2 deletions

View File

@ -73,6 +73,7 @@ sub options {
is_mountpoint => { optional => 1 },
nocow => { optional => 1 },
mkdir => { optional => 1 },
preallocation => { optional => 1 },
# TODO: The new variant of mkdir with `populate` vs `create`...
};
}

View File

@ -142,6 +142,7 @@ sub options {
smbversion => { optional => 1},
mkdir => { optional => 1 },
bwlimit => { optional => 1 },
preallocation => { optional => 1 },
};
}

View File

@ -59,6 +59,7 @@ sub options {
mkdir => { optional => 1 },
is_mountpoint => { optional => 1 },
bwlimit => { optional => 1 },
preallocation => { optional => 1 },
};
}

View File

@ -137,6 +137,7 @@ sub options {
format => { optional => 1 },
mkdir => { optional => 1 },
bwlimit => { optional => 1 },
preallocation => { optional => 1 },
};
}
@ -260,7 +261,8 @@ sub alloc_image {
my $cmd = ['/usr/bin/qemu-img', 'create'];
push @$cmd, '-o', 'preallocation=metadata' if $fmt eq 'qcow2';
my $prealloc_opt = PVE::Storage::Plugin::preallocation_cmd_option($scfg, $fmt);
push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt);
push @$cmd, '-f', $fmt, $volumepath, "${size}K";

View File

@ -90,6 +90,7 @@ sub options {
format => { optional => 1 },
mkdir => { optional => 1 },
bwlimit => { optional => 1 },
preallocation => { optional => 1 },
};
}

View File

@ -41,6 +41,19 @@ our @SHARED_STORAGE = (
'pbs',
);
our $QCOW2_PREALLOCATION = {
off => 1,
metadata => 1,
falloc => 1,
full => 1,
};
our $RAW_PREALLOCATION = {
off => 1,
falloc => 1,
full => 1,
};
our $MAX_VOLUMES_PER_GUEST = 1024;
cfs_register_file ('storage.cfg',
@ -152,6 +165,13 @@ my $defaultData = {
type => 'string', format => 'pve-storage-format',
optional => 1,
},
preallocation => {
description => "Preallocation mode for raw and qcow2 images. " .
"Using 'metadata' on raw images results in preallocation=off.",
type => 'string', enum => ['off', 'metadata', 'falloc', 'full'],
default => 'metadata',
optional => 1,
},
},
};
@ -444,6 +464,31 @@ sub parse_config {
return $cfg;
}
sub preallocation_cmd_option {
my ($scfg, $fmt) = @_;
my $prealloc = $scfg->{preallocation};
if ($fmt eq 'qcow2') {
$prealloc = $prealloc // 'metadata';
die "preallocation mode '$prealloc' not supported by format '$fmt'\n"
if !$QCOW2_PREALLOCATION->{$prealloc};
return "preallocation=$prealloc";
} elsif ($fmt eq 'raw') {
$prealloc = $prealloc // 'off';
$prealloc = 'off' if $prealloc eq 'metadata';
die "preallocation mode '$prealloc' not supported by format '$fmt'\n"
if !$RAW_PREALLOCATION->{$prealloc};
return "preallocation=$prealloc";
}
return;
}
# Storage implementation
# called during addition of storage (before the new storage config got written)
@ -764,7 +809,8 @@ sub alloc_image {
} else {
my $cmd = ['/usr/bin/qemu-img', 'create'];
push @$cmd, '-o', 'preallocation=metadata' if $fmt eq 'qcow2';
my $prealloc_opt = preallocation_cmd_option($scfg, $fmt);
push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt);
push @$cmd, '-f', $fmt, $path, "${size}K";