[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/33] block: Add backing_blocker in BlockDriverState
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 12/33] block: Add backing_blocker in BlockDriverState |
Date: |
Fri, 23 May 2014 17:41:44 +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.0
- [Qemu-devel] [PULL 02/33] QemuOpt: add unit tests, (continued)
- [Qemu-devel] [PULL 02/33] QemuOpt: add unit tests, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 03/33] qcow2: Fix memory leak in COW error path, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 04/33] aio: Fix use-after-free in cancellation path, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 06/33] block: Add BlockOpType enum, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 07/33] block: Introduce op_blockers to BlockDriverState, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 05/33] iotests: Use _img_info in test 089, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 09/33] block: Move op_blocker check from block_job_create to its caller, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 08/33] block: Replace in_use with operation blocker, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 10/33] block: Add bdrv_set_backing_hd(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 11/33] block: Use bdrv_set_backing_hd everywhere, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 12/33] block: Add backing_blocker in BlockDriverState,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL 13/33] block: Drop redundant bdrv_refresh_limits, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 14/33] docs: Define refcount_bits value, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 15/33] blockdev: Don't use qerror_report_err() in drive_init(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 16/33] blockdev: Don't use qerror_report() in do_drive_del(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 17/33] qemu-nbd: Don't use qerror_report(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 18/33] block/rbd: Propagate errors to open and create methods, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 19/33] block/ssh: Drop superfluous libssh2_session_last_errno() calls, Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 20/33] block/ssh: Propagate errors through check_host_key(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 21/33] block/ssh: Propagate errors through authenticate(), Stefan Hajnoczi, 2014/05/23
- [Qemu-devel] [PULL 23/33] block/ssh: Propagate errors to open and create methods, Stefan Hajnoczi, 2014/05/23