mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
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 <permissions> and <timestamps> 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.
This commit is contained in:
parent
a0d88ed4e7
commit
bce671b731
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user