[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC V5 17/36] qcow2: Extract qcow2_add_feature and qcow2_r
From: |
Benoît Canet |
Subject: |
[Qemu-devel] [RFC V5 17/36] qcow2: Extract qcow2_add_feature and qcow2_remove_feature. |
Date: |
Wed, 16 Jan 2013 17:24:38 +0100 |
Signed-off-by: Benoit Canet <address@hidden>
---
block/qcow2.c | 49 ++++++++++++++++++++++++++++++-------------------
block/qcow2.h | 4 ++--
2 files changed, 32 insertions(+), 21 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index b8c4e31..f046a77 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -238,61 +238,72 @@ 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.
*/
-int qcow2_mark_dirty(BlockDriverState *bs)
+static int qcow2_add_feature(BlockDriverState *bs,
+ QCow2IncompatibleFeature feature)
{
BDRVQcowState *s = bs->opaque;
uint64_t val;
- int ret;
+ int ret = 0;
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) {
return ret;
}
- ret = bdrv_flush(bs->file);
- if (ret < 0) {
- 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;
}
+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;
+ int ret = 0;
- if (s->incompatible_features & QCOW2_INCOMPAT_DIRTY) {
- int ret = bdrv_flush(bs);
+ if (s->incompatible_features & feature) {
+ 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 b17977f..59432fd 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -170,14 +170,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 V5 05/36] qcow2: Create a way to link to l2 tables when deduplicating., (continued)
- [Qemu-devel] [RFC V5 05/36] qcow2: Create a way to link to l2 tables when deduplicating., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 03/36] qcow2: Add qcow2_de dup_read_missing_and_concatenate, Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 06/36] qcow2: Add qcow2_dedup and related functions, Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 10/36] qcow2: Add qcow2_dedup_grow_table and use it., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 12/36] qcow2: make the deduplication forget a cluster hash when a cluster is to dedupe, Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 13/36] qcow2: Create qcow2_is_cluster_to_dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 14/36] qcow2: Load and save deduplication table header extension., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 16/36] qcow2-cache: Allow to choose table size at creation., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 17/36] qcow2: Extract qcow2_add_feature and qcow2_remove_feature.,
Benoît Canet <=
- [Qemu-devel] [RFC V5 19/36] qcow2: Add a deduplication boolean to update_refcount., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 25/36] qcow2: Add verification of dedup table., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 21/36] qcow2: Remove hash when cluster is deleted., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 26/36] qcow2: Adapt checking of QCOW_OFLAG_COPIED for dedup., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 23/36] qcow2: Integrate deduplication in qcow2_co_writev loop., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 24/36] qcow2: Serialize write requests when deduplication is activated., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 28/36] qcow2: Do not overwrite existing entries with QCOW_OFLAG_COPIED., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 30/36] qcow2: Add lazy refcounts to deduplication to prevent qcow2_cache_set_dependency loops, Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 32/36] qcow: Set large dedup hash block size., Benoît Canet, 2013/01/16
- [Qemu-devel] [RFC V5 15/36] qcow2: Extract qcow2_do_table_init., Benoît Canet, 2013/01/16