From bce671b731cede997b94ebe8d76aa07d903c05a0 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Thu, 22 Jan 2015 09:12:04 -0500 Subject: [PATCH] storage: Adjust how to refresh extended partition disk data During virStorageBackendDiskMakeDataVol processing, if we find an extended partition, then handle it specially when updating the capacity/allocation rather than calling virStorageBackendUpdateVolInfo. As it turns out, once a logical partition exists, any attempt to refresh the pool or after libvirtd restart/reload will result in a failure to open the extended partition device resulting in the inability to start the pool. The downside to this is we will lose the and for the extended partition upon subsequent restart, refresh, reload since the stat() in virStorageBackendUpdateVolTargetInfoFD will not be called. However, since it's really only a container and shouldn't directly be used for storage that seems reasonable. Therefore, only use the existing code that already had a comment about getting the allocation wrong for extended partitions for just the setting of the extended partition data. --- src/storage/storage_backend.c | 4 ++++ src/storage/storage_backend_disk.c | 32 +++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 4e6dcc3c14..a67d50cb33 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1438,6 +1438,10 @@ virStorageBackendVolOpen(const char *path, struct stat *sb, VIR_WARN("ignoring missing file '%s'", path); return -2; } + if (errno == ENXIO && noerror) { + VIR_WARN("ignoring missing fifo '%s'", path); + return -2; + } virReportSystemError(errno, _("cannot open volume '%s'"), path); return -1; diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 31b6025d1e..233e293dd5 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -110,11 +110,6 @@ virStorageBackendDiskMakeDataVol(virStoragePoolObjPtr pool, return -1; } - /* Refresh allocation/capacity/perms */ - if (virStorageBackendUpdateVolInfo(vol, true, false, - VIR_STORAGE_VOL_OPEN_DEFAULT) < 0) - return -1; - /* set partition type */ if (STREQ(groups[1], "normal")) vol->source.partType = VIR_STORAGE_VOL_DISK_TYPE_PRIMARY; @@ -127,10 +122,29 @@ virStorageBackendDiskMakeDataVol(virStoragePoolObjPtr pool, vol->type = VIR_STORAGE_VOL_BLOCK; - /* The above gets allocation wrong for - * extended partitions, so overwrite it */ - vol->target.allocation = vol->target.capacity = - (vol->source.extents[0].end - vol->source.extents[0].start); + /* Refresh allocation/capacity/perms + * + * For an extended partition, virStorageBackendUpdateVolInfo will + * return incorrect values for allocation and capacity, so use the + * extent information captured above instead. + * + * Also once a logical partition exists or another primary partition + * after an extended partition is created an open on the extended + * partition will fail, so pass the NOERROR flag and only error if a + * -1 was returned indicating some other error than an open error. + */ + if (vol->source.partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) { + if (virStorageBackendUpdateVolInfo(vol, true, false, + VIR_STORAGE_VOL_OPEN_DEFAULT | + VIR_STORAGE_VOL_OPEN_NOERROR) == -1) + return -1; + vol->target.allocation = vol->target.capacity = + (vol->source.extents[0].end - vol->source.extents[0].start); + } else { + if (virStorageBackendUpdateVolInfo(vol, true, false, + VIR_STORAGE_VOL_OPEN_DEFAULT) < 0) + return -1; + } if (STRNEQ(groups[2], "metadata")) pool->def->allocation += vol->target.allocation; -- GitLab