From: John Ferlan Date: Thu, 24 Aug 2017 21:56:47 +0000 (-0400) Subject: storage: Introduce virStorageBackendRefreshVolTargetUpdate X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7c2945b854a3b00c390016f40933027d8d7c80d3;p=libvirt.git storage: Introduce virStorageBackendRefreshVolTargetUpdate Create a separate function to handle the volume target update via probe processing. --- diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index e1fe162ed9..b0a698a7c4 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -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 + * . */ + } 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 - * . */ - } 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) diff --git a/src/storage/storage_util.h b/src/storage/storage_util.h index 6f2a1b189e..00793ff3a4 100644 --- a/src/storage/storage_util.h +++ b/src/storage/storage_util.h @@ -90,6 +90,9 @@ int virStorageBackendDeleteLocal(virConnectPtr conn, virStoragePoolObjPtr pool, unsigned int flags); +int +virStorageBackendRefreshVolTargetUpdate(virStorageVolDefPtr vol); + int virStorageBackendRefreshLocal(virConnectPtr conn, virStoragePoolObjPtr pool);