};
/* conversion to virStorageFileFeature */
-static const int qcow2CompatibleFeatureArray[] = {
+static const virStorageFileFeature qcow2CompatibleFeatureArray[] = {
VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS,
};
G_STATIC_ASSERT(G_N_ELEMENTS(qcow2CompatibleFeatureArray) ==
}
+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,
ssize_t len)
{
int version = -1;
- virBitmap *feat = NULL;
- uint64_t bits;
- size_t i;
version = virReadBufInt32BE(buf + fileTypeInfo[format].versionOffset);
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;
}