[pve-devel] [PATCH qemu-server v2 2/2] remove legacy sparsecp

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Jun 14 15:52:19 CEST 2017


sparsecp gets only used in qmextract, which is part of the old backup
method (pre PVE 2.3).
Do not remove qmextract for now people could still have backups from
< PVE 2.3 around.
They could be restored manually, but we shouldn't make restoring
complicated. Thus replace sparsecp with `cp sparse=always`.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---

changes v1 -> v2:
* new in v2

 Makefile   |   6 +--
 qmextract  |   4 +-
 sparsecp.c | 132 -----------------------------------------------------------
 utils.c    | 135 -------------------------------------------------------------
 4 files changed, 3 insertions(+), 274 deletions(-)
 delete mode 100644 sparsecp.c
 delete mode 100644 utils.c

diff --git a/Makefile b/Makefile
index 17578d9..c96063f 100644
--- a/Makefile
+++ b/Makefile
@@ -36,9 +36,6 @@ all:
 dinstall: deb
 	dpkg -i ${DEB}
 
-sparsecp: sparsecp.c utils.c
-	gcc ${CFLAGS} -o sparsecp sparsecp.c
-
 qm.bash-completion:
 	PVE_GENERATING_DOCS=1 perl -I. -T -e "use PVE::CLI::qm; PVE::CLI::qm->generate_bash_completions();" >$@.tmp
 	mv $@.tmp $@
@@ -47,7 +44,7 @@ qmrestore.bash-completion:
 	PVE_GENERATING_DOCS=1 perl -I. -T -e "use PVE::CLI::qmrestore; PVE::CLI::qmrestore->generate_bash_completions();" >$@.tmp
 	mv $@.tmp $@
 
-PKGSOURCES=qm qm.1 qmrestore qmrestore.1 qmextract sparsecp qm.conf.5 qm.bash-completion qmrestore.bash-completion
+PKGSOURCES=qm qm.1 qmrestore qmrestore.1 qmextract qm.conf.5 qm.bash-completion qmrestore.bash-completion
 
 .PHONY: install
 install: ${PKGSOURCES}
@@ -69,7 +66,6 @@ install: ${PKGSOURCES}
 	install -m 0755 pve-bridge ${DESTDIR}${VARLIBDIR}/pve-bridge
 	install -m 0755 pve-bridge-hotplug ${DESTDIR}${VARLIBDIR}/pve-bridge-hotplug
 	install -m 0755 pve-bridgedown ${DESTDIR}${VARLIBDIR}/pve-bridgedown
-	install -s -m 0755 sparsecp ${DESTDIR}${LIBDIR}
 	install -D -m 0644 modules-load.conf ${DESTDIR}/etc/modules-load.d/qemu-server.conf
 	install -m 0755 qmextract ${DESTDIR}${LIBDIR}
 	install -m 0644 qm.1 ${DESTDIR}/${MAN1DIR}
diff --git a/qmextract b/qmextract
index b660b91..1466a58 100755
--- a/qmextract
+++ b/qmextract
@@ -191,8 +191,8 @@ sub extract_archive {
 	exec 'dd', 'ibs=256K', 'obs=256K', "of=$path";
 	die "couldn't exec dd: $!\n";
     } else {
-	exec '/usr/lib/qemu-server/sparsecp', $path;
-	die "couldn't exec sparsecp: $!\n";
+	exec '/bin/cp', '--sparse=always', '/dev/stdin', $path;
+	die "couldn't exec cp: $!\n";
     }
 }
 
diff --git a/sparsecp.c b/sparsecp.c
deleted file mode 100644
index 950a27c..0000000
--- a/sparsecp.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
-    Copyright (C) 2007-2009 Proxmox Server Solutions GmbH
-
-    Copyright: vzdump is under GNU GPL, the GNU General Public License.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; version 2 dated June, 1991.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the
-    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-    MA 02110-1301, USA.
-
-    Author: Dietmar Maurer <dietmar at proxmox.com>
-
-*/
-
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <stdint.h>
-#include <getopt.h>
-#include <signal.h>
-
-#include "utils.c"
-
-#define BLOCKSIZE 512*8
-
-static char *outname;
-
-static void 
-cleanup (void)
-{
-  if (outname) 
-    unlink (outname);
-}
-
-void term_handler()
-{
-  fprintf (stderr, "received signal - terminate process\n");
-  exit(-1);
-}
-
-size_t
-sparse_cp (int infd, int outfd) 
-{
-  size_t total = 0;
-  size_t count;
-  char buffer[BLOCKSIZE];
-  int last_write_made_hole = 0;
-
-  while ((count = safe_read (infd, buffer, sizeof (buffer))) > 0) {
-    if (block_is_zero (buffer, count)) {
-
-      if (lseek (outfd, count, SEEK_CUR) < 0) {
-	perror ("cannot lseek\n");
-	exit (-1);
-      }
-      last_write_made_hole = 1;
-    } else {
-      full_write (outfd, buffer, count);
-      last_write_made_hole = 0;
-    }
-    total += count;
-  }
-
-  if (last_write_made_hole) {
-    if (ftruncate (outfd, total) < 0) {
-      perror ("cannot ftruncate\n");
-      exit (-1);
-    }
-  }
-
-  return total;
-}
-
-int
-main (int argc, char **argv)
-{
-  struct sigaction sa;
-
-  if (argc != 2) {
-    fprintf (stderr, "wrong number of arguments\n");
-    exit (-1);
-  }
-
-  time_t starttime = time(NULL);
-
-  outname = argv[1];
-
-  int outfd;
-
-  if ((outfd = open(outname, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
-    fprintf (stderr, "unable to open file '%s' - %s\n", 
-	     outname, strerror (errno));
-    exit (-1);
-  }
-  atexit(cleanup);
-
-  setsig(&sa, SIGINT, term_handler, SA_RESTART);
-  setsig(&sa, SIGQUIT, term_handler, SA_RESTART);
-  setsig(&sa, SIGTERM, term_handler, SA_RESTART);
-  setsig(&sa, SIGPIPE, term_handler, SA_RESTART);
-
-  size_t total = sparse_cp (0, outfd);
-
-  close (outfd);
-
-  time_t delay = time(NULL) - starttime;
-  if (delay <= 0) delay = 1;
-
-  fprintf (stderr, "%zu bytes copied, %zd s, %.2f MiB/s\n", total, delay,
-	   (total/(1024*1024))/(float)delay);
-
-  outname = NULL;
-
-  exit (0);
-}
diff --git a/utils.c b/utils.c
deleted file mode 100644
index c69e0ef..0000000
--- a/utils.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-    Copyright (C) 2007-2009 Proxmox Server Solutions GmbH
-
-    Copyright: vzdump is under GNU GPL, the GNU General Public License.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; version 2 dated June, 1991.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the
-    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-    MA 02110-1301, USA.
-
-    Author: Dietmar Maurer <dietmar at proxmox.com>
-
-*/
-
-#define _GNU_SOURCE
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <string.h>
-#include <signal.h>
-
-/* Set a signal handler */
-static void 
-setsig (struct sigaction *sa, int sig, void (*fun)(int), int flags)
-{
-  sa->sa_handler = fun;
-  sa->sa_flags = flags;
-  sigemptyset(&sa->sa_mask);
-  sigaction(sig, sa, NULL);
-}
-
-int
-block_is_zero (char const *buffer, size_t size)
-{
-  while (size--)
-    if (*buffer++)
-      return 0;
-
-  return 1;
-}
-
-ssize_t 
-safe_read(int fd, char *buf, size_t count)
-{
-  ssize_t n;
-
-  do {
-    n = read(fd, buf, count);
-  } while (n < 0 && errno == EINTR);
-
-  return n;
-}
-
-int 
-full_read(int fd, char *buf, size_t len)
-{
-  ssize_t n;
-  size_t total;
-
-  total = 0;
-
-  while (len > 0) {
-    n = safe_read(fd, buf, len);
-
-    if (n == 0)
-	    return total;
-
-    if (n < 0)
-	    break;
-
-    buf += n;
-    total += n;
-    len -= n;
-  }
-
-  if (len) {
-	  fprintf (stderr, "ERROR: incomplete read detected\n");
-	  exit (-1);
-  }
-
-  return total;
-}
-
-ssize_t 
-safe_write(int fd, char *buf, size_t count)
-{
-  ssize_t n;
-
-  do {
-    n = write(fd, buf, count);
-  } while (n < 0 && errno == EINTR);
-
-  return n;
-}
-
-int 
-full_write(int fd, char *buf, size_t len)
-{
-  ssize_t n;
-  size_t total;
-
-  total = 0;
-
-  while (len > 0) {
-    n = safe_write(fd, buf, len);
-
-    if (n < 0)
-      break;
-
-    buf += n;
-    total += n;
-    len -= n;
-  }
-
-  if (len) {
-    fprintf (stderr, "ERROR: incomplete write detected\n");
-    exit (-1);
-  }
-
-  return total;
-}
-- 
2.11.0





More information about the pve-devel mailing list