[libvirt] [PATCH 5/8] storage: Add param to check whether we can write a disk label

John Ferlan jferlan at redhat.com
Fri Oct 2 13:41:35 UTC 2015


Modify virStorageBackendDiskValidLabel to add a 'writelabel' parameter.
While initially for the purpose of determining whether the label should
be written during DiskBuild, a future use during DiskStart could determine
whether the pool should be started using the label found. Augment the
error messages also to give a hint as to what someone may need to do
or why the command failed.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/storage/storage_backend_disk.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c
index da2a4d4..6f9fab1 100644
--- a/src/storage/storage_backend_disk.c
+++ b/src/storage/storage_backend_disk.c
@@ -435,24 +435,40 @@ virStorageBackendDiskFindLabel(const char* device)
  * Determine whether the label on the disk is valid or in a known format
  * for the purpose of rewriting the label during build
  *
+ * When 'writelabel' is true, if we find a valid disk label on the device,
+ * then we shouldn't be attempting to write as the volume may contain
+ * data. Force the usage of the overwrite flag to the build command in
+ * order to be certain. When the disk label is unrecognized, then it
+ * should be safe to write.
+ *
  * Return: True if it's OK
  *         False if something's wrong
  */
 static bool
-virStorageBackendDiskValidLabel(const char *device)
+virStorageBackendDiskValidLabel(const char *device,
+                                bool writelabel)
 {
     bool valid = false;
     int check;
 
     check = virStorageBackendDiskFindLabel(device);
     if (check > 0) {
-        valid = true;
+        if (writelabel)
+            valid = true;
+        else
+            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                           _("Unrecognized disk label found, requires build"));
     } else if (check < 0) {
         virReportError(VIR_ERR_OPERATION_FAILED, "%s",
-                       _("Error checking for disk label"));
+                       _("Error checking for disk label, failed to get "
+                         "disk partition information"));
     } else {
-        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                       _("Disk label already present"));
+        if (writelabel)
+            virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                           _("Valid disk label already present, "
+                             "requires --overwrite"));
+        else
+            valid = true;
     }
     return valid;
 }
@@ -481,7 +497,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
         ok_to_mklabel = true;
     else
         ok_to_mklabel = virStorageBackendDiskValidLabel(
-                                            pool->def->source.devices[0].path);
+                                            pool->def->source.devices[0].path,
+                                            true);
 
     if (ok_to_mklabel) {
         /* eg parted /dev/sda mklabel --script msdos */
-- 
2.1.0




More information about the libvir-list mailing list