]> git.proxmox.com Git - qemu-server.git/commitdiff
only use sparse file scan for files
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 7 Feb 2012 10:55:57 +0000 (11:55 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 7 Feb 2012 10:55:57 +0000 (11:55 +0100)
PVE/VZDump/QemuServer.pm
vmtar.c

index 745ed635f480cf4fadd836fbeb0fb7ae6b9b99e2..6e5bee1fc1a81e29cf477bd372108778a9d613f7 100644 (file)
@@ -382,8 +382,15 @@ sub archive {
 
     my $fh;
 
+    my $sparse = ''; 
+
+    # no sparse file scan for block devices
+    # no sparse file scan when we use compression
+    # but we enable it for files
+
     my @filea = ($conffile, 'qemu-server.conf'); # always first file in tar
     foreach my $di (@{$task->{disks}}) {
+       $sparse = '-s' if !$comp && $di->{type} eq 'file';
        if ($di->{type} eq 'block' || $di->{type} eq 'file') {
            push @filea, $di->{snappath}, $di->{filename};
        } else {
@@ -393,7 +400,7 @@ sub archive {
 
     my $files = join (' ', map { "'$_'" } @filea);
     
-    my $cmd = "/usr/lib/qemu-server/vmtar $files";
+    my $cmd = "/usr/lib/qemu-server/vmtar $sparse $files";
     my $bwl = $opts->{bwlimit}*1024; # bandwidth limit for cstream
     $cmd .= "|cstream -t $bwl" if $opts->{bwlimit};
     $cmd .= "|$comp" if $comp;
diff --git a/vmtar.c b/vmtar.c
index f94aee60d898e244f52ed4918a66f511a980c261..8a9ab147c7cd25504e9ed844516bb11a1c27b0c9 100644 (file)
--- a/vmtar.c
+++ b/vmtar.c
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2007-2009 Proxmox Server Solutions GmbH
+    Copyright (C) 2007-2012 Proxmox Server Solutions GmbH
 
     Copyright: vzdump is under GNU GPL, the GNU General Public License.
 
@@ -429,19 +429,24 @@ int
 main (int argc, char **argv)
 {
   struct sigaction sa;
+  int sparse = 0;
 
   while (1) {
     int option_index = 0;
     static struct option long_options[] = {
+      {"sparse", 0, 0, 's'},
       {"output", 1, 0, 'o'},
       {0, 0, 0, 0}
     };
 
-    char c = getopt_long (argc, argv, "o:", long_options, &option_index);
+    char c = getopt_long (argc, argv, "so:", long_options, &option_index);
     if (c == -1)
       break;
 
     switch (c) {
+    case 's':
+      sparse = 1;
+      break;
     case 'o':
       outname = optarg;
       break;
@@ -525,9 +530,16 @@ main (int argc, char **argv)
     time_t ctime = fs.st_mtime;
 
     struct sp_array *ma = sparray_new();
-    if (!scan_sparse_file (fd, ma)) {
-      fprintf (stderr, "scanning '%s' failed\n", source); 
-      exit (-1);
+    if (sparse) {
+           if (!scan_sparse_file (fd, ma)) {
+                   fprintf (stderr, "scanning '%s' failed\n", source); 
+                   exit (-1);
+           }
+    } else {
+           off_t  file_size = fs.st_size;
+           sparray_add (ma, 0, file_size);
+           ma->real_size = file_size;
+           ma->effective_size = file_size;
     }
 
     dump_header (wbuf, archivename, ctime, ma);