From a1140d77d059d809ed32a9ae59d321cf897677ea Mon Sep 17 00:00:00 2001 From: Fiona Ebner Date: Thu, 19 Dec 2024 11:43:13 +0100 Subject: [PATCH] plugins: volume import: align size up to 1KiB Previously, the size was rounded down which, in case of an image with non-1KiB-aligned sze (only possible for external plugins or manually created images) would lead to errors when attempting to write beyond the end of the too small allocated target image. For image allocation, the size is already rounded up to the granularity of the storage. Do the same for import. Signed-off-by: Fiona Ebner --- src/PVE/Storage/LVMPlugin.pm | 4 +++- src/PVE/Storage/Plugin.pm | 4 +++- src/PVE/Storage/RBDPlugin.pm | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm index 88fd612..38f7fa1 100644 --- a/src/PVE/Storage/LVMPlugin.pm +++ b/src/PVE/Storage/LVMPlugin.pm @@ -9,6 +9,8 @@ use PVE::Tools qw(run_command trim); use PVE::Storage::Plugin; use PVE::JSONSchema qw(get_standard_option); +use PVE::Storage::Common; + use base qw(PVE::Storage::Plugin); # lvm helper functions @@ -677,7 +679,7 @@ sub volume_import { } my ($size) = PVE::Storage::Plugin::read_common_header($fh); - $size = int($size/1024); + $size = PVE::Storage::Common::align_size_up($size, 1024) / 1024; eval { my $allocname = $class->alloc_image($storeid, $scfg, $vmid, 'raw', $name, $size); diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index 92609ad..65cf43f 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -15,6 +15,8 @@ use PVE::Tools qw(run_command); use PVE::JSONSchema qw(get_standard_option register_standard_option); use PVE::Cluster qw(cfs_register_file); +use PVE::Storage::Common; + use JSON; use base qw(PVE::SectionConfig); @@ -1777,7 +1779,7 @@ sub volume_import { } my ($size) = read_common_header($fh); - $size = int($size/1024); + $size = PVE::Storage::Common::align_size_up($size, 1024) / 1024; eval { my $allocname = $class->alloc_image($storeid, $scfg, $vmid, $file_format, $name, $size); diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm index 1d1cfad..a362529 100644 --- a/src/PVE/Storage/RBDPlugin.pm +++ b/src/PVE/Storage/RBDPlugin.pm @@ -18,6 +18,8 @@ use PVE::RPCEnvironment; use PVE::Storage::Plugin; use PVE::Tools qw(run_command trim file_read_firstline); +use PVE::Storage::Common; + use base qw(PVE::Storage::Plugin); my $get_parent_image_name = sub { @@ -955,7 +957,7 @@ sub volume_import { } my ($size) = PVE::Storage::Plugin::read_common_header($fh); - $size = int($size/1024); + $size = PVE::Storage::Common::align_size_up($size, 1024) / 1024; eval { my $cmd = $rbd_cmd->($scfg, $storeid, 'import', '--export-format', '1', '-', $volname);