mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 07:17:44 +00:00
vbox: Rewrite vboxStorageVolGetInfo
This commit is contained in:
parent
1c2c3906a1
commit
80f35e6e8b
@ -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;
|
||||
}
|
||||
|
@ -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 = {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user