mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
block: remove AioContext locking
This is the big patch that removes aio_context_acquire()/aio_context_release() from the block layer and affected block layer users. There isn't a clean way to split this patch and the reviewers are likely the same group of people, so I decided to do it in one patch. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Paul Durrant <paul@xen.org> Message-ID: <20231205182011.1976568-7-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
committed by
Kevin Wolf
parent
6bc30f1949
commit
b49f4755c7
@@ -429,7 +429,6 @@ BlockBackend *blk_new_open(const char *filename, const char *reference,
|
|||||||
{
|
{
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
AioContext *ctx;
|
|
||||||
uint64_t perm = 0;
|
uint64_t perm = 0;
|
||||||
uint64_t shared = BLK_PERM_ALL;
|
uint64_t shared = BLK_PERM_ALL;
|
||||||
|
|
||||||
@@ -459,23 +458,18 @@ BlockBackend *blk_new_open(const char *filename, const char *reference,
|
|||||||
shared = BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED;
|
shared = BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_acquire(qemu_get_aio_context());
|
|
||||||
bs = bdrv_open(filename, reference, options, flags, errp);
|
bs = bdrv_open(filename, reference, options, flags, errp);
|
||||||
aio_context_release(qemu_get_aio_context());
|
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bdrv_open() could have moved bs to a different AioContext */
|
/* bdrv_open() could have moved bs to a different AioContext */
|
||||||
ctx = bdrv_get_aio_context(bs);
|
|
||||||
blk = blk_new(bdrv_get_aio_context(bs), perm, shared);
|
blk = blk_new(bdrv_get_aio_context(bs), perm, shared);
|
||||||
blk->perm = perm;
|
blk->perm = perm;
|
||||||
blk->shared_perm = shared;
|
blk->shared_perm = shared;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
blk_insert_bs(blk, bs, errp);
|
blk_insert_bs(blk, bs, errp);
|
||||||
bdrv_unref(bs);
|
bdrv_unref(bs);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
if (!blk->root) {
|
if (!blk->root) {
|
||||||
blk_unref(blk);
|
blk_unref(blk);
|
||||||
@@ -577,13 +571,9 @@ void blk_remove_all_bs(void)
|
|||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
while ((blk = blk_all_next(blk)) != NULL) {
|
while ((blk = blk_all_next(blk)) != NULL) {
|
||||||
AioContext *ctx = blk_get_aio_context(blk);
|
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if (blk->root) {
|
if (blk->root) {
|
||||||
blk_remove_bs(blk);
|
blk_remove_bs(blk);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2736,20 +2726,16 @@ int blk_commit_all(void)
|
|||||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
while ((blk = blk_all_next(blk)) != NULL) {
|
while ((blk = blk_all_next(blk)) != NULL) {
|
||||||
AioContext *aio_context = blk_get_aio_context(blk);
|
|
||||||
BlockDriverState *unfiltered_bs = bdrv_skip_filters(blk_bs(blk));
|
BlockDriverState *unfiltered_bs = bdrv_skip_filters(blk_bs(blk));
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
if (blk_is_inserted(blk) && bdrv_cow_child(unfiltered_bs)) {
|
if (blk_is_inserted(blk) && bdrv_cow_child(unfiltered_bs)) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = bdrv_commit(unfiltered_bs);
|
ret = bdrv_commit(unfiltered_bs);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
aio_context_release(aio_context);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -412,7 +412,6 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
int64_t cluster_size;
|
int64_t cluster_size;
|
||||||
g_autoptr(BlockdevOptions) full_opts = NULL;
|
g_autoptr(BlockdevOptions) full_opts = NULL;
|
||||||
BlockdevOptionsCbw *opts;
|
BlockdevOptionsCbw *opts;
|
||||||
AioContext *ctx;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
full_opts = cbw_parse_options(options, errp);
|
full_opts = cbw_parse_options(options, errp);
|
||||||
@@ -435,15 +434,11 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
|
|
||||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
ctx = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
|
|
||||||
if (opts->bitmap) {
|
if (opts->bitmap) {
|
||||||
bitmap = block_dirty_bitmap_lookup(opts->bitmap->node,
|
bitmap = block_dirty_bitmap_lookup(opts->bitmap->node,
|
||||||
opts->bitmap->name, NULL, errp);
|
opts->bitmap->name, NULL, errp);
|
||||||
if (!bitmap) {
|
if (!bitmap) {
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s->on_cbw_error = opts->has_on_cbw_error ? opts->on_cbw_error :
|
s->on_cbw_error = opts->has_on_cbw_error ? opts->on_cbw_error :
|
||||||
@@ -461,24 +456,21 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
s->bcs = block_copy_state_new(bs->file, s->target, bitmap, errp);
|
s->bcs = block_copy_state_new(bs->file, s->target, bitmap, errp);
|
||||||
if (!s->bcs) {
|
if (!s->bcs) {
|
||||||
error_prepend(errp, "Cannot create block-copy-state: ");
|
error_prepend(errp, "Cannot create block-copy-state: ");
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster_size = block_copy_cluster_size(s->bcs);
|
cluster_size = block_copy_cluster_size(s->bcs);
|
||||||
|
|
||||||
s->done_bitmap = bdrv_create_dirty_bitmap(bs, cluster_size, NULL, errp);
|
s->done_bitmap = bdrv_create_dirty_bitmap(bs, cluster_size, NULL, errp);
|
||||||
if (!s->done_bitmap) {
|
if (!s->done_bitmap) {
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
bdrv_disable_dirty_bitmap(s->done_bitmap);
|
bdrv_disable_dirty_bitmap(s->done_bitmap);
|
||||||
|
|
||||||
/* s->access_bitmap starts equal to bcs bitmap */
|
/* s->access_bitmap starts equal to bcs bitmap */
|
||||||
s->access_bitmap = bdrv_create_dirty_bitmap(bs, cluster_size, NULL, errp);
|
s->access_bitmap = bdrv_create_dirty_bitmap(bs, cluster_size, NULL, errp);
|
||||||
if (!s->access_bitmap) {
|
if (!s->access_bitmap) {
|
||||||
ret = -EINVAL;
|
return -EINVAL;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
bdrv_disable_dirty_bitmap(s->access_bitmap);
|
bdrv_disable_dirty_bitmap(s->access_bitmap);
|
||||||
bdrv_dirty_bitmap_merge_internal(s->access_bitmap,
|
bdrv_dirty_bitmap_merge_internal(s->access_bitmap,
|
||||||
@@ -487,11 +479,7 @@ static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
|
|
||||||
qemu_co_mutex_init(&s->lock);
|
qemu_co_mutex_init(&s->lock);
|
||||||
QLIST_INIT(&s->frozen_read_reqs);
|
QLIST_INIT(&s->frozen_read_reqs);
|
||||||
|
return 0;
|
||||||
ret = 0;
|
|
||||||
out:
|
|
||||||
aio_context_release(ctx);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cbw_close(BlockDriverState *bs)
|
static void cbw_close(BlockDriverState *bs)
|
||||||
|
|||||||
+1
-21
@@ -114,7 +114,6 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ctx = bdrv_get_aio_context(bs);
|
ctx = bdrv_get_aio_context(bs);
|
||||||
aio_context_acquire(ctx);
|
|
||||||
|
|
||||||
if (export->iothread) {
|
if (export->iothread) {
|
||||||
IOThread *iothread;
|
IOThread *iothread;
|
||||||
@@ -133,8 +132,6 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
set_context_errp = fixed_iothread ? errp : NULL;
|
set_context_errp = fixed_iothread ? errp : NULL;
|
||||||
ret = bdrv_try_change_aio_context(bs, new_ctx, NULL, set_context_errp);
|
ret = bdrv_try_change_aio_context(bs, new_ctx, NULL, set_context_errp);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
aio_context_release(ctx);
|
|
||||||
aio_context_acquire(new_ctx);
|
|
||||||
ctx = new_ctx;
|
ctx = new_ctx;
|
||||||
} else if (fixed_iothread) {
|
} else if (fixed_iothread) {
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -191,8 +188,6 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|||||||
assert(exp->blk != NULL);
|
assert(exp->blk != NULL);
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&block_exports, exp, next);
|
QLIST_INSERT_HEAD(&block_exports, exp, next);
|
||||||
|
|
||||||
aio_context_release(ctx);
|
|
||||||
return exp;
|
return exp;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@@ -200,7 +195,6 @@ fail:
|
|||||||
blk_set_dev_ops(blk, NULL, NULL);
|
blk_set_dev_ops(blk, NULL, NULL);
|
||||||
blk_unref(blk);
|
blk_unref(blk);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
if (exp) {
|
if (exp) {
|
||||||
g_free(exp->id);
|
g_free(exp->id);
|
||||||
g_free(exp);
|
g_free(exp);
|
||||||
@@ -218,9 +212,6 @@ void blk_exp_ref(BlockExport *exp)
|
|||||||
static void blk_exp_delete_bh(void *opaque)
|
static void blk_exp_delete_bh(void *opaque)
|
||||||
{
|
{
|
||||||
BlockExport *exp = opaque;
|
BlockExport *exp = opaque;
|
||||||
AioContext *aio_context = exp->ctx;
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
assert(exp->refcount == 0);
|
assert(exp->refcount == 0);
|
||||||
QLIST_REMOVE(exp, next);
|
QLIST_REMOVE(exp, next);
|
||||||
@@ -230,8 +221,6 @@ static void blk_exp_delete_bh(void *opaque)
|
|||||||
qapi_event_send_block_export_deleted(exp->id);
|
qapi_event_send_block_export_deleted(exp->id);
|
||||||
g_free(exp->id);
|
g_free(exp->id);
|
||||||
g_free(exp);
|
g_free(exp);
|
||||||
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void blk_exp_unref(BlockExport *exp)
|
void blk_exp_unref(BlockExport *exp)
|
||||||
@@ -249,22 +238,16 @@ void blk_exp_unref(BlockExport *exp)
|
|||||||
* connections and other internally held references start to shut down. When
|
* connections and other internally held references start to shut down. When
|
||||||
* the function returns, there may still be active references while the export
|
* the function returns, there may still be active references while the export
|
||||||
* is in the process of shutting down.
|
* is in the process of shutting down.
|
||||||
*
|
|
||||||
* Acquires exp->ctx internally. Callers must *not* hold the lock.
|
|
||||||
*/
|
*/
|
||||||
void blk_exp_request_shutdown(BlockExport *exp)
|
void blk_exp_request_shutdown(BlockExport *exp)
|
||||||
{
|
{
|
||||||
AioContext *aio_context = exp->ctx;
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the user doesn't own the export any more, it is already shutting
|
* If the user doesn't own the export any more, it is already shutting
|
||||||
* down. We must not call .request_shutdown and decrease the refcount a
|
* down. We must not call .request_shutdown and decrease the refcount a
|
||||||
* second time.
|
* second time.
|
||||||
*/
|
*/
|
||||||
if (!exp->user_owned) {
|
if (!exp->user_owned) {
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
exp->drv->request_shutdown(exp);
|
exp->drv->request_shutdown(exp);
|
||||||
@@ -272,9 +255,6 @@ void blk_exp_request_shutdown(BlockExport *exp)
|
|||||||
assert(exp->user_owned);
|
assert(exp->user_owned);
|
||||||
exp->user_owned = false;
|
exp->user_owned = false;
|
||||||
blk_exp_unref(exp);
|
blk_exp_unref(exp);
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+5
-40
@@ -294,8 +294,6 @@ static void bdrv_co_drain_bh_cb(void *opaque)
|
|||||||
BlockDriverState *bs = data->bs;
|
BlockDriverState *bs = data->bs;
|
||||||
|
|
||||||
if (bs) {
|
if (bs) {
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
bdrv_dec_in_flight(bs);
|
bdrv_dec_in_flight(bs);
|
||||||
if (data->begin) {
|
if (data->begin) {
|
||||||
bdrv_do_drained_begin(bs, data->parent, data->poll);
|
bdrv_do_drained_begin(bs, data->parent, data->poll);
|
||||||
@@ -303,7 +301,6 @@ static void bdrv_co_drain_bh_cb(void *opaque)
|
|||||||
assert(!data->poll);
|
assert(!data->poll);
|
||||||
bdrv_do_drained_end(bs, data->parent);
|
bdrv_do_drained_end(bs, data->parent);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
} else {
|
} else {
|
||||||
assert(data->begin);
|
assert(data->begin);
|
||||||
bdrv_drain_all_begin();
|
bdrv_drain_all_begin();
|
||||||
@@ -320,8 +317,6 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs,
|
|||||||
{
|
{
|
||||||
BdrvCoDrainData data;
|
BdrvCoDrainData data;
|
||||||
Coroutine *self = qemu_coroutine_self();
|
Coroutine *self = qemu_coroutine_self();
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
AioContext *co_ctx = qemu_coroutine_get_aio_context(self);
|
|
||||||
|
|
||||||
/* Calling bdrv_drain() from a BH ensures the current coroutine yields and
|
/* Calling bdrv_drain() from a BH ensures the current coroutine yields and
|
||||||
* other coroutines run if they were queued by aio_co_enter(). */
|
* other coroutines run if they were queued by aio_co_enter(). */
|
||||||
@@ -340,17 +335,6 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs,
|
|||||||
bdrv_inc_in_flight(bs);
|
bdrv_inc_in_flight(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Temporarily drop the lock across yield or we would get deadlocks.
|
|
||||||
* bdrv_co_drain_bh_cb() reaquires the lock as needed.
|
|
||||||
*
|
|
||||||
* When we yield below, the lock for the current context will be
|
|
||||||
* released, so if this is actually the lock that protects bs, don't drop
|
|
||||||
* it a second time.
|
|
||||||
*/
|
|
||||||
if (ctx != co_ctx) {
|
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
|
||||||
replay_bh_schedule_oneshot_event(qemu_get_aio_context(),
|
replay_bh_schedule_oneshot_event(qemu_get_aio_context(),
|
||||||
bdrv_co_drain_bh_cb, &data);
|
bdrv_co_drain_bh_cb, &data);
|
||||||
|
|
||||||
@@ -358,11 +342,6 @@ static void coroutine_fn bdrv_co_yield_to_drain(BlockDriverState *bs,
|
|||||||
/* If we are resumed from some other event (such as an aio completion or a
|
/* If we are resumed from some other event (such as an aio completion or a
|
||||||
* timer callback), it is a bug in the caller that should be fixed. */
|
* timer callback), it is a bug in the caller that should be fixed. */
|
||||||
assert(data.done);
|
assert(data.done);
|
||||||
|
|
||||||
/* Reacquire the AioContext of bs if we dropped it */
|
|
||||||
if (ctx != co_ctx) {
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bdrv_do_drained_begin(BlockDriverState *bs, BdrvChild *parent,
|
static void bdrv_do_drained_begin(BlockDriverState *bs, BdrvChild *parent,
|
||||||
@@ -478,13 +457,12 @@ static bool bdrv_drain_all_poll(void)
|
|||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
/* bdrv_drain_poll() can't make changes to the graph and we are holding the
|
/*
|
||||||
* main AioContext lock, so iterating bdrv_next_all_states() is safe. */
|
* bdrv_drain_poll() can't make changes to the graph and we hold the BQL,
|
||||||
|
* so iterating bdrv_next_all_states() is safe.
|
||||||
|
*/
|
||||||
while ((bs = bdrv_next_all_states(bs))) {
|
while ((bs = bdrv_next_all_states(bs))) {
|
||||||
AioContext *aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
result |= bdrv_drain_poll(bs, NULL, true);
|
result |= bdrv_drain_poll(bs, NULL, true);
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -525,11 +503,7 @@ void bdrv_drain_all_begin_nopoll(void)
|
|||||||
/* Quiesce all nodes, without polling in-flight requests yet. The graph
|
/* Quiesce all nodes, without polling in-flight requests yet. The graph
|
||||||
* cannot change during this loop. */
|
* cannot change during this loop. */
|
||||||
while ((bs = bdrv_next_all_states(bs))) {
|
while ((bs = bdrv_next_all_states(bs))) {
|
||||||
AioContext *aio_context = bdrv_get_aio_context(bs);
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
bdrv_do_drained_begin(bs, NULL, false);
|
bdrv_do_drained_begin(bs, NULL, false);
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,11 +562,7 @@ void bdrv_drain_all_end(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while ((bs = bdrv_next_all_states(bs))) {
|
while ((bs = bdrv_next_all_states(bs))) {
|
||||||
AioContext *aio_context = bdrv_get_aio_context(bs);
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
bdrv_do_drained_end(bs, NULL);
|
bdrv_do_drained_end(bs, NULL);
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
|
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
|
||||||
@@ -2368,15 +2338,10 @@ int bdrv_flush_all(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
|
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
|
||||||
AioContext *aio_context = bdrv_get_aio_context(bs);
|
int ret = bdrv_flush(bs);
|
||||||
int ret;
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
ret = bdrv_flush(bs);
|
|
||||||
if (ret < 0 && !result) {
|
if (ret < 0 && !result) {
|
||||||
result = ret;
|
result = ret;
|
||||||
}
|
}
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -662,7 +662,6 @@ static int mirror_exit_common(Job *job)
|
|||||||
MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
|
MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
|
||||||
BlockJob *bjob = &s->common;
|
BlockJob *bjob = &s->common;
|
||||||
MirrorBDSOpaque *bs_opaque;
|
MirrorBDSOpaque *bs_opaque;
|
||||||
AioContext *replace_aio_context = NULL;
|
|
||||||
BlockDriverState *src;
|
BlockDriverState *src;
|
||||||
BlockDriverState *target_bs;
|
BlockDriverState *target_bs;
|
||||||
BlockDriverState *mirror_top_bs;
|
BlockDriverState *mirror_top_bs;
|
||||||
@@ -677,7 +676,6 @@ static int mirror_exit_common(Job *job)
|
|||||||
}
|
}
|
||||||
s->prepared = true;
|
s->prepared = true;
|
||||||
|
|
||||||
aio_context_acquire(qemu_get_aio_context());
|
|
||||||
bdrv_graph_rdlock_main_loop();
|
bdrv_graph_rdlock_main_loop();
|
||||||
|
|
||||||
mirror_top_bs = s->mirror_top_bs;
|
mirror_top_bs = s->mirror_top_bs;
|
||||||
@@ -742,11 +740,6 @@ static int mirror_exit_common(Job *job)
|
|||||||
}
|
}
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
|
|
||||||
if (s->to_replace) {
|
|
||||||
replace_aio_context = bdrv_get_aio_context(s->to_replace);
|
|
||||||
aio_context_acquire(replace_aio_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->should_complete && !abort) {
|
if (s->should_complete && !abort) {
|
||||||
BlockDriverState *to_replace = s->to_replace ?: src;
|
BlockDriverState *to_replace = s->to_replace ?: src;
|
||||||
bool ro = bdrv_is_read_only(to_replace);
|
bool ro = bdrv_is_read_only(to_replace);
|
||||||
@@ -785,9 +778,6 @@ static int mirror_exit_common(Job *job)
|
|||||||
error_free(s->replace_blocker);
|
error_free(s->replace_blocker);
|
||||||
bdrv_unref(s->to_replace);
|
bdrv_unref(s->to_replace);
|
||||||
}
|
}
|
||||||
if (replace_aio_context) {
|
|
||||||
aio_context_release(replace_aio_context);
|
|
||||||
}
|
|
||||||
g_free(s->replaces);
|
g_free(s->replaces);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -811,8 +801,6 @@ static int mirror_exit_common(Job *job)
|
|||||||
bdrv_unref(mirror_top_bs);
|
bdrv_unref(mirror_top_bs);
|
||||||
bdrv_unref(src);
|
bdrv_unref(src);
|
||||||
|
|
||||||
aio_context_release(qemu_get_aio_context());
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1191,24 +1179,17 @@ static void mirror_complete(Job *job, Error **errp)
|
|||||||
|
|
||||||
/* block all operations on to_replace bs */
|
/* block all operations on to_replace bs */
|
||||||
if (s->replaces) {
|
if (s->replaces) {
|
||||||
AioContext *replace_aio_context;
|
|
||||||
|
|
||||||
s->to_replace = bdrv_find_node(s->replaces);
|
s->to_replace = bdrv_find_node(s->replaces);
|
||||||
if (!s->to_replace) {
|
if (!s->to_replace) {
|
||||||
error_setg(errp, "Node name '%s' not found", s->replaces);
|
error_setg(errp, "Node name '%s' not found", s->replaces);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
replace_aio_context = bdrv_get_aio_context(s->to_replace);
|
|
||||||
aio_context_acquire(replace_aio_context);
|
|
||||||
|
|
||||||
/* TODO Translate this into child freeze system. */
|
/* TODO Translate this into child freeze system. */
|
||||||
error_setg(&s->replace_blocker,
|
error_setg(&s->replace_blocker,
|
||||||
"block device is in use by block-job-complete");
|
"block device is in use by block-job-complete");
|
||||||
bdrv_op_block_all(s->to_replace, s->replace_blocker);
|
bdrv_op_block_all(s->to_replace, s->replace_blocker);
|
||||||
bdrv_ref(s->to_replace);
|
bdrv_ref(s->to_replace);
|
||||||
|
|
||||||
aio_context_release(replace_aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s->should_complete = true;
|
s->should_complete = true;
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
|||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BdrvDirtyBitmap *bitmap;
|
BdrvDirtyBitmap *bitmap;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
if (!name || name[0] == '\0') {
|
if (!name || name[0] == '\0') {
|
||||||
error_setg(errp, "Bitmap name cannot be empty");
|
error_setg(errp, "Bitmap name cannot be empty");
|
||||||
@@ -107,14 +106,11 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
if (has_granularity) {
|
if (has_granularity) {
|
||||||
if (granularity < 512 || !is_power_of_2(granularity)) {
|
if (granularity < 512 || !is_power_of_2(granularity)) {
|
||||||
error_setg(errp, "Granularity must be power of 2 "
|
error_setg(errp, "Granularity must be power of 2 "
|
||||||
"and at least 512");
|
"and at least 512");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Default to cluster size, if available: */
|
/* Default to cluster size, if available: */
|
||||||
@@ -132,12 +128,12 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
|||||||
if (persistent &&
|
if (persistent &&
|
||||||
!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp))
|
!bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp))
|
||||||
{
|
{
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
|
bitmap = bdrv_create_dirty_bitmap(bs, granularity, name, errp);
|
||||||
if (bitmap == NULL) {
|
if (bitmap == NULL) {
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
@@ -145,9 +141,6 @@ void qmp_block_dirty_bitmap_add(const char *node, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bdrv_dirty_bitmap_set_persistence(bitmap, persistent);
|
bdrv_dirty_bitmap_set_persistence(bitmap, persistent);
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BdrvDirtyBitmap *block_dirty_bitmap_remove(const char *node, const char *name,
|
BdrvDirtyBitmap *block_dirty_bitmap_remove(const char *node, const char *name,
|
||||||
@@ -157,7 +150,6 @@ BdrvDirtyBitmap *block_dirty_bitmap_remove(const char *node, const char *name,
|
|||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BdrvDirtyBitmap *bitmap;
|
BdrvDirtyBitmap *bitmap;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
@@ -166,19 +158,14 @@ BdrvDirtyBitmap *block_dirty_bitmap_remove(const char *node, const char *name,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO,
|
if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO,
|
||||||
errp)) {
|
errp)) {
|
||||||
aio_context_release(aio_context);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bdrv_dirty_bitmap_get_persistence(bitmap) &&
|
if (bdrv_dirty_bitmap_get_persistence(bitmap) &&
|
||||||
bdrv_remove_persistent_dirty_bitmap(bs, name, errp) < 0)
|
bdrv_remove_persistent_dirty_bitmap(bs, name, errp) < 0)
|
||||||
{
|
{
|
||||||
aio_context_release(aio_context);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +177,6 @@ BdrvDirtyBitmap *block_dirty_bitmap_remove(const char *node, const char *name,
|
|||||||
*bitmap_bs = bs;
|
*bitmap_bs = bs;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
return release ? NULL : bitmap;
|
return release ? NULL : bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,6 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||||||
const char *id = qdict_get_str(qdict, "id");
|
const char *id = qdict_get_str(qdict, "id");
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
AioContext *aio_context;
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
@@ -168,14 +167,10 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = blk_get_aio_context(blk);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
bs = blk_bs(blk);
|
bs = blk_bs(blk);
|
||||||
if (bs) {
|
if (bs) {
|
||||||
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
|
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
|
||||||
error_report_err(local_err);
|
error_report_err(local_err);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,8 +191,6 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||||||
} else {
|
} else {
|
||||||
blk_unref(blk);
|
blk_unref(blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void hmp_commit(Monitor *mon, const QDict *qdict)
|
void hmp_commit(Monitor *mon, const QDict *qdict)
|
||||||
@@ -213,7 +206,6 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
|
|||||||
ret = blk_commit_all();
|
ret = blk_commit_all();
|
||||||
} else {
|
} else {
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
blk = blk_by_name(device);
|
blk = blk_by_name(device);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
@@ -222,18 +214,13 @@ void hmp_commit(Monitor *mon, const QDict *qdict)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bs = bdrv_skip_implicit_filters(blk_bs(blk));
|
bs = bdrv_skip_implicit_filters(blk_bs(blk));
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
if (!blk_is_available(blk)) {
|
if (!blk_is_available(blk)) {
|
||||||
error_report("Device '%s' has no medium", device);
|
error_report("Device '%s' has no medium", device);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = bdrv_commit(bs);
|
ret = bdrv_commit(bs);
|
||||||
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report("'commit' error for '%s': %s", device, strerror(-ret));
|
error_report("'commit' error for '%s': %s", device, strerror(-ret));
|
||||||
@@ -560,7 +547,6 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict)
|
|||||||
BlockBackend *blk = NULL;
|
BlockBackend *blk = NULL;
|
||||||
BlockDriverState *bs = NULL;
|
BlockDriverState *bs = NULL;
|
||||||
BlockBackend *local_blk = NULL;
|
BlockBackend *local_blk = NULL;
|
||||||
AioContext *ctx = NULL;
|
|
||||||
bool qdev = qdict_get_try_bool(qdict, "qdev", false);
|
bool qdev = qdict_get_try_bool(qdict, "qdev", false);
|
||||||
const char *device = qdict_get_str(qdict, "device");
|
const char *device = qdict_get_str(qdict, "device");
|
||||||
const char *command = qdict_get_str(qdict, "command");
|
const char *command = qdict_get_str(qdict, "command");
|
||||||
@@ -582,9 +568,6 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = blk ? blk_get_aio_context(blk) : bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
|
|
||||||
if (bs) {
|
if (bs) {
|
||||||
blk = local_blk = blk_new(bdrv_get_aio_context(bs), 0, BLK_PERM_ALL);
|
blk = local_blk = blk_new(bdrv_get_aio_context(bs), 0, BLK_PERM_ALL);
|
||||||
ret = blk_insert_bs(blk, bs, &err);
|
ret = blk_insert_bs(blk, bs, &err);
|
||||||
@@ -622,11 +605,6 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict)
|
|||||||
|
|
||||||
fail:
|
fail:
|
||||||
blk_unref(local_blk);
|
blk_unref(local_blk);
|
||||||
|
|
||||||
if (ctx) {
|
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
hmp_handle_error(mon, err);
|
hmp_handle_error(mon, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -882,7 +860,6 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
|
|||||||
int nb_sns, i;
|
int nb_sns, i;
|
||||||
int total;
|
int total;
|
||||||
int *global_snapshots;
|
int *global_snapshots;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
typedef struct SnapshotEntry {
|
typedef struct SnapshotEntry {
|
||||||
QEMUSnapshotInfo sn;
|
QEMUSnapshotInfo sn;
|
||||||
@@ -909,11 +886,8 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
|
|||||||
error_report_err(err);
|
error_report_err(err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
nb_sns = bdrv_snapshot_list(bs, &sn_tab);
|
nb_sns = bdrv_snapshot_list(bs, &sn_tab);
|
||||||
aio_context_release(aio_context);
|
|
||||||
|
|
||||||
if (nb_sns < 0) {
|
if (nb_sns < 0) {
|
||||||
monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
|
monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns);
|
||||||
@@ -924,9 +898,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
|
|||||||
int bs1_nb_sns = 0;
|
int bs1_nb_sns = 0;
|
||||||
ImageEntry *ie;
|
ImageEntry *ie;
|
||||||
SnapshotEntry *se;
|
SnapshotEntry *se;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs1);
|
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if (bdrv_can_snapshot(bs1)) {
|
if (bdrv_can_snapshot(bs1)) {
|
||||||
sn = NULL;
|
sn = NULL;
|
||||||
bs1_nb_sns = bdrv_snapshot_list(bs1, &sn);
|
bs1_nb_sns = bdrv_snapshot_list(bs1, &sn);
|
||||||
@@ -944,7 +916,6 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
|
|||||||
}
|
}
|
||||||
g_free(sn);
|
g_free(sn);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (no_snapshot) {
|
if (no_snapshot) {
|
||||||
|
|||||||
+3
-24
@@ -174,7 +174,6 @@ blockdev_remove_medium(const char *device, const char *id, Error **errp)
|
|||||||
{
|
{
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
AioContext *aio_context;
|
|
||||||
bool has_attached_device;
|
bool has_attached_device;
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
@@ -204,13 +203,10 @@ blockdev_remove_medium(const char *device, const char *id, Error **errp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
bdrv_graph_rdlock_main_loop();
|
bdrv_graph_rdlock_main_loop();
|
||||||
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) {
|
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_EJECT, errp)) {
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
|
|
||||||
@@ -223,9 +219,6 @@ blockdev_remove_medium(const char *device, const char *id, Error **errp)
|
|||||||
* value passed here (i.e. false). */
|
* value passed here (i.e. false). */
|
||||||
blk_dev_change_media_cb(blk, false, &error_abort);
|
blk_dev_change_media_cb(blk, false, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_blockdev_remove_medium(const char *id, Error **errp)
|
void qmp_blockdev_remove_medium(const char *id, Error **errp)
|
||||||
@@ -237,7 +230,6 @@ static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
|
|||||||
BlockDriverState *bs, Error **errp)
|
BlockDriverState *bs, Error **errp)
|
||||||
{
|
{
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
AioContext *ctx;
|
|
||||||
bool has_device;
|
bool has_device;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@@ -259,11 +251,7 @@ static void qmp_blockdev_insert_anon_medium(BlockBackend *blk,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
ret = blk_insert_bs(blk, bs, errp);
|
ret = blk_insert_bs(blk, bs, errp);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -374,9 +362,7 @@ void qmp_blockdev_change_medium(const char *device,
|
|||||||
qdict_put_str(options, "driver", format);
|
qdict_put_str(options, "driver", format);
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_acquire(qemu_get_aio_context());
|
|
||||||
medium_bs = bdrv_open(filename, NULL, options, bdrv_flags, errp);
|
medium_bs = bdrv_open(filename, NULL, options, bdrv_flags, errp);
|
||||||
aio_context_release(qemu_get_aio_context());
|
|
||||||
|
|
||||||
if (!medium_bs) {
|
if (!medium_bs) {
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -437,20 +423,16 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, Error **errp)
|
|||||||
ThrottleConfig cfg;
|
ThrottleConfig cfg;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
blk = qmp_get_blk(arg->device, arg->id, errp);
|
blk = qmp_get_blk(arg->device, arg->id, errp);
|
||||||
if (!blk) {
|
if (!blk) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = blk_get_aio_context(blk);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
bs = blk_bs(blk);
|
bs = blk_bs(blk);
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
error_setg(errp, "Device has no medium");
|
error_setg(errp, "Device has no medium");
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
throttle_config_init(&cfg);
|
throttle_config_init(&cfg);
|
||||||
@@ -505,7 +487,7 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, Error **errp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!throttle_is_valid(&cfg, errp)) {
|
if (!throttle_is_valid(&cfg, errp)) {
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (throttle_enabled(&cfg)) {
|
if (throttle_enabled(&cfg)) {
|
||||||
@@ -522,9 +504,6 @@ void qmp_block_set_io_throttle(BlockIOThrottle *arg, Error **errp)
|
|||||||
/* If all throttling settings are set to 0, disable I/O limits */
|
/* If all throttling settings are set to 0, disable I/O limits */
|
||||||
blk_io_limits_disable(blk);
|
blk_io_limits_disable(blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_block_latency_histogram_set(
|
void qmp_block_latency_histogram_set(
|
||||||
|
|||||||
+3
-15
@@ -234,13 +234,11 @@ bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, Error **errp)
|
|||||||
int ret;
|
int ret;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
aio_context_acquire(bdrv_get_aio_context(bs));
|
|
||||||
|
|
||||||
size = bdrv_getlength(bs);
|
size = bdrv_getlength(bs);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
error_setg_errno(errp, -size, "Can't get image size '%s'",
|
error_setg_errno(errp, -size, "Can't get image size '%s'",
|
||||||
bs->exact_filename);
|
bs->exact_filename);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdrv_refresh_filename(bs);
|
bdrv_refresh_filename(bs);
|
||||||
@@ -265,7 +263,7 @@ bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, Error **errp)
|
|||||||
info->format_specific = bdrv_get_specific_info(bs, &err);
|
info->format_specific = bdrv_get_specific_info(bs, &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
backing_filename = bs->backing_file;
|
backing_filename = bs->backing_file;
|
||||||
if (backing_filename[0] != '\0') {
|
if (backing_filename[0] != '\0') {
|
||||||
@@ -300,11 +298,8 @@ bdrv_do_query_node_info(BlockDriverState *bs, BlockNodeInfo *info, Error **errp)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
aio_context_release(bdrv_get_aio_context(bs));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -709,15 +704,10 @@ BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
|
|||||||
/* Just to be safe if query_nodes is not always initialized */
|
/* Just to be safe if query_nodes is not always initialized */
|
||||||
if (has_query_nodes && query_nodes) {
|
if (has_query_nodes && query_nodes) {
|
||||||
for (bs = bdrv_next_node(NULL); bs; bs = bdrv_next_node(bs)) {
|
for (bs = bdrv_next_node(NULL); bs; bs = bdrv_next_node(bs)) {
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
QAPI_LIST_APPEND(tail, bdrv_query_bds_stats(bs, false));
|
QAPI_LIST_APPEND(tail, bdrv_query_bds_stats(bs, false));
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (blk = blk_all_next(NULL); blk; blk = blk_all_next(blk)) {
|
for (blk = blk_all_next(NULL); blk; blk = blk_all_next(blk)) {
|
||||||
AioContext *ctx = blk_get_aio_context(blk);
|
|
||||||
BlockStats *s;
|
BlockStats *s;
|
||||||
char *qdev;
|
char *qdev;
|
||||||
|
|
||||||
@@ -725,7 +715,6 @@ BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
s = bdrv_query_bds_stats(blk_bs(blk), true);
|
s = bdrv_query_bds_stats(blk_bs(blk), true);
|
||||||
s->device = g_strdup(blk_name(blk));
|
s->device = g_strdup(blk_name(blk));
|
||||||
|
|
||||||
@@ -737,7 +726,6 @@ BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bdrv_query_blk_stats(s->stats, blk);
|
bdrv_query_blk_stats(s->stats, blk);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
QAPI_LIST_APPEND(tail, s);
|
QAPI_LIST_APPEND(tail, s);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,7 +470,6 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
AioContext *ctx;
|
|
||||||
bool has_size;
|
bool has_size;
|
||||||
uint64_t offset, size;
|
uint64_t offset, size;
|
||||||
BdrvChildRole file_role;
|
BdrvChildRole file_role;
|
||||||
@@ -522,11 +521,7 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
bs->file->bs->filename);
|
bs->file->bs->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
ret = raw_apply_options(bs, s, offset, has_size, size, errp);
|
ret = raw_apply_options(bs, s, offset, has_size, size, errp);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-55
@@ -394,14 +394,7 @@ static void reopen_backing_file(BlockDriverState *bs, bool writable,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (reopen_queue) {
|
if (reopen_queue) {
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
if (ctx != qemu_get_aio_context()) {
|
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
|
||||||
bdrv_reopen_multiple(reopen_queue, errp);
|
bdrv_reopen_multiple(reopen_queue, errp);
|
||||||
if (ctx != qemu_get_aio_context()) {
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,14 +455,11 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
BlockDriverState *top_bs;
|
BlockDriverState *top_bs;
|
||||||
BdrvChild *active_disk, *hidden_disk, *secondary_disk;
|
BdrvChild *active_disk, *hidden_disk, *secondary_disk;
|
||||||
int64_t active_length, hidden_length, disk_length;
|
int64_t active_length, hidden_length, disk_length;
|
||||||
AioContext *aio_context;
|
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
BackupPerf perf = { .use_copy_range = true, .max_workers = 1 };
|
BackupPerf perf = { .use_copy_range = true, .max_workers = 1 };
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
s = bs->opaque;
|
s = bs->opaque;
|
||||||
|
|
||||||
if (s->stage == BLOCK_REPLICATION_DONE ||
|
if (s->stage == BLOCK_REPLICATION_DONE ||
|
||||||
@@ -479,20 +469,17 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
* Ignore the request because the secondary side of replication
|
* Ignore the request because the secondary side of replication
|
||||||
* doesn't have to do anything anymore.
|
* doesn't have to do anything anymore.
|
||||||
*/
|
*/
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->stage != BLOCK_REPLICATION_NONE) {
|
if (s->stage != BLOCK_REPLICATION_NONE) {
|
||||||
error_setg(errp, "Block replication is running or done");
|
error_setg(errp, "Block replication is running or done");
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->mode != mode) {
|
if (s->mode != mode) {
|
||||||
error_setg(errp, "The parameter mode's value is invalid, needs %d,"
|
error_setg(errp, "The parameter mode's value is invalid, needs %d,"
|
||||||
" but got %d", s->mode, mode);
|
" but got %d", s->mode, mode);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,7 +492,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (!active_disk || !active_disk->bs || !active_disk->bs->backing) {
|
if (!active_disk || !active_disk->bs || !active_disk->bs->backing) {
|
||||||
error_setg(errp, "Active disk doesn't have backing file");
|
error_setg(errp, "Active disk doesn't have backing file");
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -513,7 +499,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (!hidden_disk->bs || !hidden_disk->bs->backing) {
|
if (!hidden_disk->bs || !hidden_disk->bs->backing) {
|
||||||
error_setg(errp, "Hidden disk doesn't have backing file");
|
error_setg(errp, "Hidden disk doesn't have backing file");
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,7 +506,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (!secondary_disk->bs || !bdrv_has_blk(secondary_disk->bs)) {
|
if (!secondary_disk->bs || !bdrv_has_blk(secondary_disk->bs)) {
|
||||||
error_setg(errp, "The secondary disk doesn't have block backend");
|
error_setg(errp, "The secondary disk doesn't have block backend");
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
@@ -534,7 +518,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
active_length != hidden_length || hidden_length != disk_length) {
|
active_length != hidden_length || hidden_length != disk_length) {
|
||||||
error_setg(errp, "Active disk, hidden disk, secondary disk's length"
|
error_setg(errp, "Active disk, hidden disk, secondary disk's length"
|
||||||
" are not the same");
|
" are not the same");
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,7 +529,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
!hidden_disk->bs->drv->bdrv_make_empty) {
|
!hidden_disk->bs->drv->bdrv_make_empty) {
|
||||||
error_setg(errp,
|
error_setg(errp,
|
||||||
"Active disk or hidden disk doesn't support make_empty");
|
"Active disk or hidden disk doesn't support make_empty");
|
||||||
aio_context_release(aio_context);
|
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -556,7 +538,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
reopen_backing_file(bs, true, &local_err);
|
reopen_backing_file(bs, true, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,7 +550,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
bdrv_graph_wrunlock();
|
bdrv_graph_wrunlock();
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -580,7 +560,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
bdrv_graph_wrunlock();
|
bdrv_graph_wrunlock();
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -594,7 +573,6 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
error_setg(errp, "No top_bs or it is invalid");
|
error_setg(errp, "No top_bs or it is invalid");
|
||||||
bdrv_graph_wrunlock();
|
bdrv_graph_wrunlock();
|
||||||
reopen_backing_file(bs, false, NULL);
|
reopen_backing_file(bs, false, NULL);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bdrv_op_block_all(top_bs, s->blocker);
|
bdrv_op_block_all(top_bs, s->blocker);
|
||||||
@@ -612,13 +590,11 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
backup_job_cleanup(bs);
|
backup_job_cleanup(bs);
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
job_start(&s->backup_job->job);
|
job_start(&s->backup_job->job);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
aio_context_release(aio_context);
|
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -629,18 +605,12 @@ static void replication_start(ReplicationState *rs, ReplicationMode mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
s->error = 0;
|
s->error = 0;
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void replication_do_checkpoint(ReplicationState *rs, Error **errp)
|
static void replication_do_checkpoint(ReplicationState *rs, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = rs->opaque;
|
BlockDriverState *bs = rs->opaque;
|
||||||
BDRVReplicationState *s;
|
BDRVReplicationState *s = bs->opaque;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
s = bs->opaque;
|
|
||||||
|
|
||||||
if (s->stage == BLOCK_REPLICATION_DONE ||
|
if (s->stage == BLOCK_REPLICATION_DONE ||
|
||||||
s->stage == BLOCK_REPLICATION_FAILOVER) {
|
s->stage == BLOCK_REPLICATION_FAILOVER) {
|
||||||
@@ -649,38 +619,28 @@ static void replication_do_checkpoint(ReplicationState *rs, Error **errp)
|
|||||||
* Ignore the request because the secondary side of replication
|
* Ignore the request because the secondary side of replication
|
||||||
* doesn't have to do anything anymore.
|
* doesn't have to do anything anymore.
|
||||||
*/
|
*/
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->mode == REPLICATION_MODE_SECONDARY) {
|
if (s->mode == REPLICATION_MODE_SECONDARY) {
|
||||||
secondary_do_checkpoint(bs, errp);
|
secondary_do_checkpoint(bs, errp);
|
||||||
}
|
}
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void replication_get_error(ReplicationState *rs, Error **errp)
|
static void replication_get_error(ReplicationState *rs, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = rs->opaque;
|
BlockDriverState *bs = rs->opaque;
|
||||||
BDRVReplicationState *s;
|
BDRVReplicationState *s = bs->opaque;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
s = bs->opaque;
|
|
||||||
|
|
||||||
if (s->stage == BLOCK_REPLICATION_NONE) {
|
if (s->stage == BLOCK_REPLICATION_NONE) {
|
||||||
error_setg(errp, "Block replication is not running");
|
error_setg(errp, "Block replication is not running");
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->error) {
|
if (s->error) {
|
||||||
error_setg(errp, "I/O error occurred");
|
error_setg(errp, "I/O error occurred");
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void replication_done(void *opaque, int ret)
|
static void replication_done(void *opaque, int ret)
|
||||||
@@ -708,12 +668,7 @@ static void replication_done(void *opaque, int ret)
|
|||||||
static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
|
static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = rs->opaque;
|
BlockDriverState *bs = rs->opaque;
|
||||||
BDRVReplicationState *s;
|
BDRVReplicationState *s = bs->opaque;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
s = bs->opaque;
|
|
||||||
|
|
||||||
if (s->stage == BLOCK_REPLICATION_DONE ||
|
if (s->stage == BLOCK_REPLICATION_DONE ||
|
||||||
s->stage == BLOCK_REPLICATION_FAILOVER) {
|
s->stage == BLOCK_REPLICATION_FAILOVER) {
|
||||||
@@ -722,13 +677,11 @@ static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
|
|||||||
* Ignore the request because the secondary side of replication
|
* Ignore the request because the secondary side of replication
|
||||||
* doesn't have to do anything anymore.
|
* doesn't have to do anything anymore.
|
||||||
*/
|
*/
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->stage != BLOCK_REPLICATION_RUNNING) {
|
if (s->stage != BLOCK_REPLICATION_RUNNING) {
|
||||||
error_setg(errp, "Block replication is not running");
|
error_setg(errp, "Block replication is not running");
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -744,15 +697,12 @@ static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
|
|||||||
* disk, secondary disk in backup_job_completed().
|
* disk, secondary disk in backup_job_completed().
|
||||||
*/
|
*/
|
||||||
if (s->backup_job) {
|
if (s->backup_job) {
|
||||||
aio_context_release(aio_context);
|
|
||||||
job_cancel_sync(&s->backup_job->job, true);
|
job_cancel_sync(&s->backup_job->job, true);
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!failover) {
|
if (!failover) {
|
||||||
secondary_do_checkpoint(bs, errp);
|
secondary_do_checkpoint(bs, errp);
|
||||||
s->stage = BLOCK_REPLICATION_DONE;
|
s->stage = BLOCK_REPLICATION_DONE;
|
||||||
aio_context_release(aio_context);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -765,10 +715,8 @@ static void replication_stop(ReplicationState *rs, bool failover, Error **errp)
|
|||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
aio_context_release(aio_context);
|
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *const replication_strong_runtime_opts[] = {
|
static const char *const replication_strong_runtime_opts[] = {
|
||||||
|
|||||||
+1
-21
@@ -527,9 +527,7 @@ static bool GRAPH_RDLOCK bdrv_all_snapshots_includes_bs(BlockDriverState *bs)
|
|||||||
return bdrv_has_blk(bs) || QLIST_EMPTY(&bs->parents);
|
return bdrv_has_blk(bs) || QLIST_EMPTY(&bs->parents);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Group operations. All block drivers are involved.
|
/* Group operations. All block drivers are involved. */
|
||||||
* These functions will properly handle dataplane (take aio_context_acquire
|
|
||||||
* when appropriate for appropriate block drivers) */
|
|
||||||
|
|
||||||
bool bdrv_all_can_snapshot(bool has_devices, strList *devices,
|
bool bdrv_all_can_snapshot(bool has_devices, strList *devices,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
@@ -547,14 +545,11 @@ bool bdrv_all_can_snapshot(bool has_devices, strList *devices,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if (devices || bdrv_all_snapshots_includes_bs(bs)) {
|
if (devices || bdrv_all_snapshots_includes_bs(bs)) {
|
||||||
ok = bdrv_can_snapshot(bs);
|
ok = bdrv_can_snapshot(bs);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
error_setg(errp, "Device '%s' is writable but does not support "
|
error_setg(errp, "Device '%s' is writable but does not support "
|
||||||
"snapshots", bdrv_get_device_or_node_name(bs));
|
"snapshots", bdrv_get_device_or_node_name(bs));
|
||||||
@@ -584,18 +579,15 @@ int bdrv_all_delete_snapshot(const char *name,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
QEMUSnapshotInfo sn1, *snapshot = &sn1;
|
QEMUSnapshotInfo sn1, *snapshot = &sn1;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if ((devices || bdrv_all_snapshots_includes_bs(bs)) &&
|
if ((devices || bdrv_all_snapshots_includes_bs(bs)) &&
|
||||||
bdrv_snapshot_find(bs, snapshot, name) >= 0)
|
bdrv_snapshot_find(bs, snapshot, name) >= 0)
|
||||||
{
|
{
|
||||||
ret = bdrv_snapshot_delete(bs, snapshot->id_str,
|
ret = bdrv_snapshot_delete(bs, snapshot->id_str,
|
||||||
snapshot->name, errp);
|
snapshot->name, errp);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_prepend(errp, "Could not delete snapshot '%s' on '%s': ",
|
error_prepend(errp, "Could not delete snapshot '%s' on '%s': ",
|
||||||
name, bdrv_get_device_or_node_name(bs));
|
name, bdrv_get_device_or_node_name(bs));
|
||||||
@@ -630,17 +622,14 @@ int bdrv_all_goto_snapshot(const char *name,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
bool all_snapshots_includes_bs;
|
bool all_snapshots_includes_bs;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
bdrv_graph_rdlock_main_loop();
|
bdrv_graph_rdlock_main_loop();
|
||||||
all_snapshots_includes_bs = bdrv_all_snapshots_includes_bs(bs);
|
all_snapshots_includes_bs = bdrv_all_snapshots_includes_bs(bs);
|
||||||
bdrv_graph_rdunlock_main_loop();
|
bdrv_graph_rdunlock_main_loop();
|
||||||
|
|
||||||
ret = (devices || all_snapshots_includes_bs) ?
|
ret = (devices || all_snapshots_includes_bs) ?
|
||||||
bdrv_snapshot_goto(bs, name, errp) : 0;
|
bdrv_snapshot_goto(bs, name, errp) : 0;
|
||||||
aio_context_release(ctx);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
bdrv_graph_rdlock_main_loop();
|
bdrv_graph_rdlock_main_loop();
|
||||||
error_prepend(errp, "Could not load snapshot '%s' on '%s': ",
|
error_prepend(errp, "Could not load snapshot '%s' on '%s': ",
|
||||||
@@ -672,15 +661,12 @@ int bdrv_all_has_snapshot(const char *name,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
QEMUSnapshotInfo sn;
|
QEMUSnapshotInfo sn;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if (devices || bdrv_all_snapshots_includes_bs(bs)) {
|
if (devices || bdrv_all_snapshots_includes_bs(bs)) {
|
||||||
ret = bdrv_snapshot_find(bs, &sn, name);
|
ret = bdrv_snapshot_find(bs, &sn, name);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (ret == -ENOENT) {
|
if (ret == -ENOENT) {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -717,10 +703,8 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
if (bs == vm_state_bs) {
|
if (bs == vm_state_bs) {
|
||||||
sn->vm_state_size = vm_state_size;
|
sn->vm_state_size = vm_state_size;
|
||||||
ret = bdrv_snapshot_create(bs, sn);
|
ret = bdrv_snapshot_create(bs, sn);
|
||||||
@@ -728,7 +712,6 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn,
|
|||||||
sn->vm_state_size = 0;
|
sn->vm_state_size = 0;
|
||||||
ret = bdrv_snapshot_create(bs, sn);
|
ret = bdrv_snapshot_create(bs, sn);
|
||||||
}
|
}
|
||||||
aio_context_release(ctx);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_setg(errp, "Could not create snapshot '%s' on '%s'",
|
error_setg(errp, "Could not create snapshot '%s' on '%s'",
|
||||||
sn->name, bdrv_get_device_or_node_name(bs));
|
sn->name, bdrv_get_device_or_node_name(bs));
|
||||||
@@ -759,13 +742,10 @@ BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs,
|
|||||||
iterbdrvs = bdrvs;
|
iterbdrvs = bdrvs;
|
||||||
while (iterbdrvs) {
|
while (iterbdrvs) {
|
||||||
BlockDriverState *bs = iterbdrvs->data;
|
BlockDriverState *bs = iterbdrvs->data;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
found = (devices || bdrv_all_snapshots_includes_bs(bs)) &&
|
found = (devices || bdrv_all_snapshots_includes_bs(bs)) &&
|
||||||
bdrv_can_snapshot(bs);
|
bdrv_can_snapshot(bs);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
if (vmstate_bs) {
|
if (vmstate_bs) {
|
||||||
if (g_str_equal(vmstate_bs,
|
if (g_str_equal(vmstate_bs,
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ void qmp_block_set_write_threshold(const char *node_name,
|
|||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
AioContext *aio_context;
|
|
||||||
|
|
||||||
bs = bdrv_find_node(node_name);
|
bs = bdrv_find_node(node_name);
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
@@ -41,12 +40,7 @@ void qmp_block_set_write_threshold(const char *node_name,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context = bdrv_get_aio_context(bs);
|
|
||||||
aio_context_acquire(aio_context);
|
|
||||||
|
|
||||||
bdrv_write_threshold_set(bs, threshold_bytes);
|
bdrv_write_threshold_set(bs, threshold_bytes);
|
||||||
|
|
||||||
aio_context_release(aio_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_write_threshold_check_write(BlockDriverState *bs, int64_t offset,
|
void bdrv_write_threshold_check_write(BlockDriverState *bs, int64_t offset,
|
||||||
|
|||||||
+53
-254
File diff suppressed because it is too large
Load Diff
-18
@@ -198,9 +198,7 @@ void block_job_remove_all_bdrv(BlockJob *job)
|
|||||||
* one to make sure that such a concurrent access does not attempt
|
* one to make sure that such a concurrent access does not attempt
|
||||||
* to process an already freed BdrvChild.
|
* to process an already freed BdrvChild.
|
||||||
*/
|
*/
|
||||||
aio_context_release(job->job.aio_context);
|
|
||||||
bdrv_graph_wrlock();
|
bdrv_graph_wrlock();
|
||||||
aio_context_acquire(job->job.aio_context);
|
|
||||||
while (job->nodes) {
|
while (job->nodes) {
|
||||||
GSList *l = job->nodes;
|
GSList *l = job->nodes;
|
||||||
BdrvChild *c = l->data;
|
BdrvChild *c = l->data;
|
||||||
@@ -234,28 +232,12 @@ int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
|
|||||||
uint64_t perm, uint64_t shared_perm, Error **errp)
|
uint64_t perm, uint64_t shared_perm, Error **errp)
|
||||||
{
|
{
|
||||||
BdrvChild *c;
|
BdrvChild *c;
|
||||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
|
||||||
bool need_context_ops;
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
|
|
||||||
bdrv_ref(bs);
|
bdrv_ref(bs);
|
||||||
|
|
||||||
need_context_ops = ctx != job->job.aio_context;
|
|
||||||
|
|
||||||
if (need_context_ops) {
|
|
||||||
if (job->job.aio_context != qemu_get_aio_context()) {
|
|
||||||
aio_context_release(job->job.aio_context);
|
|
||||||
}
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
}
|
|
||||||
c = bdrv_root_attach_child(bs, name, &child_job, 0, perm, shared_perm, job,
|
c = bdrv_root_attach_child(bs, name, &child_job, 0, perm, shared_perm, job,
|
||||||
errp);
|
errp);
|
||||||
if (need_context_ops) {
|
|
||||||
aio_context_release(ctx);
|
|
||||||
if (job->job.aio_context != qemu_get_aio_context()) {
|
|
||||||
aio_context_acquire(job->job.aio_context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c == NULL) {
|
if (c == NULL) {
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,6 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
|
|||||||
VirtIOBlockDataPlane *s = vblk->dataplane;
|
VirtIOBlockDataPlane *s = vblk->dataplane;
|
||||||
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vblk)));
|
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vblk)));
|
||||||
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
|
||||||
AioContext *old_context;
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
unsigned nvqs = s->conf->num_queues;
|
unsigned nvqs = s->conf->num_queues;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
@@ -178,10 +177,7 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
|
|||||||
|
|
||||||
trace_virtio_blk_data_plane_start(s);
|
trace_virtio_blk_data_plane_start(s);
|
||||||
|
|
||||||
old_context = blk_get_aio_context(s->conf->conf.blk);
|
|
||||||
aio_context_acquire(old_context);
|
|
||||||
r = blk_set_aio_context(s->conf->conf.blk, s->ctx, &local_err);
|
r = blk_set_aio_context(s->conf->conf.blk, s->ctx, &local_err);
|
||||||
aio_context_release(old_context);
|
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
error_report_err(local_err);
|
error_report_err(local_err);
|
||||||
goto fail_aio_context;
|
goto fail_aio_context;
|
||||||
@@ -208,13 +204,11 @@ int virtio_blk_data_plane_start(VirtIODevice *vdev)
|
|||||||
|
|
||||||
/* Get this show started by hooking up our callbacks */
|
/* Get this show started by hooking up our callbacks */
|
||||||
if (!blk_in_drain(s->conf->conf.blk)) {
|
if (!blk_in_drain(s->conf->conf.blk)) {
|
||||||
aio_context_acquire(s->ctx);
|
|
||||||
for (i = 0; i < nvqs; i++) {
|
for (i = 0; i < nvqs; i++) {
|
||||||
VirtQueue *vq = virtio_get_queue(s->vdev, i);
|
VirtQueue *vq = virtio_get_queue(s->vdev, i);
|
||||||
|
|
||||||
virtio_queue_aio_attach_host_notifier(vq, s->ctx);
|
virtio_queue_aio_attach_host_notifier(vq, s->ctx);
|
||||||
}
|
}
|
||||||
aio_context_release(s->ctx);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -314,8 +308,6 @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
|
|||||||
*/
|
*/
|
||||||
vblk->dataplane_started = false;
|
vblk->dataplane_started = false;
|
||||||
|
|
||||||
aio_context_acquire(s->ctx);
|
|
||||||
|
|
||||||
/* Wait for virtio_blk_dma_restart_bh() and in flight I/O to complete */
|
/* Wait for virtio_blk_dma_restart_bh() and in flight I/O to complete */
|
||||||
blk_drain(s->conf->conf.blk);
|
blk_drain(s->conf->conf.blk);
|
||||||
|
|
||||||
@@ -325,8 +317,6 @@ void virtio_blk_data_plane_stop(VirtIODevice *vdev)
|
|||||||
*/
|
*/
|
||||||
blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context(), NULL);
|
blk_set_aio_context(s->conf->conf.blk, qemu_get_aio_context(), NULL);
|
||||||
|
|
||||||
aio_context_release(s->ctx);
|
|
||||||
|
|
||||||
/* Clean up guest notifier (irq) */
|
/* Clean up guest notifier (irq) */
|
||||||
k->set_guest_notifiers(qbus->parent, nvqs, false);
|
k->set_guest_notifiers(qbus->parent, nvqs, false);
|
||||||
|
|
||||||
|
|||||||
@@ -260,8 +260,6 @@ static void xen_block_complete_aio(void *opaque, int ret)
|
|||||||
XenBlockRequest *request = opaque;
|
XenBlockRequest *request = opaque;
|
||||||
XenBlockDataPlane *dataplane = request->dataplane;
|
XenBlockDataPlane *dataplane = request->dataplane;
|
||||||
|
|
||||||
aio_context_acquire(dataplane->ctx);
|
|
||||||
|
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
error_report("%s I/O error",
|
error_report("%s I/O error",
|
||||||
request->req.operation == BLKIF_OP_READ ?
|
request->req.operation == BLKIF_OP_READ ?
|
||||||
@@ -273,10 +271,10 @@ static void xen_block_complete_aio(void *opaque, int ret)
|
|||||||
if (request->presync) {
|
if (request->presync) {
|
||||||
request->presync = 0;
|
request->presync = 0;
|
||||||
xen_block_do_aio(request);
|
xen_block_do_aio(request);
|
||||||
goto done;
|
return;
|
||||||
}
|
}
|
||||||
if (request->aio_inflight > 0) {
|
if (request->aio_inflight > 0) {
|
||||||
goto done;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (request->req.operation) {
|
switch (request->req.operation) {
|
||||||
@@ -318,9 +316,6 @@ static void xen_block_complete_aio(void *opaque, int ret)
|
|||||||
if (dataplane->more_work) {
|
if (dataplane->more_work) {
|
||||||
qemu_bh_schedule(dataplane->bh);
|
qemu_bh_schedule(dataplane->bh);
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
|
||||||
aio_context_release(dataplane->ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool xen_block_split_discard(XenBlockRequest *request,
|
static bool xen_block_split_discard(XenBlockRequest *request,
|
||||||
@@ -601,9 +596,7 @@ static void xen_block_dataplane_bh(void *opaque)
|
|||||||
{
|
{
|
||||||
XenBlockDataPlane *dataplane = opaque;
|
XenBlockDataPlane *dataplane = opaque;
|
||||||
|
|
||||||
aio_context_acquire(dataplane->ctx);
|
|
||||||
xen_block_handle_requests(dataplane);
|
xen_block_handle_requests(dataplane);
|
||||||
aio_context_release(dataplane->ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool xen_block_dataplane_event(void *opaque)
|
static bool xen_block_dataplane_event(void *opaque)
|
||||||
@@ -703,10 +696,8 @@ void xen_block_dataplane_stop(XenBlockDataPlane *dataplane)
|
|||||||
xen_block_dataplane_detach(dataplane);
|
xen_block_dataplane_detach(dataplane);
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_acquire(dataplane->ctx);
|
|
||||||
/* Xen doesn't have multiple users for nodes, so this can't fail */
|
/* Xen doesn't have multiple users for nodes, so this can't fail */
|
||||||
blk_set_aio_context(dataplane->blk, qemu_get_aio_context(), &error_abort);
|
blk_set_aio_context(dataplane->blk, qemu_get_aio_context(), &error_abort);
|
||||||
aio_context_release(dataplane->ctx);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now that the context has been moved onto the main thread, cancel
|
* Now that the context has been moved onto the main thread, cancel
|
||||||
@@ -752,7 +743,6 @@ void xen_block_dataplane_start(XenBlockDataPlane *dataplane,
|
|||||||
{
|
{
|
||||||
ERRP_GUARD();
|
ERRP_GUARD();
|
||||||
XenDevice *xendev = dataplane->xendev;
|
XenDevice *xendev = dataplane->xendev;
|
||||||
AioContext *old_context;
|
|
||||||
unsigned int ring_size;
|
unsigned int ring_size;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -836,11 +826,8 @@ void xen_block_dataplane_start(XenBlockDataPlane *dataplane,
|
|||||||
goto stop;
|
goto stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
old_context = blk_get_aio_context(dataplane->blk);
|
|
||||||
aio_context_acquire(old_context);
|
|
||||||
/* If other users keep the BlockBackend in the iothread, that's ok */
|
/* If other users keep the BlockBackend in the iothread, that's ok */
|
||||||
blk_set_aio_context(dataplane->blk, dataplane->ctx, NULL);
|
blk_set_aio_context(dataplane->blk, dataplane->ctx, NULL);
|
||||||
aio_context_release(old_context);
|
|
||||||
|
|
||||||
if (!blk_in_drain(dataplane->blk)) {
|
if (!blk_in_drain(dataplane->blk)) {
|
||||||
xen_block_dataplane_attach(dataplane);
|
xen_block_dataplane_attach(dataplane);
|
||||||
|
|||||||
@@ -1210,17 +1210,13 @@ static void virtio_blk_dma_restart_cb(void *opaque, bool running,
|
|||||||
static void virtio_blk_reset(VirtIODevice *vdev)
|
static void virtio_blk_reset(VirtIODevice *vdev)
|
||||||
{
|
{
|
||||||
VirtIOBlock *s = VIRTIO_BLK(vdev);
|
VirtIOBlock *s = VIRTIO_BLK(vdev);
|
||||||
AioContext *ctx;
|
|
||||||
VirtIOBlockReq *req;
|
VirtIOBlockReq *req;
|
||||||
|
|
||||||
/* Dataplane has stopped... */
|
/* Dataplane has stopped... */
|
||||||
assert(!s->dataplane_started);
|
assert(!s->dataplane_started);
|
||||||
|
|
||||||
/* ...but requests may still be in flight. */
|
/* ...but requests may still be in flight. */
|
||||||
ctx = blk_get_aio_context(s->blk);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
blk_drain(s->blk);
|
blk_drain(s->blk);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
/* We drop queued requests after blk_drain() because blk_drain() itself can
|
/* We drop queued requests after blk_drain() because blk_drain() itself can
|
||||||
* produce them. */
|
* produce them. */
|
||||||
@@ -1250,10 +1246,6 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||||||
uint64_t capacity;
|
uint64_t capacity;
|
||||||
int64_t length;
|
int64_t length;
|
||||||
int blk_size = conf->logical_block_size;
|
int blk_size = conf->logical_block_size;
|
||||||
AioContext *ctx;
|
|
||||||
|
|
||||||
ctx = blk_get_aio_context(s->blk);
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
|
|
||||||
blk_get_geometry(s->blk, &capacity);
|
blk_get_geometry(s->blk, &capacity);
|
||||||
memset(&blkcfg, 0, sizeof(blkcfg));
|
memset(&blkcfg, 0, sizeof(blkcfg));
|
||||||
@@ -1277,7 +1269,6 @@ static void virtio_blk_update_config(VirtIODevice *vdev, uint8_t *config)
|
|||||||
* per track (cylinder).
|
* per track (cylinder).
|
||||||
*/
|
*/
|
||||||
length = blk_getlength(s->blk);
|
length = blk_getlength(s->blk);
|
||||||
aio_context_release(ctx);
|
|
||||||
if (length > 0 && length / conf->heads / conf->secs % blk_size) {
|
if (length > 0 && length / conf->heads / conf->secs % blk_size) {
|
||||||
blkcfg.geometry.sectors = conf->secs & ~s->sector_mask;
|
blkcfg.geometry.sectors = conf->secs & ~s->sector_mask;
|
||||||
} else {
|
} else {
|
||||||
@@ -1344,9 +1335,7 @@ static void virtio_blk_set_config(VirtIODevice *vdev, const uint8_t *config)
|
|||||||
|
|
||||||
memcpy(&blkcfg, config, s->config_size);
|
memcpy(&blkcfg, config, s->config_size);
|
||||||
|
|
||||||
aio_context_acquire(blk_get_aio_context(s->blk));
|
|
||||||
blk_set_enable_write_cache(s->blk, blkcfg.wce != 0);
|
blk_set_enable_write_cache(s->blk, blkcfg.wce != 0);
|
||||||
aio_context_release(blk_get_aio_context(s->blk));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features,
|
static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features,
|
||||||
@@ -1414,11 +1403,9 @@ static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t status)
|
|||||||
* s->blk would erroneously be placed in writethrough mode.
|
* s->blk would erroneously be placed in writethrough mode.
|
||||||
*/
|
*/
|
||||||
if (!virtio_vdev_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE)) {
|
if (!virtio_vdev_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE)) {
|
||||||
aio_context_acquire(blk_get_aio_context(s->blk));
|
|
||||||
blk_set_enable_write_cache(s->blk,
|
blk_set_enable_write_cache(s->blk,
|
||||||
virtio_vdev_has_feature(vdev,
|
virtio_vdev_has_feature(vdev,
|
||||||
VIRTIO_BLK_F_WCE));
|
VIRTIO_BLK_F_WCE));
|
||||||
aio_context_release(blk_get_aio_context(s->blk));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,9 +120,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
|
|||||||
"node");
|
"node");
|
||||||
}
|
}
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
blk_replace_bs(blk, bs, errp);
|
blk_replace_bs(blk, bs, errp);
|
||||||
aio_context_release(ctx);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,10 +146,7 @@ static void set_drive_helper(Object *obj, Visitor *v, const char *name,
|
|||||||
0, BLK_PERM_ALL);
|
0, BLK_PERM_ALL);
|
||||||
blk_created = true;
|
blk_created = true;
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
ret = blk_insert_bs(blk, bs, errp);
|
ret = blk_insert_bs(blk, bs, errp);
|
||||||
aio_context_release(ctx);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -207,12 +202,8 @@ static void release_drive(Object *obj, const char *name, void *opaque)
|
|||||||
BlockBackend **ptr = object_field_prop_ptr(obj, prop);
|
BlockBackend **ptr = object_field_prop_ptr(obj, prop);
|
||||||
|
|
||||||
if (*ptr) {
|
if (*ptr) {
|
||||||
AioContext *ctx = blk_get_aio_context(*ptr);
|
|
||||||
|
|
||||||
aio_context_acquire(ctx);
|
|
||||||
blockdev_auto_del(*ptr);
|
blockdev_auto_del(*ptr);
|
||||||
blk_detach_dev(*ptr, dev);
|
blk_detach_dev(*ptr, dev);
|
||||||
aio_context_release(ctx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user