Prepare for extraction of features from the 'incompatible features'
group.
This is done by moving the extraction loop into a new function called
qcow2GetFeaturesProcessGroup. The new function also allows to ingore
features we don't care about by passing VIR_STORAGE_FILE_FEATURE_LAST as
the target flag.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/storage_file/storage_file_probe.c | 33 ++++++++++++++++++---------
1 file changed, 22 insertions(+), 11 deletions(-)
diff --git a/src/storage_file/storage_file_probe.c
b/src/storage_file/storage_file_probe.c
index dc438a5e5d..f403e50938 100644
--- a/src/storage_file/storage_file_probe.c
+++ b/src/storage_file/storage_file_probe.c
@@ -344,7 +344,7 @@ enum qcow2CompatibleFeature {
};
/* conversion to virStorageFileFeature */
-static const int qcow2CompatibleFeatureArray[] = {
+static const virStorageFileFeature qcow2CompatibleFeatureArray[] = {
VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS,
};
G_STATIC_ASSERT(G_N_ELEMENTS(qcow2CompatibleFeatureArray) ==
@@ -748,6 +748,22 @@ virStorageFileProbeFormatFromBuf(const char *path,
}
+static void
+qcow2GetFeaturesProcessGroup(uint64_t bits,
+ const virStorageFileFeature *featuremap,
+ size_t nfeatures,
+ virBitmap *features)
+{
+ size_t i;
+
+ for (i = 0; i < nfeatures; i++) {
+ if ((bits & ((uint64_t) 1 << i)) &&
+ featuremap[i] != VIR_STORAGE_FILE_FEATURE_LAST)
+ ignore_value(virBitmapSetBit(features, featuremap[i]));
+ }
+}
+
+
static int
qcow2GetFeatures(virBitmap **features,
int format,
@@ -755,9 +771,6 @@ qcow2GetFeatures(virBitmap **features,
ssize_t len)
{
int version = -1;
- virBitmap *feat = NULL;
- uint64_t bits;
- size_t i;
version = virReadBufInt32BE(buf + fileTypeInfo[format].versionOffset);
@@ -767,16 +780,14 @@ qcow2GetFeatures(virBitmap **features,
if (len < QCOW2v3_HDR_SIZE)
return -1;
- feat = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST);
+ *features = virBitmapNew(VIR_STORAGE_FILE_FEATURE_LAST);
/* todo: check for incompatible or autoclear features? */
- bits = virReadBufInt64BE(buf + QCOW2v3_HDR_FEATURES_COMPATIBLE);
- for (i = 0; i < QCOW2_COMPATIBLE_FEATURE_LAST; i++) {
- if (bits & ((uint64_t) 1 << i))
- ignore_value(virBitmapSetBit(feat, qcow2CompatibleFeatureArray[i]));
- }
+ qcow2GetFeaturesProcessGroup(virReadBufInt64BE(buf +
QCOW2v3_HDR_FEATURES_COMPATIBLE),
+ qcow2CompatibleFeatureArray,
+ G_N_ELEMENTS(qcow2CompatibleFeatureArray),
+ *features);
- *features = feat;
return 0;
}
--
2.31.1