[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 27/36] block: add bdrv_ensure_backing_file
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [RFC PATCH 27/36] block: add bdrv_ensure_backing_file |
Date: |
Fri, 15 Jun 2012 17:05:50 +0200 |
Mirroring runs without the backing file so that it can be copied outside
QEMU. However, we need to add it at the time the job is completed and
QEMU switches to the target. Factor out the common bits of opening an
image and completing a mirroring operation.
Signed-off-by: Paolo Bonzini <address@hidden>
---
block.c | 69 ++++++++++++++++++++++++++++++++++++++++-----------------------
block.h | 1 +
2 files changed, 45 insertions(+), 25 deletions(-)
diff --git a/block.c b/block.c
index dbb9041..5b08c5b 100644
--- a/block.c
+++ b/block.c
@@ -730,6 +730,48 @@ int bdrv_file_open(BlockDriverState **pbs, const char
*filename, int flags)
return 0;
}
+int bdrv_ensure_backing_file(BlockDriverState *bs)
+{
+ char backing_filename[PATH_MAX];
+ int back_flags, ret;
+ BlockDriver *back_drv = NULL;
+
+ if (bs->backing_hd != NULL) {
+ return 0;
+ }
+
+ bs->open_flags &= ~BDRV_O_NO_BACKING;
+ if (bs->backing_file[0] == '\0') {
+ return 0;
+ }
+
+ bs->backing_hd = bdrv_new("");
+ bdrv_get_full_backing_filename(bs, backing_filename,
+ sizeof(backing_filename));
+
+ if (bs->backing_format[0] != '\0') {
+ back_drv = bdrv_find_format(bs->backing_format);
+ }
+
+ /* backing files always opened read-only */
+ back_flags = bs->open_flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT);
+
+ ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
+ if (ret < 0) {
+ bdrv_close(bs);
+ bdrv_delete(bs->backing_hd);
+ bs->backing_hd = NULL;
+ return ret;
+ }
+ if (bs->is_temporary) {
+ bs->backing_hd->keep_read_only = !(bs->open_flags & BDRV_O_RDWR);
+ } else {
+ /* base images use the same setting as leaf */
+ bs->backing_hd->keep_read_only = bs->keep_read_only;
+ }
+ return 0;
+}
+
/*
* Opens a disk image (raw, qcow2, vmdk, ...)
*/
@@ -813,34 +855,11 @@ int bdrv_open(BlockDriverState *bs, const char *filename,
int flags,
}
/* If there is a backing file, use it */
- if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
- char backing_filename[PATH_MAX];
- int back_flags;
- BlockDriver *back_drv = NULL;
-
- bs->backing_hd = bdrv_new("");
- bdrv_get_full_backing_filename(bs, backing_filename,
- sizeof(backing_filename));
-
- if (bs->backing_format[0] != '\0') {
- back_drv = bdrv_find_format(bs->backing_format);
- }
-
- /* backing files always opened read-only */
- back_flags =
- flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
-
- ret = bdrv_open(bs->backing_hd, backing_filename, back_flags,
back_drv);
+ if ((flags & BDRV_O_NO_BACKING) == 0) {
+ ret = bdrv_ensure_backing_file(bs);
if (ret < 0) {
- bdrv_close(bs);
return ret;
}
- if (bs->is_temporary) {
- bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
- } else {
- /* base image inherits from "parent" */
- bs->backing_hd->keep_read_only = bs->keep_read_only;
- }
}
if (!bdrv_key_required(bs)) {
diff --git a/block.h b/block.h
index c13d779..a4aea47 100644
--- a/block.h
+++ b/block.h
@@ -122,6 +122,7 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState
*bs_top);
void bdrv_delete(BlockDriverState *bs);
int bdrv_parse_cache_flags(const char *mode, int *flags);
int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags);
+int bdrv_ensure_backing_file(BlockDriverState *bs);
int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
BlockDriver *drv);
void bdrv_close(BlockDriverState *bs);
--
1.7.10.2
- [Qemu-devel] [RFC PATCH 33/36] mirror: perform COW if the cluster size is bigger than the granularity, (continued)
- [Qemu-devel] [RFC PATCH 33/36] mirror: perform COW if the cluster size is bigger than the granularity, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 26/36] block: live snapshot documentation tweaks, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 35/36] block: allow customizing the granularity of the dirty bitmap, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 36/36] mirror: allow customizing the granularity, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 17/36] block: add bdrv_query_stats, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 30/36] add hierarchical bitmap data type and test cases, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 18/36] block: make device optional in BlockInfo, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 16/36] block: add bdrv_query_info, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 31/36] block: implement dirty bitmap using HBitmap, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 27/36] block: add bdrv_ensure_backing_file,
Paolo Bonzini <=
- [Qemu-devel] [RFC PATCH 28/36] block: add block-job-complete, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 32/36] block: make round_to_clusters public, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 23/36] qmp: add drive-mirror command, Paolo Bonzini, 2012/06/15
- [Qemu-devel] [RFC PATCH 14/36] stream: add on_error argument, Paolo Bonzini, 2012/06/15