mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-13 17:18:01 +03:00
storage: Introduce virStorageBackendRefreshVolTargetUpdate
Create a separate function to handle the volume target update via probe processing.
This commit is contained in:
parent
be6a415e51
commit
7c2945b854
@ -3516,6 +3516,58 @@ storageBackendProbeTarget(virStorageSourcePtr target,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virStorageBackendRefreshVolTargetUpdate:
|
||||
* @vol: Volume def that needs updating
|
||||
*
|
||||
* Attempt to probe the volume in order to get more details.
|
||||
*
|
||||
* Returns 0 on success, -2 to ignore failure, -1 on failure
|
||||
*/
|
||||
int
|
||||
virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Real value is filled in during probe */
|
||||
vol->target.format = VIR_STORAGE_FILE_RAW;
|
||||
|
||||
if ((err = storageBackendProbeTarget(&vol->target,
|
||||
&vol->target.encryption)) < 0) {
|
||||
if (err == -2) {
|
||||
return -2;
|
||||
} else if (err == -3) {
|
||||
/* The backing file is currently unavailable, its format is not
|
||||
* explicitly specified, the probe to auto detect the format
|
||||
* failed: continue with faked RAW format, since AUTO will
|
||||
* break virStorageVolTargetDefFormat() generating the line
|
||||
* <format type='...'/>. */
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* directory based volume */
|
||||
if (vol->target.format == VIR_STORAGE_FILE_DIR)
|
||||
vol->type = VIR_STORAGE_VOL_DIR;
|
||||
|
||||
if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
|
||||
vol->type = VIR_STORAGE_VOL_PLOOP;
|
||||
|
||||
if (vol->target.backingStore) {
|
||||
ignore_value(storageBackendUpdateVolTargetInfo(VIR_STORAGE_VOL_FILE,
|
||||
vol->target.backingStore,
|
||||
false,
|
||||
VIR_STORAGE_VOL_OPEN_DEFAULT, 0));
|
||||
/* If this failed, the backing file is currently unavailable,
|
||||
* the capacity, allocation, owner, group and mode are unknown.
|
||||
* An error message was raised, but we just continue. */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Iterate over the pool's directory and enumerate all disk images
|
||||
* within it. This is non-recursive.
|
||||
@ -3552,7 +3604,6 @@ virStorageBackendRefreshLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
goto cleanup;
|
||||
|
||||
vol->type = VIR_STORAGE_VOL_FILE;
|
||||
vol->target.format = VIR_STORAGE_FILE_RAW; /* Real value is filled in during probe */
|
||||
if (virAsprintf(&vol->target.path, "%s/%s",
|
||||
pool->def->target.path,
|
||||
vol->name) < 0)
|
||||
@ -3561,40 +3612,15 @@ virStorageBackendRefreshLocal(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
if (VIR_STRDUP(vol->key, vol->target.path) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if ((err = storageBackendProbeTarget(&vol->target,
|
||||
&vol->target.encryption)) < 0) {
|
||||
if ((err = virStorageBackendRefreshVolTargetUpdate(vol)) < 0) {
|
||||
if (err == -2) {
|
||||
/* Silently ignore non-regular files,
|
||||
* eg 'lost+found', dangling symbolic link */
|
||||
virStorageVolDefFree(vol);
|
||||
vol = NULL;
|
||||
continue;
|
||||
} else if (err == -3) {
|
||||
/* The backing file is currently unavailable, its format is not
|
||||
* explicitly specified, the probe to auto detect the format
|
||||
* failed: continue with faked RAW format, since AUTO will
|
||||
* break virStorageVolTargetDefFormat() generating the line
|
||||
* <format type='...'/>. */
|
||||
} else {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* directory based volume */
|
||||
if (vol->target.format == VIR_STORAGE_FILE_DIR)
|
||||
vol->type = VIR_STORAGE_VOL_DIR;
|
||||
|
||||
if (vol->target.format == VIR_STORAGE_FILE_PLOOP)
|
||||
vol->type = VIR_STORAGE_VOL_PLOOP;
|
||||
|
||||
if (vol->target.backingStore) {
|
||||
ignore_value(storageBackendUpdateVolTargetInfo(VIR_STORAGE_VOL_FILE,
|
||||
vol->target.backingStore,
|
||||
false,
|
||||
VIR_STORAGE_VOL_OPEN_DEFAULT, 0));
|
||||
/* If this failed, the backing file is currently unavailable,
|
||||
* the capacity, allocation, owner, group and mode are unknown.
|
||||
* An error message was raised, but we just continue. */
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (VIR_APPEND_ELEMENT(pool->volumes.objs, pool->volumes.count, vol) < 0)
|
||||
|
@ -90,6 +90,9 @@ int virStorageBackendDeleteLocal(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool,
|
||||
unsigned int flags);
|
||||
|
||||
int
|
||||
virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol);
|
||||
|
||||
int virStorageBackendRefreshLocal(virConnectPtr conn,
|
||||
virStoragePoolObjPtr pool);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user