Patchwork [RFC,V6,16/33] qcow2: Extract qcow2_do_table_init.

login
register
mail settings
Submitter Benoît Canet
Date Feb. 6, 2013, 12:31 p.m.
Message ID <1360153926-9492-17-git-send-email-benoit@irqsave.net>
Download mbox | patch
Permalink /patch/218599/
State New
Headers show

Comments

Benoît Canet - Feb. 6, 2013, 12:31 p.m.
Signed-off-by: Benoit Canet <benoit@irqsave.net>
---
 block/qcow2-refcount.c |   43 ++++++++++++++++++++++++++++++-------------
 block/qcow2.h          |    5 +++++
 2 files changed, 35 insertions(+), 13 deletions(-)
Stefan Hajnoczi - Feb. 7, 2013, 10 a.m.
On Wed, Feb 06, 2013 at 01:31:49PM +0100, Benoît Canet wrote:
> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
> index 296c440..9c16816 100644
> --- a/block/qcow2-refcount.c
> +++ b/block/qcow2-refcount.c
> @@ -31,27 +31,44 @@ static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size);
>  /*********************************************************/
>  /* refcount handling */
>  
> -int qcow2_refcount_init(BlockDriverState *bs)
> +int qcow2_do_table_init(BlockDriverState *bs,
> +                        uint64_t **table,
> +                        int64_t offset,
> +                        int size,
> +                        bool is_refcount)
>  {
> -    BDRVQcowState *s = bs->opaque;
> -    int ret, refcount_table_size2, i;
> -
> -    refcount_table_size2 = s->refcount_table_size * sizeof(uint64_t);
> -    s->refcount_table = g_malloc(refcount_table_size2);
> -    if (s->refcount_table_size > 0) {
> -        BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
> -        ret = bdrv_pread(bs->file, s->refcount_table_offset,
> -                         s->refcount_table, refcount_table_size2);
> -        if (ret != refcount_table_size2)
> +    int ret, size2, i;
> +
> +    size2 = size * sizeof(uint64_t);
> +    *table = g_malloc(size2);
> +    if (size > 0) {
> +        if (is_refcount) {
> +            BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
> +        }

Please add a blkdebug event for dedup table loading.

Patch

diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 296c440..9c16816 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -31,27 +31,44 @@  static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size);
 /*********************************************************/
 /* refcount handling */
 
-int qcow2_refcount_init(BlockDriverState *bs)
+int qcow2_do_table_init(BlockDriverState *bs,
+                        uint64_t **table,
+                        int64_t offset,
+                        int size,
+                        bool is_refcount)
 {
-    BDRVQcowState *s = bs->opaque;
-    int ret, refcount_table_size2, i;
-
-    refcount_table_size2 = s->refcount_table_size * sizeof(uint64_t);
-    s->refcount_table = g_malloc(refcount_table_size2);
-    if (s->refcount_table_size > 0) {
-        BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
-        ret = bdrv_pread(bs->file, s->refcount_table_offset,
-                         s->refcount_table, refcount_table_size2);
-        if (ret != refcount_table_size2)
+    int ret, size2, i;
+
+    size2 = size * sizeof(uint64_t);
+    *table = g_malloc(size2);
+    if (size > 0) {
+        if (is_refcount) {
+            BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
+        }
+        ret = bdrv_pread(bs->file, offset,
+                         *table, size2);
+        if (ret != size2) {
             goto fail;
-        for(i = 0; i < s->refcount_table_size; i++)
-            be64_to_cpus(&s->refcount_table[i]);
+        }
+        for (i = 0; i < size; i++) {
+            be64_to_cpus(&(*table)[i]);
+        }
     }
     return 0;
  fail:
     return -ENOMEM;
 }
 
+int qcow2_refcount_init(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+    return qcow2_do_table_init(bs,
+                               &s->refcount_table,
+                               s->refcount_table_offset,
+                               s->refcount_table_size,
+                               true);
+}
+
 void qcow2_refcount_close(BlockDriverState *bs)
 {
     BDRVQcowState *s = bs->opaque;
diff --git a/block/qcow2.h b/block/qcow2.h
index becb2f8..7825f13 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -390,6 +390,11 @@  int qcow2_read_cluster_data(BlockDriverState *bs,
                             int nb_sectors);
 
 /* qcow2-refcount.c functions */
+int qcow2_do_table_init(BlockDriverState *bs,
+                        uint64_t **table,
+                        int64_t offset,
+                        int size,
+                        bool is_refcount);
 int qcow2_refcount_init(BlockDriverState *bs);
 void qcow2_refcount_close(BlockDriverState *bs);