diff options
author | Kevin Wolf <kwolf@redhat.com> | 2012-12-07 18:08:48 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2012-12-13 15:37:59 +0100 |
commit | 4e95314e2bb7baa64f2a9026df5e2649081b7060 (patch) | |
tree | d410d6e0888f75e4a6f5f077c160d1b193eee1c6 | |
parent | 280d373579558f73a8b70e329d9a6206933d3809 (diff) |
qcow2: Execute run_dependent_requests() without lock
There's no reason for run_dependent_requests() to hold s->lock, and a
later patch will require that in fact the lock is not held.
Also, before this patch, run_dependent_requests() not only does what its
name suggests, but also removes the l2meta from the list of in-flight
requests. When changing this, it becomes an one-liner, so just inline it
completely.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block/qcow2.c | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/block/qcow2.c b/block/qcow2.c index dbcc0fff97..8520bda21a 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -745,21 +745,6 @@ fail: return ret; } -static void run_dependent_requests(BDRVQcowState *s, QCowL2Meta *m) -{ - /* Take the request off the list of running requests */ - if (m->nb_clusters != 0) { - QLIST_REMOVE(m, next_in_flight); - } - - /* Restart all dependent requests */ - if (!qemu_co_queue_empty(&m->dependent_requests)) { - qemu_co_mutex_unlock(&s->lock); - qemu_co_queue_restart_all(&m->dependent_requests); - qemu_co_mutex_lock(&s->lock); - } -} - static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, int64_t sector_num, int remaining_sectors, @@ -845,7 +830,15 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, goto fail; } - run_dependent_requests(s, l2meta); + /* Take the request off the list of running requests */ + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + + qemu_co_mutex_unlock(&s->lock); + qemu_co_queue_restart_all(&l2meta->dependent_requests); + qemu_co_mutex_lock(&s->lock); + g_free(l2meta); l2meta = NULL; } @@ -858,13 +851,16 @@ static coroutine_fn int qcow2_co_writev(BlockDriverState *bs, ret = 0; fail: + qemu_co_mutex_unlock(&s->lock); + if (l2meta != NULL) { - run_dependent_requests(s, l2meta); + if (l2meta->nb_clusters != 0) { + QLIST_REMOVE(l2meta, next_in_flight); + } + qemu_co_queue_restart_all(&l2meta->dependent_requests); g_free(l2meta); } - qemu_co_mutex_unlock(&s->lock); - qemu_iovec_destroy(&hd_qiov); qemu_vfree(cluster_data); trace_qcow2_writev_done_req(qemu_coroutine_self(), ret); @@ -1152,7 +1148,7 @@ static int preallocate(BlockDriverState *bs) /* There are no dependent requests, but we need to remove our request * from the list of in-flight requests */ if (meta != NULL) { - run_dependent_requests(bs->opaque, meta); + QLIST_REMOVE(meta, next_in_flight); } /* TODO Preallocate data if requested */ |