Commit c76f4952bbf47116255bc00780ceae3bc8a657c0

Authored by Nolan
Committed by Anthony Liguori
1 parent 5f650495

Allow adjustment of http block device's readahead size, via a new

":readahead=###:" suffix.

Signed-off-by: Nolan Leake <nolan <at> sigbus.net>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing 1 changed file with 47 additions and 3 deletions
block/curl.c
... ... @@ -71,6 +71,7 @@ typedef struct BDRVCURLState {
71 71 size_t len;
72 72 CURLState states[CURL_NUM_STATES];
73 73 char *url;
  74 + size_t readahead_size;
74 75 } BDRVCURLState;
75 76  
76 77 static void curl_clean_state(CURLState *s);
... ... @@ -299,15 +300,57 @@ static int curl_open(BlockDriverState *bs, const char *filename, int flags)
299 300 BDRVCURLState *s = bs->opaque;
300 301 CURLState *state = NULL;
301 302 double d;
  303 +
  304 + #define RA_OPTSTR ":readahead="
  305 + char *file;
  306 + char *ra;
  307 + const char *ra_val;
  308 + int parse_state = 0;
  309 +
302 310 static int inited = 0;
303 311  
  312 + file = strdup(filename);
  313 + s->readahead_size = READ_AHEAD_SIZE;
  314 +
  315 + /* Parse a trailing ":readahead=#:" param, if present. */
  316 + ra = file + strlen(file) - 1;
  317 + while (ra >= file) {
  318 + if (parse_state == 0) {
  319 + if (*ra == ':')
  320 + parse_state++;
  321 + else
  322 + break;
  323 + } else if (parse_state == 1) {
  324 + if (*ra > '9' || *ra < '0') {
  325 + char *opt_start = ra - strlen(RA_OPTSTR) + 1;
  326 + if (opt_start > file &&
  327 + strncmp(opt_start, RA_OPTSTR, strlen(RA_OPTSTR)) == 0) {
  328 + ra_val = ra + 1;
  329 + ra -= strlen(RA_OPTSTR) - 1;
  330 + *ra = '\0';
  331 + s->readahead_size = atoi(ra_val);
  332 + break;
  333 + } else {
  334 + break;
  335 + }
  336 + }
  337 + }
  338 + ra--;
  339 + }
  340 +
  341 + if ((s->readahead_size & 0x1ff) != 0) {
  342 + fprintf(stderr, "HTTP_READAHEAD_SIZE %Zd is not a multiple of 512\n",
  343 + s->readahead_size);
  344 + goto out_noclean;
  345 + }
  346 +
304 347 if (!inited) {
305 348 curl_global_init(CURL_GLOBAL_ALL);
306 349 inited = 1;
307 350 }
308 351  
309   - dprintf("CURL: Opening %s\n", filename);
310   - s->url = strdup(filename);
  352 + dprintf("CURL: Opening %s\n", file);
  353 + s->url = file;
311 354 state = curl_init_state(s);
312 355 if (!state)
313 356 goto out_noclean;
... ... @@ -346,6 +389,7 @@ out:
346 389 curl_easy_cleanup(state->curl);
347 390 state->curl = NULL;
348 391 out_noclean:
  392 + qemu_free(file);
349 393 return -EINVAL;
350 394 }
351 395  
... ... @@ -401,7 +445,7 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
401 445 if (state->orig_buf)
402 446 qemu_free(state->orig_buf);
403 447 state->buf_start = start;
404   - state->buf_len = acb->end + READ_AHEAD_SIZE;
  448 + state->buf_len = acb->end + s->readahead_size;
405 449 end = MIN(start + state->buf_len, s->len) - 1;
406 450 state->orig_buf = qemu_malloc(state->buf_len);
407 451 state->acb[0] = acb;
... ...