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(a)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