util: storage: Allow metadata crawler to report useful errors

Add a new parameter to virStorageFileGetMetadata that will break the
backing chain detection process and report useful error message rather
than having to use virStorageFileChainGetBroken.

This patch just introduces the option, usage will be provided
separately.
This commit is contained in:
Peter Krempa 2014-09-11 18:28:47 +02:00
parent a9bad1a337
commit b8549877a1
5 changed files with 23 additions and 11 deletions

View File

@ -2730,7 +2730,8 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver,
if (virStorageFileGetMetadata(disk->src,
uid, gid,
cfg->allowDiskFormatProbing) < 0)
cfg->allowDiskFormatProbing,
false) < 0)
ret = -1;
cleanup:

View File

@ -932,7 +932,7 @@ get_files(vahControl * ctl)
*/
if (!disk->src->backingStore) {
bool probe = ctl->allowDiskFormatProbing;
virStorageFileGetMetadata(disk->src, -1, -1, probe);
virStorageFileGetMetadata(disk->src, -1, -1, probe, false);
}
/* XXX passing ignoreOpenFailure = true to get back to the behavior

View File

@ -2783,6 +2783,7 @@ static int
virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
uid_t uid, gid_t gid,
bool allow_probe,
bool report_broken,
virHashTablePtr cycle)
{
int ret = -1;
@ -2847,9 +2848,13 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
else
backingStore->format = backingFormat;
if (virStorageFileGetMetadataRecurse(backingStore,
uid, gid, allow_probe,
cycle) < 0) {
if ((ret = virStorageFileGetMetadataRecurse(backingStore,
uid, gid,
allow_probe, report_broken,
cycle)) < 0) {
if (report_broken)
goto cleanup;
/* if we fail somewhere midway, just accept and return a
* broken chain */
ret = 0;
@ -2883,15 +2888,20 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
* format, since a malicious guest can turn a raw file into any
* other non-raw format at will.
*
* If @report_broken is true, the whole function fails with a possibly sane
* error instead of just returning a broken chain.
*
* Caller MUST free result after use via virStorageSourceFree.
*/
int
virStorageFileGetMetadata(virStorageSourcePtr src,
uid_t uid, gid_t gid,
bool allow_probe)
bool allow_probe,
bool report_broken)
{
VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d",
src->path, src->format, (int)uid, (int)gid, allow_probe);
VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d, report_broken=%d",
src->path, src->format, (int)uid, (int)gid,
allow_probe, report_broken);
virHashTablePtr cycle = NULL;
int ret = -1;
@ -2903,7 +2913,7 @@ virStorageFileGetMetadata(virStorageSourcePtr src,
src->format = allow_probe ? VIR_STORAGE_FILE_AUTO : VIR_STORAGE_FILE_RAW;
ret = virStorageFileGetMetadataRecurse(src, uid, gid,
allow_probe, cycle);
allow_probe, report_broken, cycle);
virHashFree(cycle);
return ret;

View File

@ -50,7 +50,8 @@ bool virStorageFileSupportsSecurityDriver(virStorageSourcePtr src);
int virStorageFileGetMetadata(virStorageSourcePtr src,
uid_t uid, gid_t gid,
bool allow_probe)
bool allow_probe,
bool report_broken)
ATTRIBUTE_NONNULL(1);
int virStorageTranslateDiskSourcePool(virConnectPtr conn,

View File

@ -119,7 +119,7 @@ testStorageFileGetMetadata(const char *path,
if (VIR_STRDUP(ret->path, path) < 0)
goto error;
if (virStorageFileGetMetadata(ret, uid, gid, allow_probe) < 0)
if (virStorageFileGetMetadata(ret, uid, gid, allow_probe, false) < 0)
goto error;
return ret;