New API: guestfs_zero_device to zero whole devices.
authorRichard Jones <rjones@redhat.com>
Wed, 31 Mar 2010 12:19:34 +0000 (13:19 +0100)
committerRichard Jones <rjones@redhat.com>
Wed, 31 Mar 2010 12:19:34 +0000 (13:19 +0100)
daemon/zero.c
src/MAX_PROC_NR
src/generator.ml

index 4d06505..6e62e15 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -55,3 +56,39 @@ do_zero (const char *device)
 
   return 0;
 }
 
   return 0;
 }
+
+int
+do_zero_device (const char *device)
+{
+  int64_t size = do_blockdev_getsize64 (device);
+  if (size == -1)
+    return -1;
+
+  int fd = open (device, O_WRONLY);
+  if (fd == -1) {
+    reply_with_perror ("%s", device);
+    return -1;
+  }
+
+  char buf[1024*1024];
+  memset (buf, 0, sizeof buf);
+
+  while (size > 0) {
+    size_t n = size > sizeof buf ? sizeof buf : size;
+    ssize_t r = write (fd, buf, n);
+    if (r == -1) {
+      reply_with_perror ("write: %s (with %" PRId64 " bytes left to write)",
+                         device, size);
+      close (fd);
+      return -1;
+    }
+    size -= r;
+  }
+
+  if (close (fd) == -1) {
+    reply_with_perror ("close: %s", device);
+    return -1;
+  }
+
+  return 0;
+}
index 2c36bbd..9be0dc9 100644 (file)
@@ -1 +1 @@
-227
+228
index f519c4d..f206be1 100755 (executable)
@@ -2294,7 +2294,7 @@ How many blocks are zeroed isn't specified (but it's I<not> enough
 to securely wipe the device).  It should be sufficient to remove
 any partition tables, filesystem superblocks and so on.
 
 to securely wipe the device).  It should be sufficient to remove
 any partition tables, filesystem superblocks and so on.
 
-See also: C<guestfs_scrub_device>.");
+See also: C<guestfs_zero_device>, C<guestfs_scrub_device>.");
 
   ("grub_install", (RErr, [Pathname "root"; Device "device"]), 86, [],
    (* Test disabled because grub-install incompatible with virtio-blk driver.
 
   ("grub_install", (RErr, [Pathname "root"; Device "device"]), 86, [],
    (* Test disabled because grub-install incompatible with virtio-blk driver.
@@ -4346,6 +4346,15 @@ or file C<src> to another destination device or file C<dest>.
 Note this will fail if the source is too short or if the destination
 is not large enough.");
 
 Note this will fail if the source is too short or if the destination
 is not large enough.");
 
+  ("zero_device", (RErr, [Device "device"]), 228, [DangerWillRobinson],
+   [InitBasicFSonLVM, Always, TestRun (
+      [["zero_device"; "/dev/VG/LV"]])],
+   "write zeroes to an entire device",
+   "\
+This command writes zeroes over the entire C<device>.  Compare
+with C<guestfs_zero> which just zeroes the first few blocks of
+a device.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions