From a9a94d59f34488d6ce851ef8d9bf92be964b41d7 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 7 Feb 2012 11:55:57 +0100 Subject: [PATCH] only use sparse file scan for files --- PVE/VZDump/QemuServer.pm | 9 ++++++++- vmtar.c | 22 +++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/PVE/VZDump/QemuServer.pm b/PVE/VZDump/QemuServer.pm index 745ed635..6e5bee1f 100644 --- a/PVE/VZDump/QemuServer.pm +++ b/PVE/VZDump/QemuServer.pm @@ -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 f94aee60..8a9ab147 100644 --- 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);