[libvirt] [PATCH v2] storage: Allow runtime detection of scrub

Michal Privoznik mprivozn at redhat.com
Wed Feb 15 13:37:55 UTC 2012


Currently, if scrub (used for wiping algorithms) is not present
at compile time, we don't support any other wiping algorithms than
zeroing, even if it was installed later. Switch to runtime detection
instead.
---
diff to v1:
-Add BuildRequires to spec file

 configure.ac                 |   30 ++++--------------------------
 libvirt.spec.in              |    3 +++
 src/storage/storage_driver.c |    4 ----
 3 files changed, 7 insertions(+), 30 deletions(-)

diff --git a/configure.ac b/configure.ac
index 67351d9..5320f71 100644
--- a/configure.ac
+++ b/configure.ac
@@ -213,6 +213,8 @@ AC_PATH_PROG([UDEVSETTLE], [udevsettle], [],
 	[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
 AC_PATH_PROG([MODPROBE], [modprobe], [],
 	[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
+AC_PATH_PROG([SCRUB], [scrub], [],
+	[/sbin:/usr/sbin:/usr/local/sbin:$PATH])
 
 AC_DEFINE_UNQUOTED([DNSMASQ],["$DNSMASQ"],
         [Location or name of the dnsmasq program])
@@ -232,6 +234,8 @@ if test -n "$MODPROBE"; then
   AC_DEFINE_UNQUOTED([MODPROBE],["$MODPROBE"],
         [Location or name of the modprobe program])
 fi
+AC_DEFINE_UNQUOTED([SCRUB],["$SCRUB"],
+        [Location or name of the scrub program (for wiping algorithms)])
 
 dnl Specific dir for HTML output ?
 AC_ARG_WITH([html-dir], [AC_HELP_STRING([--with-html-dir=path],
@@ -2500,32 +2504,6 @@ AM_CONDITIONAL([HAVE_LIBNL], [test "$have_libnl" = "yes"])
 AC_SUBST([LIBNL_CFLAGS])
 AC_SUBST([LIBNL_LIBS])
 
-dnl scrub program for different volume wiping algorithms
-
-AC_ARG_WITH([scrub],
-            AC_HELP_STRING([--with-scrub], [enable different volume wiping algorithms
-                            @<:@default=check@:>@]),
-            [with_macvtap=${withval}],
-            [with_scrub=check])
-
-if test "$with_scrub" != "no"; then
-  AC_PATH_PROG([SCRUB], [scrub])
-  if test -z "$SCRUB" ; then
-    if test "$with_scrub" = "check"; then
-      with_scrub=no
-    else
-      AC_MSG_ERROR([You must install the 'scrub' binary to enable
-                    different volume wiping algorithms])
-    fi
-  else
-    with_scrub=yes
-  fi
-  if test "$with_scrub" = "yes"; then
-    AC_DEFINE_UNQUOTED([SCRUB], ["$SCRUB"],
-                       [Location of the scrub program])
-  fi
-fi
-
 # Only COPYING.LIB is under version control, yet COPYING
 # is included as part of the distribution tarball.
 # Copy one to the other, but only if this is a srcdir-build.
diff --git a/libvirt.spec.in b/libvirt.spec.in
index e48d8b8..3f0f19a 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -513,6 +513,9 @@ BuildRequires: nfs-utils
 # Fedora build root suckage
 BuildRequires: gawk
 
+# For storage wiping with different algorithms
+BuildRequires: scrub
+
 %description
 Libvirt is a C toolkit to interact with the virtualization capabilities
 of recent versions of Linux (and other OSes). The main package includes
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index 9170a17..df0e291 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
@@ -1918,7 +1918,6 @@ storageVolumeWipeInternal(virStorageVolDefPtr def,
     if (algorithm != VIR_STORAGE_VOL_WIPE_ALG_ZERO) {
         const char *alg_char ATTRIBUTE_UNUSED = NULL;
         switch (algorithm) {
-#ifdef SCRUB
         case VIR_STORAGE_VOL_WIPE_ALG_NNSA:
             alg_char = "nnsa";
             break;
@@ -1943,13 +1942,11 @@ storageVolumeWipeInternal(virStorageVolDefPtr def,
         case VIR_STORAGE_VOL_WIPE_ALG_RANDOM:
             alg_char = "random";
             break;
-#endif
         default:
             virStorageReportError(VIR_ERR_INVALID_ARG,
                                   _("unsupported algorithm %d"),
                                   algorithm);
         }
-#ifdef SCRUB
         cmd = virCommandNew(SCRUB);
         virCommandAddArgList(cmd, "-f", "-p", alg_char,
                              def->target.path, NULL);
@@ -1958,7 +1955,6 @@ storageVolumeWipeInternal(virStorageVolDefPtr def,
             goto out;
 
         ret = 0;
-#endif
         goto out;
     } else {
         if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) {
-- 
1.7.3.4




More information about the libvir-list mailing list