qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Uri Lublin <uril@redhat.com>
To: qemu-devel@nongnu.org
Cc: Uri Lublin <uril@redhat.com>
Subject: [Qemu-devel] [PATCH 1/5 v2] block-qcow2: keep highest allocated byte
Date: Thu, 22 Jan 2009 12:43:51 +0200	[thread overview]
Message-ID: <1232621035-4951-2-git-send-email-uril@redhat.com> (raw)
In-Reply-To: <1232621035-4951-1-git-send-email-uril@redhat.com>

We want to know the highest written offset for qcow2 images.
This gives a pretty good (and easy to calculate) estimation to how
much more allocation can be done for the block device.

It can be usefull for allocating more diskspace for that image
(if possible, e.g. lvm) before we run out-of-disk-space

Signed-off-by: Uri Lublin <uril@redhat.com>
---
 block-qcow2.c |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/block-qcow2.c b/block-qcow2.c
index d4556ef..e016e8f 100644
--- a/block-qcow2.c
+++ b/block-qcow2.c
@@ -143,6 +143,9 @@ typedef struct BDRVQcowState {
     uint32_t crypt_method_header;
     AES_KEY aes_encrypt_key;
     AES_KEY aes_decrypt_key;
+
+    int64_t highest_alloc; /* highest cluester allocated (in clusters) */
+
     uint64_t snapshots_offset;
     int snapshots_size;
     int nb_snapshots;
@@ -170,6 +173,8 @@ static void free_clusters(BlockDriverState *bs,
 #ifdef DEBUG_ALLOC
 static void check_refcounts(BlockDriverState *bs);
 #endif
+static void scan_refcount(BlockDriverState *bs, int64_t *high);
+
 
 static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
 {
@@ -278,6 +283,8 @@ static int qcow_open(BlockDriverState *bs, const char *filename, int flags)
     if (refcount_init(bs) < 0)
         goto fail;
 
+    scan_refcount(bs, &s->highest_alloc);
+
     /* read the backing file name */
     if (header.backing_file_offset != 0) {
         len = header.backing_file_size;
@@ -2206,6 +2213,29 @@ static int load_refcount_block(BlockDriverState *bs,
     return 0;
 }
 
+static void scan_refcount(BlockDriverState *bs, int64_t *high)
+{
+    BDRVQcowState *s = bs->opaque;
+    int64_t refcnt_index, cluster_index, cluster_end, h = 0;
+
+    for (refcnt_index=0; refcnt_index < s->refcount_table_size; refcnt_index++){
+        if (s->refcount_table[refcnt_index] == 0) {
+            continue;
+        }
+        cluster_index = refcnt_index << (s->cluster_bits - REFCOUNT_SHIFT);
+        cluster_end = (refcnt_index + 1) << (s->cluster_bits - REFCOUNT_SHIFT);
+        for ( ; cluster_index < cluster_end; cluster_index++) {
+            if (get_refcount(bs, cluster_index) == 0)
+                /* do nothing -- reserved for free counting */;
+            else
+                h = cluster_index;
+        }
+    }
+
+    if (high)
+        *high = (h+1);
+}
+
 static int get_refcount(BlockDriverState *bs, int64_t cluster_index)
 {
     BDRVQcowState *s = bs->opaque;
@@ -2246,6 +2276,10 @@ retry:
             size,
             (s->free_cluster_index - nb_clusters) << s->cluster_bits);
 #endif
+
+    if (s->highest_alloc < s->free_cluster_index)
+        s->highest_alloc = s->free_cluster_index;
+
     return (s->free_cluster_index - nb_clusters) << s->cluster_bits;
 }
 
-- 
1.6.0.6

  reply	other threads:[~2009-01-22 10:44 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-22 10:43 [Qemu-devel] [PATCH 0/5 v2] qcow2 info: show highest-allocation and num-free-bytes Uri Lublin
2009-01-22 10:43 ` Uri Lublin [this message]
2009-01-22 10:43   ` [Qemu-devel] [PATCH 2/5 v2] block-qcow2: export highest_allocated through BlockDriverInfo and get_info() Uri Lublin
2009-01-22 10:43     ` [Qemu-devel] [PATCH 3/5 v2] info blockstats: show highest_allocated if exists Uri Lublin
2009-01-22 10:43       ` [Qemu-devel] [PATCH 4/5 v2] qcow2 format: keep 'num_free_bytes', and show it upon 'info blockstats' Uri Lublin
2009-01-22 10:43         ` [Qemu-devel] [PATCH 5/5 v2] qemu-img: info: show highest_alloc and num_free_bytes if exist Uri Lublin
2009-01-22 18:58 ` [Qemu-devel] [PATCH 0/5 v2] qcow2 info: show highest-allocation and num-free-bytes Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1232621035-4951-2-git-send-email-uril@redhat.com \
    --to=uril@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).