[PATCH pve-storage 02/10] common: add qemu_img_create an preallocation_cmd_option

Alexandre Derumier alexandre.derumier at groupe-cyllene.com
Fri Jul 4 08:44:58 CEST 2025


Signed-off-by: Alexandre Derumier <alexandre.derumier at groupe-cyllene.com>
---
 src/PVE/Storage/Common.pm | 52 +++++++++++++++++++++++++++++++++++++++
 src/PVE/Storage/Plugin.pm | 47 +----------------------------------
 2 files changed, 53 insertions(+), 46 deletions(-)

diff --git a/src/PVE/Storage/Common.pm b/src/PVE/Storage/Common.pm
index 89a70f4..29f2e52 100644
--- a/src/PVE/Storage/Common.pm
+++ b/src/PVE/Storage/Common.pm
@@ -5,12 +5,26 @@ use warnings;
 
 use PVE::JSONSchema;
 use PVE::Syscall;
+use PVE::Tools qw(run_command);
 
 use constant {
     FALLOC_FL_KEEP_SIZE => 0x01, # see linux/falloc.h
     FALLOC_FL_PUNCH_HOLE => 0x02, # see linux/falloc.h
 };
 
+our $QCOW2_PREALLOCATION = {
+    off => 1,
+    metadata => 1,
+    falloc => 1,
+    full => 1,
+};
+
+our $RAW_PREALLOCATION = {
+    off => 1,
+    falloc => 1,
+    full => 1,
+};
+
 =pod
 
 =head1 NAME
@@ -110,4 +124,42 @@ sub deallocate : prototype($$$) {
     }
 }
 
+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;
+}
+
+sub qemu_img_create {
+    my ($scfg, $fmt, $size, $path) = @_;
+
+    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, '-f', $fmt, $path, "${size}K";
+
+    run_command($cmd, errmsg => "unable to create image");
+}
+
 1;
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index c2f376b..80bb077 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -38,19 +38,6 @@ our @SHARED_STORAGE = (
     'iscsi', 'nfs', 'cifs', 'rbd', 'cephfs', 'iscsidirect', 'zfs', 'drbd', '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(
@@ -606,31 +593,6 @@ 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)
@@ -969,14 +931,7 @@ sub alloc_image {
         umask $old_umask;
         die $err if $err;
     } else {
-        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, '-f', $fmt, $path, "${size}K";
-
-        eval { run_command($cmd, errmsg => "unable to create image"); };
+        eval { PVE::Storage::Common::qemu_img_create($scfg, $fmt, $size, $path) };
         if ($@) {
             unlink $path;
             rmdir $imagedir;
-- 
2.39.5




More information about the pve-devel mailing list