blockdev.c (8f4699d873bef81cec95db6da53d4c33f8caf4b9) | blockdev.c (3d948cdf3760b52238038626a7ffa7d30913060b) |
---|---|
1/* 2 * QEMU host block devices 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or 7 * later. See the COPYING file in the top-level directory. 8 * --- 2361 unchanged lines hidden (view full) --- 2370 block_job_cb, bs, &local_err); 2371 if (local_err != NULL) { 2372 bdrv_unref(target_bs); 2373 error_propagate(errp, local_err); 2374 return; 2375 } 2376} 2377 | 1/* 2 * QEMU host block devices 3 * 4 * Copyright (c) 2003-2008 Fabrice Bellard 5 * 6 * This work is licensed under the terms of the GNU GPL, version 2 or 7 * later. See the COPYING file in the top-level directory. 8 * --- 2361 unchanged lines hidden (view full) --- 2370 block_job_cb, bs, &local_err); 2371 if (local_err != NULL) { 2372 bdrv_unref(target_bs); 2373 error_propagate(errp, local_err); 2374 return; 2375 } 2376} 2377 |
2378static BlockJob *find_block_job(const char *device) | 2378/* Get the block job for a given device name and acquire its AioContext */ 2379static BlockJob *find_block_job(const char *device, AioContext **aio_context) |
2379{ 2380 BlockDriverState *bs; 2381 2382 bs = bdrv_find(device); | 2380{ 2381 BlockDriverState *bs; 2382 2383 bs = bdrv_find(device); |
2383 if (!bs || !bs->job) { 2384 return NULL; | 2384 if (!bs) { 2385 goto notfound; |
2385 } | 2386 } |
2387 2388 *aio_context = bdrv_get_aio_context(bs); 2389 aio_context_acquire(*aio_context); 2390 2391 if (!bs->job) { 2392 aio_context_release(*aio_context); 2393 goto notfound; 2394 } 2395 |
|
2386 return bs->job; | 2396 return bs->job; |
2397 2398notfound: 2399 *aio_context = NULL; 2400 return NULL; |
|
2387} 2388 2389void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp) 2390{ | 2401} 2402 2403void qmp_block_job_set_speed(const char *device, int64_t speed, Error **errp) 2404{ |
2391 BlockJob *job = find_block_job(device); | 2405 AioContext *aio_context; 2406 BlockJob *job = find_block_job(device, &aio_context); |
2392 2393 if (!job) { 2394 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2395 return; 2396 } 2397 2398 block_job_set_speed(job, speed, errp); | 2407 2408 if (!job) { 2409 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2410 return; 2411 } 2412 2413 block_job_set_speed(job, speed, errp); |
2414 aio_context_release(aio_context); |
|
2399} 2400 2401void qmp_block_job_cancel(const char *device, 2402 bool has_force, bool force, Error **errp) 2403{ | 2415} 2416 2417void qmp_block_job_cancel(const char *device, 2418 bool has_force, bool force, Error **errp) 2419{ |
2404 BlockJob *job = find_block_job(device); | 2420 AioContext *aio_context; 2421 BlockJob *job = find_block_job(device, &aio_context); |
2405 | 2422 |
2406 if (!has_force) { 2407 force = false; 2408 } 2409 | |
2410 if (!job) { 2411 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2412 return; 2413 } | 2423 if (!job) { 2424 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2425 return; 2426 } |
2427 2428 if (!has_force) { 2429 force = false; 2430 } 2431 |
|
2414 if (job->paused && !force) { 2415 error_setg(errp, "The block job for device '%s' is currently paused", 2416 device); | 2432 if (job->paused && !force) { 2433 error_setg(errp, "The block job for device '%s' is currently paused", 2434 device); |
2417 return; | 2435 goto out; |
2418 } 2419 2420 trace_qmp_block_job_cancel(job); 2421 block_job_cancel(job); | 2436 } 2437 2438 trace_qmp_block_job_cancel(job); 2439 block_job_cancel(job); |
2440out: 2441 aio_context_release(aio_context); |
|
2422} 2423 2424void qmp_block_job_pause(const char *device, Error **errp) 2425{ | 2442} 2443 2444void qmp_block_job_pause(const char *device, Error **errp) 2445{ |
2426 BlockJob *job = find_block_job(device); | 2446 AioContext *aio_context; 2447 BlockJob *job = find_block_job(device, &aio_context); |
2427 2428 if (!job) { 2429 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2430 return; 2431 } 2432 2433 trace_qmp_block_job_pause(job); 2434 block_job_pause(job); | 2448 2449 if (!job) { 2450 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2451 return; 2452 } 2453 2454 trace_qmp_block_job_pause(job); 2455 block_job_pause(job); |
2456 aio_context_release(aio_context); |
|
2435} 2436 2437void qmp_block_job_resume(const char *device, Error **errp) 2438{ | 2457} 2458 2459void qmp_block_job_resume(const char *device, Error **errp) 2460{ |
2439 BlockJob *job = find_block_job(device); | 2461 AioContext *aio_context; 2462 BlockJob *job = find_block_job(device, &aio_context); |
2440 2441 if (!job) { 2442 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2443 return; 2444 } 2445 2446 trace_qmp_block_job_resume(job); 2447 block_job_resume(job); | 2463 2464 if (!job) { 2465 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2466 return; 2467 } 2468 2469 trace_qmp_block_job_resume(job); 2470 block_job_resume(job); |
2471 aio_context_release(aio_context); |
|
2448} 2449 2450void qmp_block_job_complete(const char *device, Error **errp) 2451{ | 2472} 2473 2474void qmp_block_job_complete(const char *device, Error **errp) 2475{ |
2452 BlockJob *job = find_block_job(device); | 2476 AioContext *aio_context; 2477 BlockJob *job = find_block_job(device, &aio_context); |
2453 2454 if (!job) { 2455 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2456 return; 2457 } 2458 2459 trace_qmp_block_job_complete(job); 2460 block_job_complete(job, errp); | 2478 2479 if (!job) { 2480 error_set(errp, QERR_BLOCK_JOB_NOT_ACTIVE, device); 2481 return; 2482 } 2483 2484 trace_qmp_block_job_complete(job); 2485 block_job_complete(job, errp); |
2486 aio_context_release(aio_context); |
|
2461} 2462 2463void qmp_change_backing_file(const char *device, 2464 const char *image_node_name, 2465 const char *backing_file, 2466 Error **errp) 2467{ 2468 BlockDriverState *bs = NULL; --- 267 unchanged lines hidden --- | 2487} 2488 2489void qmp_change_backing_file(const char *device, 2490 const char *image_node_name, 2491 const char *backing_file, 2492 Error **errp) 2493{ 2494 BlockDriverState *bs = NULL; --- 267 unchanged lines hidden --- |