Create/Use API to "walk" the storage pool object volume list. Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> --- src/conf/virstorageobj.c | 10 ++++++++++ src/conf/virstorageobj.h | 4 ++++ src/libvirt_private.syms | 1 + src/storage/storage_backend_disk.c | 26 +++++++++++++++----------- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index cc3464e..14feecb 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -343,6 +343,16 @@ virStoragePoolObjGetVolumesCount(virStoragePoolObjPtr obj) virStorageVolDefPtr +virStoragePoolObjForEachVolume(virStoragePoolObjPtr obj, + size_t curidx) +{ + if (curidx < obj->volumes.count) + return obj->volumes.objs[curidx]; + return NULL; +} + + +virStorageVolDefPtr virStorageVolDefFindByKey(virStoragePoolObjPtr obj, const char *key) { diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index d27ff57..df0b4ae 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -139,6 +139,10 @@ size_t virStoragePoolObjGetVolumesCount(virStoragePoolObjPtr obj); virStorageVolDefPtr +virStoragePoolObjForEachVolume(virStoragePoolObjPtr obj, + size_t curidx); + +virStorageVolDefPtr virStorageVolDefFindByKey(virStoragePoolObjPtr obj, const char *key); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 03777a3..fe0e203 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1014,6 +1014,7 @@ virStoragePoolObjDecrAsyncjobs; virStoragePoolObjDeleteDef; virStoragePoolObjFindByName; virStoragePoolObjFindByUUID; +virStoragePoolObjForEachVolume; virStoragePoolObjGetAsyncjobs; virStoragePoolObjGetAutostart; virStoragePoolObjGetConfigFile; diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 0bf5567..0ec601e 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -192,12 +192,11 @@ virStorageBackendDiskMakeDataVol(virStoragePoolObjPtr pool, /* Find the extended partition and increase the allocation value */ if (vol->source.partType == VIR_STORAGE_VOL_DISK_TYPE_LOGICAL) { size_t i; + virStorageVolDefPtr voldef; - for (i = 0; i < pool->volumes.count; i++) { - if (pool->volumes.objs[i]->source.partType == - VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) { - pool->volumes.objs[i]->target.allocation += - vol->target.allocation; + for (i = 0; (voldef = virStoragePoolObjForEachVolume(pool, i)); i++) { + if (voldef->source.partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) { + voldef->target.allocation += vol->target.allocation; break; } } @@ -533,8 +532,10 @@ virStorageBackendDiskPartTypeToCreate(virStoragePoolObjPtr pool) can't be more than 3 to create a new primary partition */ size_t i; int count = 0; - for (i = 0; i < pool->volumes.count; i++) { - int partType = pool->volumes.objs[i]->source.partType; + virStorageVolDefPtr voldef; + + for (i = 0; (voldef = virStoragePoolObjForEachVolume(pool, i)); i++) { + int partType = voldef->source.partType; if (partType == VIR_STORAGE_VOL_DISK_TYPE_PRIMARY || partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) count++; @@ -553,6 +554,8 @@ virStorageBackendDiskPartFormat(virStoragePoolObjPtr pool, char** partFormat) { size_t i; + virStorageVolDefPtr voldef; + if (pool->def->source.format == VIR_STORAGE_POOL_DISK_DOS) { const char *partedFormat; partedFormat = virStoragePartedFsTypeToString(vol->target.format); @@ -563,8 +566,8 @@ virStorageBackendDiskPartFormat(virStoragePoolObjPtr pool, } if (vol->target.format == VIR_STORAGE_VOL_DISK_EXTENDED) { /* make sure we don't have an extended partition already */ - for (i = 0; i < pool->volumes.count; i++) { - if (pool->volumes.objs[i]->source.partType == + for (i = 0; (voldef = virStoragePoolObjForEachVolume(pool, i)); i++) { + if (voldef->source.partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("extended partition already exists")); @@ -585,8 +588,9 @@ virStorageBackendDiskPartFormat(virStoragePoolObjPtr pool, break; case VIR_STORAGE_VOL_DISK_TYPE_LOGICAL: /* make sure we have an extended partition */ - for (i = 0; i < pool->volumes.count; i++) { - if (pool->volumes.objs[i]->source.partType == + for (i = 0; (voldef = virStoragePoolObjForEachVolume(pool, i)); + i++) { + if (voldef->source.partType == VIR_STORAGE_VOL_DISK_TYPE_EXTENDED) { if (virAsprintf(partFormat, "logical %s", partedFormat) < 0) -- 2.9.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list