]> xenbits.xensource.com Git - libvirt.git/commitdiff
logical: Need to overwrite/clear more than just first 512 bytes
authorJohn Ferlan <jferlan@redhat.com>
Fri, 24 Mar 2017 16:25:27 +0000 (12:25 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 27 Mar 2017 16:48:05 +0000 (12:48 -0400)
https://bugzilla.redhat.com/show_bug.cgi?id=1430679

As it turns out some file headers (e.g. ext4) may be larger/longer than
the 512 bytes of zeros being written prior to a pvcreate, so let's write
out 2048 bytes similar to how the pvcreate sources would peek at the first
4 sectors of the device.

Make sure there is at enough bytes on the device to clear before doing
doing the clear - just to be sure.

src/storage/storage_backend_logical.c

index 29d63b1be1f786c3d9cf3a9ba25078b079cdc6a8..9ca6fd43ba961e70f07aac06b5da60521a296f8f 100644 (file)
@@ -93,7 +93,8 @@ static int
 virStorageBackendLogicalInitializeDevice(const char *path)
 {
     int fd = -1;
-    char zeros[PV_BLANK_SECTOR_SIZE] = {0};
+    char zeros[4 * PV_BLANK_SECTOR_SIZE] = {0};
+    off_t size;
     int ret = -1;
     virCommandPtr pvcmd = NULL;
 
@@ -107,6 +108,25 @@ virStorageBackendLogicalInitializeDevice(const char *path)
         return -1;
     }
 
+    if ((size = lseek(fd, 0, SEEK_END)) == (off_t)-1) {
+        virReportSystemError(errno,
+                             _("failed to seek to end of %s"), path);
+        goto cleanup;
+    }
+
+    if (size < 4 * PV_BLANK_SECTOR_SIZE) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+                       _("cannot initialize '%s' detected size='%lu' less "
+                         "than minimum required='%d"),
+                         path, size, 4 * PV_BLANK_SECTOR_SIZE);
+        goto cleanup;
+    }
+    if ((size = lseek(fd, 0, SEEK_SET)) == (off_t)-1) {
+        virReportSystemError(errno,
+                             _("failed to seek to start of %s"), path);
+        goto cleanup;
+    }
+
     if (safewrite(fd, zeros, sizeof(zeros)) < 0) {
         virReportSystemError(errno, _("cannot clear device header of '%s'"),
                              path);