static virStorageVolPtr parallelsStorageVolLookupByKey(virConnectPtr conn, const char *key) { parallelsConnPtr privconn = conn->privateData; size_t i; virStorageVolPtr ret = NULL; parallelsDriverLock(privconn); for (i = 0; i < privconn->pools.count; i++) { virStoragePoolObjLock(privconn->pools.objs[i]); if (virStoragePoolObjIsActive(privconn->pools.objs[i])) { virStorageVolDefPtr privvol = virStorageVolDefFindByKey(privconn->pools.objs[i], key); if (privvol) { ret = virGetStorageVol(conn, privconn->pools.objs[i]->def->name, privvol->name, privvol->key, NULL, NULL); virStoragePoolObjUnlock(privconn->pools.objs[i]); break; } } virStoragePoolObjUnlock(privconn->pools.objs[i]); } parallelsDriverUnlock(privconn); if (!ret) virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching key '%s'"), key); return ret; }
static int virStorageBackendDiskMakeVol(virStoragePoolObjPtr pool, size_t ntok ATTRIBUTE_UNUSED, char **const groups, void *data) { /* * Ignore normal+metadata, and logical+metadata partitions * since they're basically internal book-keeping regions * we have no control over. Do keep extended+metadata though * because that's the MS-DOS extended partition region we * need to be able to view/create/delete */ if ((STREQ(groups[1], "normal") || STREQ(groups[1], "logical")) && STREQ(groups[2], "metadata")) return 0; /* Remaining data / metadata parts get turn into volumes... */ if (STREQ(groups[2], "metadata") || STREQ(groups[2], "data")) { virStorageVolDefPtr vol = data; if (vol) { /* We're searching for a specific vol only */ if (vol->key) { if (STRNEQ(vol->key, groups[0])) return 0; } else if (virStorageVolDefFindByKey(pool, groups[0]) != NULL) { /* If no key, the volume must be newly created. If groups[0] * isn't already a volume, assume it's the path we want */ return 0; } } return virStorageBackendDiskMakeDataVol(pool, groups, vol); } else if (STREQ(groups[2], "free")) { /* ....or free space extents */ return virStorageBackendDiskMakeFreeExtent(pool, groups); } else { /* This code path should never happen unless someone changed * libvirt_parthelper forgot to change this code */ return -1; } }