|
|
76daa3 |
From f7393fe35030ace07ad7d9468a54ca7bae132e3b Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Date: Wed, 17 May 2017 13:09:18 +0200
|
|
|
76daa3 |
Subject: [PATCH 12/27] curl: split curl_find_state/curl_init_state
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Message-id: <20170517130921.27402-5-pbonzini@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75263
|
|
|
76daa3 |
O-Subject: [RHEL7.4 qemu-kvm PATCH v2 4/7] curl: split curl_find_state/curl_init_state
|
|
|
76daa3 |
Bugzilla: 1437393
|
|
|
76daa3 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
If curl_easy_init fails, a CURLState is left with s->in_use = 1. Split
|
|
|
76daa3 |
curl_init_state in two, so that we can distinguish the two failures and
|
|
|
76daa3 |
call curl_clean_state if needed.
|
|
|
76daa3 |
|
|
|
76daa3 |
While at it, simplify curl_find_state, removing a dummy loop. The
|
|
|
76daa3 |
aio_poll loop is moved to the sole caller that needs it.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reviewed-by: Jeff Cody <jcody@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
Message-id: 20170515100059.15795-5-pbonzini@redhat.com
|
|
|
76daa3 |
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit 3ce6a729b5d78b13283ddc6c529811f67519a62d)
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
block/curl.c | 52 ++++++++++++++++++++++++++++++----------------------
|
|
|
76daa3 |
1 file changed, 30 insertions(+), 22 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/block/curl.c b/block/curl.c
|
|
|
76daa3 |
index 7001476..75e63d3 100644
|
|
|
76daa3 |
--- a/block/curl.c
|
|
|
76daa3 |
+++ b/block/curl.c
|
|
|
76daa3 |
@@ -455,34 +455,27 @@ static void curl_multi_timeout_do(void *arg)
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Called with s->mutex held. */
|
|
|
76daa3 |
-static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)
|
|
|
76daa3 |
+static CURLState *curl_find_state(BDRVCURLState *s)
|
|
|
76daa3 |
{
|
|
|
76daa3 |
CURLState *state = NULL;
|
|
|
76daa3 |
- int i, j;
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- do {
|
|
|
76daa3 |
- for (i=0; i
|
|
|
76daa3 |
- for (j=0; j
|
|
|
76daa3 |
- if (s->states[i].acb[j])
|
|
|
76daa3 |
- continue;
|
|
|
76daa3 |
- if (s->states[i].in_use)
|
|
|
76daa3 |
- continue;
|
|
|
76daa3 |
+ int i;
|
|
|
76daa3 |
|
|
|
76daa3 |
+ for (i = 0; i < CURL_NUM_STATES; i++) {
|
|
|
76daa3 |
+ if (!s->states[i].in_use) {
|
|
|
76daa3 |
state = &s->states[i];
|
|
|
76daa3 |
state->in_use = 1;
|
|
|
76daa3 |
break;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
- if (!state) {
|
|
|
76daa3 |
- qemu_mutex_unlock(&s->mutex);
|
|
|
76daa3 |
- aio_poll(bdrv_get_aio_context(bs), true);
|
|
|
76daa3 |
- qemu_mutex_lock(&s->mutex);
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
- } while(!state);
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ return state;
|
|
|
76daa3 |
+}
|
|
|
76daa3 |
|
|
|
76daa3 |
+static int curl_init_state(BDRVCURLState *s, CURLState *state)
|
|
|
76daa3 |
+{
|
|
|
76daa3 |
if (!state->curl) {
|
|
|
76daa3 |
state->curl = curl_easy_init();
|
|
|
76daa3 |
if (!state->curl) {
|
|
|
76daa3 |
- return NULL;
|
|
|
76daa3 |
+ return -EIO;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
curl_easy_setopt(state->curl, CURLOPT_URL, s->url);
|
|
|
76daa3 |
curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYPEER,
|
|
|
76daa3 |
@@ -535,7 +528,7 @@ static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)
|
|
|
76daa3 |
QLIST_INIT(&state->sockets);
|
|
|
76daa3 |
state->s = s;
|
|
|
76daa3 |
|
|
|
76daa3 |
- return state;
|
|
|
76daa3 |
+ return 0;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Called with s->mutex held. */
|
|
|
76daa3 |
@@ -756,13 +749,18 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
|
|
|
76daa3 |
s->aio_context = bdrv_get_aio_context(bs);
|
|
|
76daa3 |
s->url = g_strdup(file);
|
|
|
76daa3 |
qemu_mutex_lock(&s->mutex);
|
|
|
76daa3 |
- state = curl_init_state(bs, s);
|
|
|
76daa3 |
+ state = curl_find_state(s);
|
|
|
76daa3 |
qemu_mutex_unlock(&s->mutex);
|
|
|
76daa3 |
- if (!state)
|
|
|
76daa3 |
+ if (!state) {
|
|
|
76daa3 |
goto out_noclean;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
|
|
|
76daa3 |
// Get file size
|
|
|
76daa3 |
|
|
|
76daa3 |
+ if (curl_init_state(s, state) < 0) {
|
|
|
76daa3 |
+ goto out;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
s->accept_range = false;
|
|
|
76daa3 |
curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1);
|
|
|
76daa3 |
curl_easy_setopt(state->curl, CURLOPT_HEADERFUNCTION,
|
|
|
76daa3 |
@@ -857,8 +855,18 @@ static void curl_readv_bh_cb(void *p)
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
// No cache found, so let's start a new request
|
|
|
76daa3 |
- state = curl_init_state(acb->common.bs, s);
|
|
|
76daa3 |
- if (!state) {
|
|
|
76daa3 |
+ for (;;) {
|
|
|
76daa3 |
+ state = curl_find_state(s);
|
|
|
76daa3 |
+ if (state) {
|
|
|
76daa3 |
+ break;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ qemu_mutex_unlock(&s->mutex);
|
|
|
76daa3 |
+ aio_poll(bdrv_get_aio_context(bs), true);
|
|
|
76daa3 |
+ qemu_mutex_lock(&s->mutex);
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ if (curl_init_state(s, state) < 0) {
|
|
|
76daa3 |
+ curl_clean_state(state);
|
|
|
76daa3 |
ret = -EIO;
|
|
|
76daa3 |
goto out;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|