[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V2 14/20] qcow2: Extract qcow2_add_feature and qcow2_r
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V2 14/20] qcow2: Extract qcow2_add_feature and qcow2_remove_feature. |
Date: |
Wed, 17 Oct 2012 18:00:23 +0200 |
These functions will be use to mark that deduplication is activatedi
on an image.
---
block/qcow2.c | 40 +++++++++++++++++++++++++++-------------
block/qcow2.h | 4 ++--
2 files changed, 29 insertions(+), 15 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index 18cb85d..b11b6a7 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -235,13 +235,14 @@ static void report_unsupported_feature(BlockDriverState
*bs,
}
/*
- * Sets the dirty bit and flushes afterwards if necessary.
+ * Sets the an incompatible feature bit and flushes afterwards if necessary.
*
* The incompatible_features bit is only set if the image file header was
* updated successfully. Therefore it is not required to check the return
* value of this function.
*/
-static int qcow2_mark_dirty(BlockDriverState *bs)
+static int qcow2_add_feature(BlockDriverState *bs,
+ QCow2IncompatibleFeature feature)
{
BDRVQcowState *s = bs->opaque;
uint64_t val;
@@ -249,11 +250,11 @@ static int qcow2_mark_dirty(BlockDriverState *bs)
assert(s->qcow_version >= 3);
- if (s->incompatible_features & QCOW2_INCOMPAT_DIRTY) {
- return 0; /* already dirty */
+ if (s->incompatible_features & feature) {
+ return 0; /* already added */
}
- val = cpu_to_be64(s->incompatible_features | QCOW2_INCOMPAT_DIRTY);
+ val = cpu_to_be64(s->incompatible_features | feature);
ret = bdrv_pwrite(bs->file, offsetof(QCowHeader, incompatible_features),
&val, sizeof(val));
if (ret < 0) {
@@ -264,32 +265,45 @@ static int qcow2_mark_dirty(BlockDriverState *bs)
return ret;
}
- /* Only treat image as dirty if the header was updated successfully */
- s->incompatible_features |= QCOW2_INCOMPAT_DIRTY;
+ /* Only treat image as having the feature if the header was updated
+ * successfully
+ */
+ s->incompatible_features |= feature;
return 0;
}
+static int qcow2_mark_dirty(BlockDriverState *bs)
+{
+ return qcow2_add_feature(bs, QCOW2_INCOMPAT_DIRTY);
+}
+
/*
- * Clears the dirty bit and flushes before if necessary. Only call this
- * function when there are no pending requests, it does not guard against
- * concurrent requests dirtying the image.
+ * Clears an incompatible feature bit and flushes before if necessary.
+ * Only call this function when there are no pending requests, it does not
+ * guard against concurrent requests adding a feature to the image.
*/
-static int qcow2_mark_clean(BlockDriverState *bs)
+static int qcow2_remove_feature(BlockDriverState *bs,
+ QCow2IncompatibleFeature feature)
{
BDRVQcowState *s = bs->opaque;
- if (s->incompatible_features & QCOW2_INCOMPAT_DIRTY) {
+ if (s->incompatible_features & feature) {
int ret = bdrv_flush(bs);
if (ret < 0) {
return ret;
}
- s->incompatible_features &= ~QCOW2_INCOMPAT_DIRTY;
+ s->incompatible_features &= ~feature;
return qcow2_update_header(bs);
}
return 0;
}
+static int qcow2_mark_clean(BlockDriverState *bs)
+{
+ return qcow2_remove_feature(bs, QCOW2_INCOMPAT_DIRTY);
+}
+
static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result,
BdrvCheckMode fix)
{
diff --git a/block/qcow2.h b/block/qcow2.h
index ba900e0..5ecea94 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -125,14 +125,14 @@ enum {
};
/* Incompatible feature bits */
-enum {
+typedef enum {
QCOW2_INCOMPAT_DIRTY_BITNR = 0,
QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
QCOW2_INCOMPAT_DEDUP_BITNR = 1,
QCOW2_INCOMPAT_DEDUP = 1 << QCOW2_INCOMPAT_DEDUP_BITNR,
QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY | QCOW2_INCOMPAT_DEDUP,
-};
+} QCow2IncompatibleFeature;
/* Compatible feature bits */
enum {
--
1.7.10.4
- [Qemu-devel] [RFC V2 17/20] qcow2: Integrate deduplication in qcow2_co_writev loop., (continued)
- [Qemu-devel] [RFC V2 17/20] qcow2: Integrate deduplication in qcow2_co_writev loop., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 16/20] qcow2: Allow creation of images using deduplication., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 10/20] qcow2: Add qcow2_dedup_grow_table., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 12/20] qcow2: Extract qcow2_do_table_init., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 20/20] qemu-iotests: Filter dedup=on/off so existing tests don't break., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 13/20] qcow2: Add qcow2_dedup_init and qcow2_dedup_close., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 18/20] qcow2: Add method to destroy the deduplication red black tree., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 19/20] qcow2: init and cleanup deduplication., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 02/20] qcow2: Add kernel red black trees, Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 11/20] qcow2: Load and save deduplication table header extension., Benoît Canet, 2012/10/17
- [Qemu-devel] [RFC V2 14/20] qcow2: Extract qcow2_add_feature and qcow2_remove_feature.,
Benoît Canet <=
- Re: [Qemu-devel] [RFC V2 00/20] QCOW2 deduplication, Avi Kivity, 2012/10/17