summary refs log tree commit diff stats
path: root/block.c
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2013-12-11 19:26:16 +0100
committerKevin Wolf <kwolf@redhat.com>2014-01-24 17:40:01 +0100
commitd34682cd4a06efe9ee3fc8cb7e8a0ea445299989 (patch)
treeff1e3ffdb4f56ff7e2c3d86542a711d731622c4b /block.c
parentdabfa6cc2e2a06269026fcb42772894f67bd0c3e (diff)
downloadfocaccia-qemu-d34682cd4a06efe9ee3fc8cb7e8a0ea445299989.tar.gz
focaccia-qemu-d34682cd4a06efe9ee3fc8cb7e8a0ea445299989.zip
block: Move initialisation of BlockLimits to bdrv_refresh_limits()
This function separates filling the BlockLimits from bdrv_open(), which
allows it to call it from other operations which may change the limits
(e.g. modifications to the backing file chain or bdrv_reopen)

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Benoit Canet <benoit@irqsave.net>
Diffstat (limited to 'block.c')
-rw-r--r--block.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/block.c b/block.c
index 2106ae9cee..0a3d12c328 100644
--- a/block.c
+++ b/block.c
@@ -483,6 +483,19 @@ int bdrv_create_file(const char* filename, QEMUOptionParameter *options,
     return ret;
 }
 
+static int bdrv_refresh_limits(BlockDriverState *bs)
+{
+    BlockDriver *drv = bs->drv;
+
+    memset(&bs->bl, 0, sizeof(bs->bl));
+
+    if (drv && drv->bdrv_refresh_limits) {
+        return drv->bdrv_refresh_limits(bs);
+    }
+
+    return 0;
+}
+
 /*
  * Create a uniquely-named empty temporary file.
  * Return 0 upon success, otherwise a negative errno value.
@@ -872,6 +885,8 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
         goto free_and_fail;
     }
 
+    bdrv_refresh_limits(bs);
+
 #ifndef _WIN32
     if (bs->is_temporary) {
         assert(bs->filename[0] != '\0');
@@ -1085,6 +1100,9 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
                 bs->backing_hd->file->filename);
     }
 
+    /* Recalculate the BlockLimits with the backing file */
+    bdrv_refresh_limits(bs);
+
     return 0;
 }