From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id C6D631FF183 for ; Wed, 16 Jul 2025 08:32:21 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 2934215F29; Wed, 16 Jul 2025 08:32:38 +0200 (CEST) To: pve-devel@lists.proxmox.com Date: Wed, 16 Jul 2025 08:31:37 +0200 In-Reply-To: <20250716063153.1647681-1-alexandre.derumier@groupe-cyllene.com> References: <20250716063153.1647681-1-alexandre.derumier@groupe-cyllene.com> MIME-Version: 1.0 Message-ID: List-Id: Proxmox VE development discussion List-Post: From: Alexandre Derumier via pve-devel Precedence: list Cc: Alexandre Derumier X-Mailman-Version: 2.1.29 X-BeenThere: pve-devel@lists.proxmox.com List-Subscribe: , List-Unsubscribe: , List-Archive: Reply-To: Proxmox VE development discussion List-Help: Subject: [pve-devel] [PATCH FOLLOW-UP storage 01/14] helpers: make qemu_img* storage config independent Content-Type: multipart/mixed; boundary="===============8063657199035307909==" Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" --===============8063657199035307909== Content-Type: message/rfc822 Content-Disposition: inline Return-Path: X-Original-To: pve-devel@lists.proxmox.com Delivered-To: pve-devel@lists.proxmox.com Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 8C635DACCD for ; Wed, 16 Jul 2025 08:32:35 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 64703157A2 for ; Wed, 16 Jul 2025 08:32:05 +0200 (CEST) Received: from bastiontest.odiso.net (unknown [IPv6:2a0a:1580:2000:6700::14]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Wed, 16 Jul 2025 08:32:03 +0200 (CEST) Received: from formationkvm1.odiso.net (unknown [10.11.201.57]) by bastiontest.odiso.net (Postfix) with ESMTP id 21F15860F15; Wed, 16 Jul 2025 08:31:56 +0200 (CEST) Received: by formationkvm1.odiso.net (Postfix, from userid 0) id 16D3B11F6B0C; Wed, 16 Jul 2025 08:31:56 +0200 (CEST) From: Alexandre Derumier To: pve-devel@lists.proxmox.com Subject: [PATCH FOLLOW-UP storage 01/14] helpers: make qemu_img* storage config independent Date: Wed, 16 Jul 2025 08:31:37 +0200 Message-Id: <20250716063153.1647681-3-alexandre.derumier@groupe-cyllene.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250716063153.1647681-1-alexandre.derumier@groupe-cyllene.com> References: <20250716063153.1647681-1-alexandre.derumier@groupe-cyllene.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 1 AWL -1.387 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_NONE 0.1 DMARC none policy HEADER_FROM_DIFFERENT_DOMAINS 0.001 From and EnvelopeFrom 2nd level mail domains are different KAM_DMARC_NONE 0.25 DKIM has Failed or SPF has failed on the message and the domain has no DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record URIBL_BLACK 3 Contains an URL listed in the URIBL blacklist [plugin.pm] From: Fabian Grünbichler by moving the preallocation handling to the call site, and preparing them for taking further options like cluster size in the future. Signed-off-by: Fabian Grünbichler Signed-off-by: Alexandre Derumier --- src/PVE/Storage/LVMPlugin.pm | 10 ++++-- src/PVE/Storage/Plugin.pm | 66 ++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm index a91801f..f90df18 100644 --- a/src/PVE/Storage/LVMPlugin.pm +++ b/src/PVE/Storage/LVMPlugin.pm @@ -579,11 +579,14 @@ my sub lvm_qcow2_format { $class->activate_volume($storeid, $scfg, $name); my $path = $class->path($scfg, $name, $storeid); + my $options = { + preallocation => PVE::Storage::Plugin::preallocation_cmd_opt($scfg, $fmt), + }; if ($backing_snap) { my $backing_path = $class->path($scfg, $name, $storeid, $backing_snap); - PVE::Storage::Plugin::qemu_img_create_qcow2_backed($scfg, $path, $backing_path, $fmt); + PVE::Storage::Plugin::qemu_img_create_qcow2_backed($path, $backing_path, $fmt, $options); } else { - PVE::Storage::Plugin::qemu_img_create($scfg, $fmt, $size, $path); + PVE::Storage::Plugin::qemu_img_create($fmt, $size, $path, $options); } } @@ -868,7 +871,8 @@ sub volume_resize { ); if (!$running && $format eq 'qcow2') { - PVE::Storage::Plugin::qemu_img_resize($scfg, $path, $format, $size, 10); + my $preallocation = PVE::Storage::Plugin::preallocation_cmd_opt($scfg, $fmt); + PVE::Storage::Plugin::qemu_img_resize($path, $format, $size, $preallocation, 10); } return 1; diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm index 0b7989b..6eb91b7 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -615,7 +615,7 @@ sub parse_config { return $cfg; } -sub preallocation_cmd_option { +sub preallocation_cmd_opt { my ($scfg, $fmt) = @_; my $prealloc = $scfg->{preallocation}; @@ -626,7 +626,7 @@ sub preallocation_cmd_option { die "preallocation mode '$prealloc' not supported by format '$fmt'\n" if !$QCOW2_PREALLOCATION->{$prealloc}; - return "preallocation=$prealloc"; + return $prealloc; } elsif ($fmt eq 'raw') { $prealloc = $prealloc // 'off'; $prealloc = 'off' if $prealloc eq 'metadata'; @@ -634,7 +634,7 @@ sub preallocation_cmd_option { die "preallocation mode '$prealloc' not supported by format '$fmt'\n" if !$RAW_PREALLOCATION->{$prealloc}; - return "preallocation=$prealloc"; + return $prealloc; } return; @@ -644,19 +644,21 @@ sub preallocation_cmd_option { =head3 qemu_img_create - qemu_img_create($scfg, $fmt, $size, $path) + qemu_img_create($fmt, $size, $path, $options) Create a new qemu image with a specific format C<$format> and size C<$size> for a target C<$path>. +C<$options> currently allows setting the C value + =cut sub qemu_img_create { - my ($scfg, $fmt, $size, $path) = @_; + my ($fmt, $size, $path, $options) = @_; my $cmd = ['/usr/bin/qemu-img', 'create']; - my $prealloc_opt = preallocation_cmd_option($scfg, $fmt); - push @$cmd, '-o', $prealloc_opt if defined($prealloc_opt); + push @$cmd, '-o', "preallocation=$options->{preallocation}" + if defined($options->{preallocation}); push @$cmd, '-f', $fmt, $path, "${size}K"; @@ -667,14 +669,16 @@ sub qemu_img_create { =head3 qemu_img_create_qcow2_backed - qemu_img_create_qcow2_backed($scfg, $path, $backing_path, $backing_format) + qemu_img_create_qcow2_backed($path, $backing_path, $backing_format, $options) Create a new qemu qcow2 image C<$path> using an existing backing image C<$backing_path> with backing_format C<$backing_format>. +C<$options> currently allows setting the C value. + =cut sub qemu_img_create_qcow2_backed { - my ($scfg, $path, $backing_path, $backing_format) = @_; + my ($path, $backing_path, $backing_format, $options) = @_; my $cmd = [ '/usr/bin/qemu-img', @@ -688,10 +692,10 @@ sub qemu_img_create_qcow2_backed { $path, ]; - my $options = $QCOW2_CLUSTERS->{backed}; + my $opts = $QCOW2_CLUSTERS->{backed}; - push @$options, preallocation_cmd_option($scfg, 'qcow2'); - push @$cmd, '-o', join(',', @$options) if @$options > 0; + push @$opts, $options->{preallocation} if defined($options->{preallocation}); + push @$cmd, '-o', join(',', @$opts) if @$opts > 0; run_command($cmd, errmsg => "unable to create image"); } @@ -722,20 +726,21 @@ sub qemu_img_info { =head3 qemu_img_measure - qemu_img_measure($size, $fmt, $timeout, $is_backed) + qemu_img_measure($size, $fmt, $timeout, $options) Returns a json with the maximum size including all metadatas overhead for an image with format C<$fmt> and original size C<$size>Kb. -If the image is backed C<$is_backed>, we use different cluster size informations. + +C<$options> allows specifying qemu-img options that might affect the sizing calculation, such as cluster size. + =cut sub qemu_img_measure { - my ($size, $fmt, $timeout, $is_backed) = @_; + my ($size, $fmt, $timeout, $options) = @_; die "format is missing" if !$fmt; my $cmd = ['/usr/bin/qemu-img', 'measure', '--output=json', '--size', "${size}K", '-O', $fmt]; - if ($is_backed) { - my $options = $QCOW2_CLUSTERS->{backed}; + if ($options) { push $cmd->@*, '-o', join(',', @$options) if @$options > 0; } return PVE::Storage::Common::run_qemu_img_json($cmd, $timeout); @@ -745,20 +750,21 @@ sub qemu_img_measure { =head3 qemu_img_resize - qemu_img_resize($scfg, $path, $format, $size, $timeout) + qemu_img_resize($scfg, $path, $format, $size, $preallocation, $timeout) Resize a qemu image C<$path> with format C<$format> to a target Kb size C<$size>. Default timeout C<$timeout> is 10s if not specified. +C<$preallocation> allows to specify the preallocation option for the resize operation. + =cut sub qemu_img_resize { - my ($scfg, $path, $format, $size, $timeout) = @_; + my ($scfg, $path, $format, $size, $preallocation, $timeout) = @_; die "format is missing" if !$format; - my $prealloc_opt = preallocation_cmd_option($scfg, $format); my $cmd = ['/usr/bin/qemu-img', 'resize']; - push $cmd->@*, "--$prealloc_opt" if $prealloc_opt; + push $cmd->@*, "--preallocation=$preallocation" if $preallocation; push $cmd->@*, '-f', $format, $path, $size; $timeout = 10 if !$timeout; @@ -1067,7 +1073,10 @@ sub clone_image { # Note: we use relative paths, so we need to call chdir before qemu-img eval { local $CWD = $imagedir; - qemu_img_create_qcow2_backed($scfg, $path, "../$basevmid/$basename", $format); + my $options = { + preallocation => preallocation_cmd_opt($scfg, $format), + }; + qemu_img_create_qcow2_backed($path, "../$basevmid/$basename", $format, $options); }; my $err = $@; @@ -1105,7 +1114,10 @@ sub alloc_image { umask $old_umask; die $err if $err; } else { - eval { qemu_img_create($scfg, $fmt, $size, $path) }; + my $preallocation = preallocation_cmd_opt($scfg, $fmt); + my $options = {}; + $options->{preallocation} = $preallocation if $preallocation; + eval { qemu_img_create($fmt, $size, $path, $options) }; if ($@) { unlink $path; rmdir $imagedir; @@ -1122,9 +1134,12 @@ my sub alloc_backed_image { my $path = $class->path($scfg, $volname, $storeid); my ($vmid, $backing_format) = ($class->parse_volname($volname))[2, 6]; + my $preallocation = preallocation_cmd_opt($scfg, $backing_format); + my $options = {}; + $options->{preallocation} = $preallocation if $preallocation; my $backing_volname = get_snap_name($class, $volname, $backing_snap); #qemu_img use relative path from base image for the backing_volname by default - eval { qemu_img_create_qcow2_backed($scfg, $path, $backing_volname, $backing_format) }; + eval { qemu_img_create_qcow2_backed($path, $backing_volname, $backing_format, $options) }; if ($@) { unlink $path; die "$@"; @@ -1371,7 +1386,8 @@ sub volume_resize { my $format = ($class->parse_volname($volname))[6]; - qemu_img_resize($scfg, $path, $format, $size, 10); + my $preallocation = preallocation_cmd_opt($scfg, $format); + qemu_img_resize($path, $format, $size, $preallocation, 10); return undef; } -- 2.39.5 --===============8063657199035307909== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel --===============8063657199035307909==--