diff --git a/src/vbox/vbox_storage.c b/src/vbox/vbox_storage.c index 45090ebc66f2cfffba8dea64e792bb2daaeea1ee..e96d159eb032f84c303af9fea5567b586456a982 100644 --- a/src/vbox/vbox_storage.c +++ b/src/vbox/vbox_storage.c @@ -690,3 +690,59 @@ int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags) vboxIIDUnalloc(&hddIID); return ret; } + +int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info) +{ + vboxGlobalData *data = vol->conn->privateData; + IHardDisk *hardDisk = NULL; + unsigned char uuid[VIR_UUID_BUFLEN]; + PRUint32 hddstate; + PRUint64 hddLogicalSize = 0; + PRUint64 hddActualSize = 0; + vboxIIDUnion hddIID; + nsresult rc; + int ret = -1; + + if (!data->vboxObj) { + return ret; + } + + if (!info) + return ret; + + if (virUUIDParse(vol->key, uuid) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("Could not parse UUID from '%s'"), vol->key); + return ret; + } + + VBOX_IID_INITIALIZE(&hddIID); + vboxIIDFromUUID(&hddIID, uuid); + rc = gVBoxAPI.UIVirtualBox.GetHardDiskByIID(data->vboxObj, &hddIID, &hardDisk); + if (NS_FAILED(rc)) + goto cleanup; + + gVBoxAPI.UIMedium.GetState(hardDisk, &hddstate); + if (hddstate == MediaState_Inaccessible) + goto cleanup; + + info->type = VIR_STORAGE_VOL_FILE; + + gVBoxAPI.UIHardDisk.GetLogicalSizeInByte(hardDisk, &hddLogicalSize); + info->capacity = hddLogicalSize; + + gVBoxAPI.UIMedium.GetSize(hardDisk, &hddActualSize); + info->allocation = hddActualSize; + + ret = 0; + + VIR_DEBUG("Storage Volume Name: %s", vol->name); + VIR_DEBUG("Storage Volume Type: %s", info->type == VIR_STORAGE_VOL_BLOCK ? "Block" : "File"); + VIR_DEBUG("Storage Volume Capacity: %llu", info->capacity); + VIR_DEBUG("Storage Volume Allocation: %llu", info->allocation); + + cleanup: + VBOX_MEDIUM_RELEASE(hardDisk); + vboxIIDUnalloc(&hddIID); + return ret; +} diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 71dbeddaeb0bba268771f4af2b36d42ecbde7835..5293710b76fc234533fc66af65114ed5424c03bc 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -2033,76 +2033,6 @@ _registerDomainEvent(virHypervisorDriverPtr driver) * The Storage Functions here on */ -static int -vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info) -{ - VBOX_OBJECT_CHECK(vol->conn, int, -1); - IHardDisk *hardDisk = NULL; - unsigned char uuid[VIR_UUID_BUFLEN]; - vboxIID hddIID = VBOX_IID_INITIALIZER; - nsresult rc; - - if (!info) - return ret; - - if (virUUIDParse(vol->key, uuid) < 0) { - virReportError(VIR_ERR_INVALID_ARG, - _("Could not parse UUID from '%s'"), vol->key); - return ret; - } - - vboxIIDFromUUID(&hddIID, uuid); -#if VBOX_API_VERSION < 4000000 - rc = data->vboxObj->vtbl->GetHardDisk(data->vboxObj, hddIID.value, &hardDisk); -#elif VBOX_API_VERSION >= 4000000 && VBOX_API_VERSION < 4002000 - rc = data->vboxObj->vtbl->FindMedium(data->vboxObj, hddIID.value, - DeviceType_HardDisk, &hardDisk); -#else - rc = data->vboxObj->vtbl->OpenMedium(data->vboxObj, hddIID.value, - DeviceType_HardDisk, AccessMode_ReadWrite, - PR_FALSE, &hardDisk); -#endif /* VBOX_API_VERSION >= 4000000 */ - if (NS_SUCCEEDED(rc)) { - PRUint32 hddstate; - - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetState, &hddstate); - if (hddstate != MediaState_Inaccessible) { -#if VBOX_API_VERSION < 4000000 - PRUint64 hddLogicalSize; - PRUint64 hddActualSize; -#else /* VBOX_API_VERSION >= 4000000 */ - PRInt64 hddLogicalSize; - PRInt64 hddActualSize; -#endif /* VBOX_API_VERSION >= 4000000 */ - - info->type = VIR_STORAGE_VOL_FILE; - - hardDisk->vtbl->GetLogicalSize(hardDisk, &hddLogicalSize); -#if VBOX_API_VERSION < 4000000 - info->capacity = hddLogicalSize * 1024 * 1024; /* MB => Bytes */ -#else /* VBOX_API_VERSION >= 4000000 */ - info->capacity = hddLogicalSize; -#endif /* VBOX_API_VERSION >= 4000000 */ - - VBOX_MEDIUM_FUNC_ARG1(hardDisk, GetSize, &hddActualSize); - info->allocation = hddActualSize; - - ret = 0; - - VIR_DEBUG("Storage Volume Name: %s", vol->name); - VIR_DEBUG("Storage Volume Type: %s", info->type == VIR_STORAGE_VOL_BLOCK ? "Block" : "File"); - VIR_DEBUG("Storage Volume Capacity: %llu", info->capacity); - VIR_DEBUG("Storage Volume Allocation: %llu", info->allocation); - } - - VBOX_MEDIUM_RELEASE(hardDisk); - } - - vboxIIDUnalloc(&hddIID); - - return ret; -} - static char *vboxStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags) { VBOX_OBJECT_CHECK(vol->conn, char *, NULL); @@ -4407,6 +4337,19 @@ static nsresult _mediumGetName(IMedium *medium, PRUnichar **name) return medium->vtbl->GetName(medium, name); } +static nsresult _mediumGetSize(IMedium *medium, PRUint64 *uSize) +{ +#if VBOX_API_VERSION < 4000000 + return medium->vtbl->GetSize(medium, uSize); +#else /* VBOX_API_VERSION >= 4000000 */ + nsresult rc; + PRInt64 Size; + rc = medium->vtbl->GetSize(medium, &Size); + *uSize = Size; + return rc; +#endif /* VBOX_API_VERSION >= 4000000 */ +} + static nsresult _mediumGetReadOnly(IMedium *medium ATTRIBUTE_UNUSED, PRBool *readOnly ATTRIBUTE_UNUSED) { @@ -4881,6 +4824,21 @@ _hardDiskDeleteStorage(IHardDisk *hardDisk, IProgress **progress) return hardDisk->vtbl->DeleteStorage(hardDisk, progress); } +static nsresult +_hardDiskGetLogicalSizeInByte(IHardDisk *hardDisk, PRUint64 *uLogicalSize) +{ + nsresult rc; +#if VBOX_API_VERSION < 4000000 + rc = hardDisk->vtbl->GetLogicalSize(hardDisk, uLogicalSize); + *uLogicalSize *= 1024 * 1024; /* MB => Bytes */ +#else /* VBOX_API_VERSION >= 4000000 */ + PRInt64 logicalSize; + rc = hardDisk->vtbl->GetLogicalSize(hardDisk, &logicalSize); + *uLogicalSize = logicalSize; +#endif /* VBOX_API_VERSION >= 4000000 */ + return rc; +} + static bool _machineStateOnline(PRUint32 state) { return ((state >= MachineState_FirstOnline) && @@ -5150,6 +5108,7 @@ static vboxUniformedIMedium _UIMedium = { .GetLocation = _mediumGetLocation, .GetState = _mediumGetState, .GetName = _mediumGetName, + .GetSize = _mediumGetSize, .GetReadOnly = _mediumGetReadOnly, .GetParent = _mediumGetParent, .GetChildren = _mediumGetChildren, @@ -5228,6 +5187,7 @@ static vboxUniformedIDHCPServer _UIDHCPServer = { static vboxUniformedIHardDisk _UIHardDisk = { .CreateBaseStorage = _hardDiskCreateBaseStorage, .DeleteStorage = _hardDiskDeleteStorage, + .GetLogicalSizeInByte = _hardDiskGetLogicalSizeInByte, }; static uniformedMachineStateChecker _machineStateChecker = { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 75299e326d243091eec288c8b39990317a22c6b0..5360fa4f8d2e3db9802b1293de9a79385c6e3418 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -416,6 +416,7 @@ typedef struct { nsresult (*GetLocation)(IMedium *medium, PRUnichar **location); nsresult (*GetState)(IMedium *medium, PRUint32 *state); nsresult (*GetName)(IMedium *medium, PRUnichar **name); + nsresult (*GetSize)(IMedium *medium, PRUint64 *uSize); nsresult (*GetReadOnly)(IMedium *medium, PRBool *readOnly); nsresult (*GetParent)(IMedium *medium, IMedium **parent); nsresult (*GetChildren)(IMedium *medium, PRUint32 *childrenSize, IMedium ***children); @@ -528,6 +529,7 @@ typedef struct { nsresult (*CreateBaseStorage)(IHardDisk *hardDisk, PRUint64 logicalSize, PRUint32 variant, IProgress **progress); nsresult (*DeleteStorage)(IHardDisk *hardDisk, IProgress **progress); + nsresult (*GetLogicalSizeInByte)(IHardDisk *hardDisk, PRUint64 *uLogicalSize); } vboxUniformedIHardDisk; typedef struct { @@ -619,6 +621,7 @@ virStorageVolPtr vboxStorageVolLookupByPath(virConnectPtr conn, const char *path virStorageVolPtr vboxStorageVolCreateXML(virStoragePoolPtr pool, const char *xml, unsigned int flags); int vboxStorageVolDelete(virStorageVolPtr vol, unsigned int flags); +int vboxStorageVolGetInfo(virStorageVolPtr vol, virStorageVolInfoPtr info); /* Version specified functions for installing uniformed API */ void vbox22InstallUniformedAPI(vboxUniformedAPI *pVBoxAPI);