block.c (34b5d2c68eb4082c288e70fb99c61af8f7b96fde) | block.c (cc84d90ff54c025190dbe49ec5fea1268217c5f2) |
---|---|
1/* 2 * QEMU System Emulator block driver 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights --- 380 unchanged lines hidden (view full) --- 389 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL; 390} 391 392typedef struct CreateCo { 393 BlockDriver *drv; 394 char *filename; 395 QEMUOptionParameter *options; 396 int ret; | 1/* 2 * QEMU System Emulator block driver 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights --- 380 unchanged lines hidden (view full) --- 389 return drv && bdrv_is_whitelisted(drv, read_only) ? drv : NULL; 390} 391 392typedef struct CreateCo { 393 BlockDriver *drv; 394 char *filename; 395 QEMUOptionParameter *options; 396 int ret; |
397 Error *err; |
|
397} CreateCo; 398 399static void coroutine_fn bdrv_create_co_entry(void *opaque) 400{ | 398} CreateCo; 399 400static void coroutine_fn bdrv_create_co_entry(void *opaque) 401{ |
402 Error *local_err = NULL; 403 int ret; 404 |
|
401 CreateCo *cco = opaque; 402 assert(cco->drv); 403 | 405 CreateCo *cco = opaque; 406 assert(cco->drv); 407 |
404 cco->ret = cco->drv->bdrv_create(cco->filename, cco->options, NULL); | 408 ret = cco->drv->bdrv_create(cco->filename, cco->options, &local_err); 409 if (error_is_set(&local_err)) { 410 error_propagate(&cco->err, local_err); 411 } 412 cco->ret = ret; |
405} 406 407int bdrv_create(BlockDriver *drv, const char* filename, | 413} 414 415int bdrv_create(BlockDriver *drv, const char* filename, |
408 QEMUOptionParameter *options) | 416 QEMUOptionParameter *options, Error **errp) |
409{ 410 int ret; 411 412 Coroutine *co; 413 CreateCo cco = { 414 .drv = drv, 415 .filename = g_strdup(filename), 416 .options = options, 417 .ret = NOT_DONE, | 417{ 418 int ret; 419 420 Coroutine *co; 421 CreateCo cco = { 422 .drv = drv, 423 .filename = g_strdup(filename), 424 .options = options, 425 .ret = NOT_DONE, |
426 .err = NULL, |
|
418 }; 419 420 if (!drv->bdrv_create) { | 427 }; 428 429 if (!drv->bdrv_create) { |
430 error_setg(errp, "Driver '%s' does not support image creation", drv->format_name); |
|
421 ret = -ENOTSUP; 422 goto out; 423 } 424 425 if (qemu_in_coroutine()) { 426 /* Fast-path if already in coroutine context */ 427 bdrv_create_co_entry(&cco); 428 } else { 429 co = qemu_coroutine_create(bdrv_create_co_entry); 430 qemu_coroutine_enter(co, &cco); 431 while (cco.ret == NOT_DONE) { 432 qemu_aio_wait(); 433 } 434 } 435 436 ret = cco.ret; | 431 ret = -ENOTSUP; 432 goto out; 433 } 434 435 if (qemu_in_coroutine()) { 436 /* Fast-path if already in coroutine context */ 437 bdrv_create_co_entry(&cco); 438 } else { 439 co = qemu_coroutine_create(bdrv_create_co_entry); 440 qemu_coroutine_enter(co, &cco); 441 while (cco.ret == NOT_DONE) { 442 qemu_aio_wait(); 443 } 444 } 445 446 ret = cco.ret; |
447 if (ret < 0) { 448 if (error_is_set(&cco.err)) { 449 error_propagate(errp, cco.err); 450 } else { 451 error_setg_errno(errp, -ret, "Could not create image"); 452 } 453 } |
|
437 438out: 439 g_free(cco.filename); 440 return ret; 441} 442 | 454 455out: 456 g_free(cco.filename); 457 return ret; 458} 459 |
443int bdrv_create_file(const char* filename, QEMUOptionParameter *options) | 460int bdrv_create_file(const char* filename, QEMUOptionParameter *options, 461 Error **errp) |
444{ 445 BlockDriver *drv; | 462{ 463 BlockDriver *drv; |
464 Error *local_err = NULL; 465 int ret; |
|
446 447 drv = bdrv_find_protocol(filename, true); 448 if (drv == NULL) { | 466 467 drv = bdrv_find_protocol(filename, true); 468 if (drv == NULL) { |
469 error_setg(errp, "Could not find protocol for file '%s'", filename); |
|
449 return -ENOENT; 450 } 451 | 470 return -ENOENT; 471 } 472 |
452 return bdrv_create(drv, filename, options); | 473 ret = bdrv_create(drv, filename, options, &local_err); 474 if (error_is_set(&local_err)) { 475 error_propagate(errp, local_err); 476 } 477 return ret; |
453} 454 455/* 456 * Create a uniquely-named empty temporary file. 457 * Return 0 upon success, otherwise a negative errno value. 458 */ 459int get_tmp_filename(char *filename, int size) 460{ --- 616 unchanged lines hidden (view full) --- 1077 set_option_parameter_int(create_options, BLOCK_OPT_SIZE, total_size); 1078 set_option_parameter(create_options, BLOCK_OPT_BACKING_FILE, 1079 backing_filename); 1080 if (drv) { 1081 set_option_parameter(create_options, BLOCK_OPT_BACKING_FMT, 1082 drv->format_name); 1083 } 1084 | 478} 479 480/* 481 * Create a uniquely-named empty temporary file. 482 * Return 0 upon success, otherwise a negative errno value. 483 */ 484int get_tmp_filename(char *filename, int size) 485{ --- 616 unchanged lines hidden (view full) --- 1102 set_option_parameter_int(create_options, BLOCK_OPT_SIZE, total_size); 1103 set_option_parameter(create_options, BLOCK_OPT_BACKING_FILE, 1104 backing_filename); 1105 if (drv) { 1106 set_option_parameter(create_options, BLOCK_OPT_BACKING_FMT, 1107 drv->format_name); 1108 } 1109 |
1085 ret = bdrv_create(bdrv_qcow2, tmp_filename, create_options); | 1110 ret = bdrv_create(bdrv_qcow2, tmp_filename, create_options, &local_err); |
1086 free_option_parameters(create_options); 1087 if (ret < 0) { 1088 error_setg_errno(errp, -ret, "Could not create temporary overlay " | 1111 free_option_parameters(create_options); 1112 if (ret < 0) { 1113 error_setg_errno(errp, -ret, "Could not create temporary overlay " |
1089 "'%s'", tmp_filename); | 1114 "'%s': %s", tmp_filename, 1115 error_get_pretty(local_err)); 1116 error_free(local_err); 1117 local_err = NULL; |
1090 goto fail; 1091 } 1092 1093 filename = tmp_filename; 1094 drv = bdrv_qcow2; 1095 bs->is_temporary = 1; 1096 } 1097 --- 3358 unchanged lines hidden (view full) --- 4456 char *options, uint64_t img_size, int flags, 4457 Error **errp, bool quiet) 4458{ 4459 QEMUOptionParameter *param = NULL, *create_options = NULL; 4460 QEMUOptionParameter *backing_fmt, *backing_file, *size; 4461 BlockDriverState *bs = NULL; 4462 BlockDriver *drv, *proto_drv; 4463 BlockDriver *backing_drv = NULL; | 1118 goto fail; 1119 } 1120 1121 filename = tmp_filename; 1122 drv = bdrv_qcow2; 1123 bs->is_temporary = 1; 1124 } 1125 --- 3358 unchanged lines hidden (view full) --- 4484 char *options, uint64_t img_size, int flags, 4485 Error **errp, bool quiet) 4486{ 4487 QEMUOptionParameter *param = NULL, *create_options = NULL; 4488 QEMUOptionParameter *backing_fmt, *backing_file, *size; 4489 BlockDriverState *bs = NULL; 4490 BlockDriver *drv, *proto_drv; 4491 BlockDriver *backing_drv = NULL; |
4492 Error *local_err = NULL; |
|
4464 int ret = 0; 4465 4466 /* Find driver and parse its options */ 4467 drv = bdrv_find_format(fmt); 4468 if (!drv) { 4469 error_setg(errp, "Unknown file format '%s'", fmt); 4470 return; 4471 } --- 70 unchanged lines hidden (view full) --- 4542 4543 /* backing files always opened read-only */ 4544 back_flags = 4545 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); 4546 4547 bs = bdrv_new(""); 4548 4549 ret = bdrv_open(bs, backing_file->value.s, NULL, back_flags, | 4493 int ret = 0; 4494 4495 /* Find driver and parse its options */ 4496 drv = bdrv_find_format(fmt); 4497 if (!drv) { 4498 error_setg(errp, "Unknown file format '%s'", fmt); 4499 return; 4500 } --- 70 unchanged lines hidden (view full) --- 4571 4572 /* backing files always opened read-only */ 4573 back_flags = 4574 flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); 4575 4576 bs = bdrv_new(""); 4577 4578 ret = bdrv_open(bs, backing_file->value.s, NULL, back_flags, |
4550 backing_drv, NULL); | 4579 backing_drv, &local_err); |
4551 if (ret < 0) { | 4580 if (ret < 0) { |
4552 error_setg_errno(errp, -ret, "Could not open '%s'", 4553 backing_file->value.s); | 4581 error_setg_errno(errp, -ret, "Could not open '%s': %s", 4582 backing_file->value.s, 4583 error_get_pretty(local_err)); 4584 error_free(local_err); 4585 local_err = NULL; |
4554 goto out; 4555 } 4556 bdrv_get_geometry(bs, &size); 4557 size *= 512; 4558 4559 snprintf(buf, sizeof(buf), "%" PRId64, size); 4560 set_option_parameter(param, BLOCK_OPT_SIZE, buf); 4561 } else { 4562 error_setg(errp, "Image creation needs a size parameter"); 4563 goto out; 4564 } 4565 } 4566 4567 if (!quiet) { 4568 printf("Formatting '%s', fmt=%s ", filename, fmt); 4569 print_option_parameters(param); 4570 puts(""); 4571 } | 4586 goto out; 4587 } 4588 bdrv_get_geometry(bs, &size); 4589 size *= 512; 4590 4591 snprintf(buf, sizeof(buf), "%" PRId64, size); 4592 set_option_parameter(param, BLOCK_OPT_SIZE, buf); 4593 } else { 4594 error_setg(errp, "Image creation needs a size parameter"); 4595 goto out; 4596 } 4597 } 4598 4599 if (!quiet) { 4600 printf("Formatting '%s', fmt=%s ", filename, fmt); 4601 print_option_parameters(param); 4602 puts(""); 4603 } |
4572 ret = bdrv_create(drv, filename, param); 4573 if (ret < 0) { 4574 if (ret == -ENOTSUP) { 4575 error_setg(errp,"Formatting or formatting option not supported for " 4576 "file format '%s'", fmt); 4577 } else if (ret == -EFBIG) { 4578 const char *cluster_size_hint = ""; 4579 if (get_option_parameter(create_options, BLOCK_OPT_CLUSTER_SIZE)) { 4580 cluster_size_hint = " (try using a larger cluster size)"; 4581 } 4582 error_setg(errp, "The image size is too large for file format '%s'%s", 4583 fmt, cluster_size_hint); 4584 } else { 4585 error_setg(errp, "%s: error while creating %s: %s", filename, fmt, 4586 strerror(-ret)); | 4604 ret = bdrv_create(drv, filename, param, &local_err); 4605 if (ret == -EFBIG) { 4606 /* This is generally a better message than whatever the driver would 4607 * deliver (especially because of the cluster_size_hint), since that 4608 * is most probably not much different from "image too large". */ 4609 const char *cluster_size_hint = ""; 4610 if (get_option_parameter(create_options, BLOCK_OPT_CLUSTER_SIZE)) { 4611 cluster_size_hint = " (try using a larger cluster size)"; |
4587 } | 4612 } |
4613 error_setg(errp, "The image size is too large for file format '%s'" 4614 "%s", fmt, cluster_size_hint); 4615 error_free(local_err); 4616 local_err = NULL; |
|
4588 } 4589 4590out: 4591 free_option_parameters(create_options); 4592 free_option_parameters(param); 4593 4594 if (bs) { 4595 bdrv_unref(bs); 4596 } | 4617 } 4618 4619out: 4620 free_option_parameters(create_options); 4621 free_option_parameters(param); 4622 4623 if (bs) { 4624 bdrv_unref(bs); 4625 } |
4626 if (error_is_set(&local_err)) { 4627 error_propagate(errp, local_err); 4628 } |
|
4597} 4598 4599AioContext *bdrv_get_aio_context(BlockDriverState *bs) 4600{ 4601 /* Currently BlockDriverState always uses the main loop AioContext */ 4602 return qemu_get_aio_context(); 4603} 4604 --- 13 unchanged lines hidden --- | 4629} 4630 4631AioContext *bdrv_get_aio_context(BlockDriverState *bs) 4632{ 4633 /* Currently BlockDriverState always uses the main loop AioContext */ 4634 return qemu_get_aio_context(); 4635} 4636 --- 13 unchanged lines hidden --- |