[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 12/33] block: Add backing_blocker in BlockDriverSt
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 12/33] block: Add backing_blocker in BlockDriverState |
Date: |
Wed, 28 May 2014 14:32:22 +0200 |
From: Fam Zheng <address@hidden>
This makes use of op_blocker and blocks all the operations except for
commit target, on each BlockDriverState->backing_hd.
The asserts for op_blocker in bdrv_swap are removed because with this
change, the target of block commit has at least the backing blocker of
its child, so the assertion is not true. Callers should do their check.
Signed-off-by: Fam Zheng <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
block.c | 23 +++++++++++++++++++----
block/mirror.c | 2 +-
include/block/block_int.h | 3 +++
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/block.c b/block.c
index 1271dd2..aa9b5ab 100644
--- a/block.c
+++ b/block.c
@@ -1097,14 +1097,30 @@ fail:
void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd)
{
+ if (bs->backing_hd) {
+ assert(bs->backing_blocker);
+ bdrv_op_unblock_all(bs->backing_hd, bs->backing_blocker);
+ } else if (backing_hd) {
+ error_setg(&bs->backing_blocker,
+ "device is used as backing hd of '%s'",
+ bs->device_name);
+ }
+
bs->backing_hd = backing_hd;
if (!backing_hd) {
+ error_free(bs->backing_blocker);
+ bs->backing_blocker = NULL;
goto out;
}
bs->open_flags &= ~BDRV_O_NO_BACKING;
pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filename);
pstrcpy(bs->backing_format, sizeof(bs->backing_format),
backing_hd->drv ? backing_hd->drv->format_name : "");
+
+ bdrv_op_block_all(bs->backing_hd, bs->backing_blocker);
+ /* Otherwise we won't be able to commit due to check in bdrv_commit */
+ bdrv_op_unblock(bs->backing_hd, BLOCK_OP_TYPE_COMMIT,
+ bs->backing_blocker);
out:
bdrv_refresh_limits(bs);
}
@@ -1803,8 +1819,9 @@ void bdrv_close(BlockDriverState *bs)
if (bs->drv) {
if (bs->backing_hd) {
- bdrv_unref(bs->backing_hd);
- bs->backing_hd = NULL;
+ BlockDriverState *backing_hd = bs->backing_hd;
+ bdrv_set_backing_hd(bs, NULL);
+ bdrv_unref(backing_hd);
}
bs->drv->bdrv_close(bs);
g_free(bs->opaque);
@@ -2006,7 +2023,6 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState
*bs_old)
assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
assert(bs_new->job == NULL);
assert(bs_new->dev == NULL);
- assert(bdrv_op_blocker_is_empty(bs_new));
assert(bs_new->io_limits_enabled == false);
assert(!throttle_have_timer(&bs_new->throttle_state));
@@ -2025,7 +2041,6 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState
*bs_old)
/* Check a few fields that should remain attached to the device */
assert(bs_new->dev == NULL);
assert(bs_new->job == NULL);
- assert(bdrv_op_blocker_is_empty(bs_new));
assert(bs_new->io_limits_enabled == false);
assert(!throttle_have_timer(&bs_new->throttle_state));
diff --git a/block/mirror.c b/block/mirror.c
index 1c38aa8..94c8661 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -498,7 +498,7 @@ immediate_exit:
/* drop the bs loop chain formed by the swap: break the loop then
* trigger the unref from the top one */
BlockDriverState *p = s->base->backing_hd;
- s->base->backing_hd = NULL;
+ bdrv_set_backing_hd(s->base, NULL);
bdrv_unref(p);
}
}
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 7b1c013..f2e753f 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -369,6 +369,9 @@ struct BlockDriverState {
QDict *options;
BlockdevDetectZeroesOptions detect_zeroes;
+
+ /* The error object in use for blocking operations on backing_hd */
+ Error *backing_blocker;
};
int get_tmp_filename(char *filename, int size);
--
1.9.3
- [Qemu-devel] [PULL v2 02/33] QemuOpt: add unit tests, (continued)
- [Qemu-devel] [PULL v2 02/33] QemuOpt: add unit tests, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 03/33] qcow2: Fix memory leak in COW error path, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 04/33] aio: Fix use-after-free in cancellation path, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 06/33] block: Add BlockOpType enum, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 05/33] iotests: Use _img_info in test 089, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 07/33] block: Introduce op_blockers to BlockDriverState, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 09/33] block: Move op_blocker check from block_job_create to its caller, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 08/33] block: Replace in_use with operation blocker, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 10/33] block: Add bdrv_set_backing_hd(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 11/33] block: Use bdrv_set_backing_hd everywhere, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 12/33] block: Add backing_blocker in BlockDriverState,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 13/33] block: Drop redundant bdrv_refresh_limits, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 14/33] docs: Define refcount_bits value, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 15/33] blockdev: Don't use qerror_report_err() in drive_init(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 16/33] blockdev: Don't use qerror_report() in do_drive_del(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 17/33] qemu-nbd: Don't use qerror_report(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 19/33] block/ssh: Drop superfluous libssh2_session_last_errno() calls, Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 20/33] block/ssh: Propagate errors through check_host_key(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 21/33] block/ssh: Propagate errors through authenticate(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 22/33] block/ssh: Propagate errors through connect_to_ssh(), Stefan Hajnoczi, 2014/05/28
- [Qemu-devel] [PULL v2 23/33] block/ssh: Propagate errors to open and create methods, Stefan Hajnoczi, 2014/05/28