OSDN Git Service

coroutine: Clean up superfluous inclusion of qemu/coroutine.h
[qmiga/qemu.git] / blockjob.c
1 /*
2  * QEMU System Emulator block driver
3  *
4  * Copyright (c) 2011 IBM Corp.
5  * Copyright (c) 2012 Red Hat, Inc.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25
26 #include "qemu/osdep.h"
27 #include "block/block.h"
28 #include "block/blockjob_int.h"
29 #include "block/block_int.h"
30 #include "block/trace.h"
31 #include "sysemu/block-backend.h"
32 #include "qapi/error.h"
33 #include "qapi/qapi-events-block-core.h"
34 #include "qapi/qmp/qerror.h"
35 #include "qemu/main-loop.h"
36 #include "qemu/timer.h"
37
38 static bool is_block_job(Job *job)
39 {
40     return job_type(job) == JOB_TYPE_BACKUP ||
41            job_type(job) == JOB_TYPE_COMMIT ||
42            job_type(job) == JOB_TYPE_MIRROR ||
43            job_type(job) == JOB_TYPE_STREAM;
44 }
45
46 BlockJob *block_job_next_locked(BlockJob *bjob)
47 {
48     Job *job = bjob ? &bjob->job : NULL;
49     GLOBAL_STATE_CODE();
50
51     do {
52         job = job_next_locked(job);
53     } while (job && !is_block_job(job));
54
55     return job ? container_of(job, BlockJob, job) : NULL;
56 }
57
58 BlockJob *block_job_get_locked(const char *id)
59 {
60     Job *job = job_get_locked(id);
61     GLOBAL_STATE_CODE();
62
63     if (job && is_block_job(job)) {
64         return container_of(job, BlockJob, job);
65     } else {
66         return NULL;
67     }
68 }
69
70 BlockJob *block_job_get(const char *id)
71 {
72     JOB_LOCK_GUARD();
73     return block_job_get_locked(id);
74 }
75
76 void block_job_free(Job *job)
77 {
78     BlockJob *bjob = container_of(job, BlockJob, job);
79     GLOBAL_STATE_CODE();
80
81     block_job_remove_all_bdrv(bjob);
82     ratelimit_destroy(&bjob->limit);
83     error_free(bjob->blocker);
84 }
85
86 static char *child_job_get_parent_desc(BdrvChild *c)
87 {
88     BlockJob *job = c->opaque;
89     return g_strdup_printf("%s job '%s'", job_type_str(&job->job), job->job.id);
90 }
91
92 static void child_job_drained_begin(BdrvChild *c)
93 {
94     BlockJob *job = c->opaque;
95     job_pause(&job->job);
96 }
97
98 static bool child_job_drained_poll(BdrvChild *c)
99 {
100     BlockJob *bjob = c->opaque;
101     Job *job = &bjob->job;
102     const BlockJobDriver *drv = block_job_driver(bjob);
103
104     /* An inactive or completed job doesn't have any pending requests. Jobs
105      * with !job->busy are either already paused or have a pause point after
106      * being reentered, so no job driver code will run before they pause. */
107     WITH_JOB_LOCK_GUARD() {
108         if (!job->busy || job_is_completed_locked(job)) {
109             return false;
110         }
111     }
112
113     /* Otherwise, assume that it isn't fully stopped yet, but allow the job to
114      * override this assumption. */
115     if (drv->drained_poll) {
116         return drv->drained_poll(bjob);
117     } else {
118         return true;
119     }
120 }
121
122 static void child_job_drained_end(BdrvChild *c)
123 {
124     BlockJob *job = c->opaque;
125     job_resume(&job->job);
126 }
127
128 typedef struct BdrvStateChildJobContext {
129     AioContext *new_ctx;
130     BlockJob *job;
131 } BdrvStateChildJobContext;
132
133 static void child_job_set_aio_ctx_commit(void *opaque)
134 {
135     BdrvStateChildJobContext *s = opaque;
136     BlockJob *job = s->job;
137
138     job_set_aio_context(&job->job, s->new_ctx);
139 }
140
141 static TransactionActionDrv change_child_job_context = {
142     .commit = child_job_set_aio_ctx_commit,
143     .clean = g_free,
144 };
145
146 static bool child_job_change_aio_ctx(BdrvChild *c, AioContext *ctx,
147                                      GHashTable *visited, Transaction *tran,
148                                      Error **errp)
149 {
150     BlockJob *job = c->opaque;
151     BdrvStateChildJobContext *s;
152     GSList *l;
153
154     for (l = job->nodes; l; l = l->next) {
155         BdrvChild *sibling = l->data;
156         if (!bdrv_child_change_aio_context(sibling, ctx, visited,
157                                            tran, errp)) {
158             return false;
159         }
160     }
161
162     s = g_new(BdrvStateChildJobContext, 1);
163     *s = (BdrvStateChildJobContext) {
164         .new_ctx = ctx,
165         .job = job,
166     };
167
168     tran_add(tran, &change_child_job_context, s);
169     return true;
170 }
171
172 static AioContext *child_job_get_parent_aio_context(BdrvChild *c)
173 {
174     BlockJob *job = c->opaque;
175     IO_CODE();
176     JOB_LOCK_GUARD();
177
178     return job->job.aio_context;
179 }
180
181 static const BdrvChildClass child_job = {
182     .get_parent_desc    = child_job_get_parent_desc,
183     .drained_begin      = child_job_drained_begin,
184     .drained_poll       = child_job_drained_poll,
185     .drained_end        = child_job_drained_end,
186     .change_aio_ctx     = child_job_change_aio_ctx,
187     .stay_at_node       = true,
188     .get_parent_aio_context = child_job_get_parent_aio_context,
189 };
190
191 void block_job_remove_all_bdrv(BlockJob *job)
192 {
193     GLOBAL_STATE_CODE();
194     /*
195      * bdrv_root_unref_child() may reach child_job_[can_]set_aio_ctx(),
196      * which will also traverse job->nodes, so consume the list one by
197      * one to make sure that such a concurrent access does not attempt
198      * to process an already freed BdrvChild.
199      */
200     while (job->nodes) {
201         GSList *l = job->nodes;
202         BdrvChild *c = l->data;
203
204         job->nodes = l->next;
205
206         bdrv_op_unblock_all(c->bs, job->blocker);
207         bdrv_root_unref_child(c);
208
209         g_slist_free_1(l);
210     }
211 }
212
213 bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs)
214 {
215     GSList *el;
216     GLOBAL_STATE_CODE();
217
218     for (el = job->nodes; el; el = el->next) {
219         BdrvChild *c = el->data;
220         if (c->bs == bs) {
221             return true;
222         }
223     }
224
225     return false;
226 }
227
228 int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
229                        uint64_t perm, uint64_t shared_perm, Error **errp)
230 {
231     BdrvChild *c;
232     bool need_context_ops;
233     GLOBAL_STATE_CODE();
234
235     bdrv_ref(bs);
236
237     need_context_ops = bdrv_get_aio_context(bs) != job->job.aio_context;
238
239     if (need_context_ops && job->job.aio_context != qemu_get_aio_context()) {
240         aio_context_release(job->job.aio_context);
241     }
242     c = bdrv_root_attach_child(bs, name, &child_job, 0, perm, shared_perm, job,
243                                errp);
244     if (need_context_ops && job->job.aio_context != qemu_get_aio_context()) {
245         aio_context_acquire(job->job.aio_context);
246     }
247     if (c == NULL) {
248         return -EPERM;
249     }
250
251     job->nodes = g_slist_prepend(job->nodes, c);
252     bdrv_op_block_all(bs, job->blocker);
253
254     return 0;
255 }
256
257 /* Called with job_mutex lock held. */
258 static void block_job_on_idle_locked(Notifier *n, void *opaque)
259 {
260     aio_wait_kick();
261 }
262
263 bool block_job_is_internal(BlockJob *job)
264 {
265     return (job->job.id == NULL);
266 }
267
268 const BlockJobDriver *block_job_driver(BlockJob *job)
269 {
270     return container_of(job->job.driver, BlockJobDriver, job_driver);
271 }
272
273 /* Assumes the job_mutex is held */
274 static bool job_timer_pending(Job *job)
275 {
276     return timer_pending(&job->sleep_timer);
277 }
278
279 bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp)
280 {
281     const BlockJobDriver *drv = block_job_driver(job);
282     int64_t old_speed = job->speed;
283
284     GLOBAL_STATE_CODE();
285
286     if (job_apply_verb_locked(&job->job, JOB_VERB_SET_SPEED, errp) < 0) {
287         return false;
288     }
289     if (speed < 0) {
290         error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "speed",
291                    "a non-negative value");
292         return false;
293     }
294
295     ratelimit_set_speed(&job->limit, speed, BLOCK_JOB_SLICE_TIME);
296
297     job->speed = speed;
298
299     if (drv->set_speed) {
300         job_unlock();
301         drv->set_speed(job, speed);
302         job_lock();
303     }
304
305     if (speed && speed <= old_speed) {
306         return true;
307     }
308
309     /* kick only if a timer is pending */
310     job_enter_cond_locked(&job->job, job_timer_pending);
311
312     return true;
313 }
314
315 static bool block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
316 {
317     JOB_LOCK_GUARD();
318     return block_job_set_speed_locked(job, speed, errp);
319 }
320
321 int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
322 {
323     IO_CODE();
324     return ratelimit_calculate_delay(&job->limit, n);
325 }
326
327 BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp)
328 {
329     BlockJobInfo *info;
330     uint64_t progress_current, progress_total;
331
332     GLOBAL_STATE_CODE();
333
334     if (block_job_is_internal(job)) {
335         error_setg(errp, "Cannot query QEMU internal jobs");
336         return NULL;
337     }
338
339     progress_get_snapshot(&job->job.progress, &progress_current,
340                           &progress_total);
341
342     info = g_new0(BlockJobInfo, 1);
343     info->type      = g_strdup(job_type_str(&job->job));
344     info->device    = g_strdup(job->job.id);
345     info->busy      = job->job.busy;
346     info->paused    = job->job.pause_count > 0;
347     info->offset    = progress_current;
348     info->len       = progress_total;
349     info->speed     = job->speed;
350     info->io_status = job->iostatus;
351     info->ready     = job_is_ready_locked(&job->job),
352     info->status    = job->job.status;
353     info->auto_finalize = job->job.auto_finalize;
354     info->auto_dismiss  = job->job.auto_dismiss;
355     if (job->job.ret) {
356         info->error = job->job.err ?
357                         g_strdup(error_get_pretty(job->job.err)) :
358                         g_strdup(strerror(-job->job.ret));
359     }
360     return info;
361 }
362
363 /* Called with job lock held */
364 static void block_job_iostatus_set_err_locked(BlockJob *job, int error)
365 {
366     if (job->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
367         job->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
368                                           BLOCK_DEVICE_IO_STATUS_FAILED;
369     }
370 }
371
372 /* Called with job_mutex lock held. */
373 static void block_job_event_cancelled_locked(Notifier *n, void *opaque)
374 {
375     BlockJob *job = opaque;
376     uint64_t progress_current, progress_total;
377
378     if (block_job_is_internal(job)) {
379         return;
380     }
381
382     progress_get_snapshot(&job->job.progress, &progress_current,
383                           &progress_total);
384
385     qapi_event_send_block_job_cancelled(job_type(&job->job),
386                                         job->job.id,
387                                         progress_total,
388                                         progress_current,
389                                         job->speed);
390 }
391
392 /* Called with job_mutex lock held. */
393 static void block_job_event_completed_locked(Notifier *n, void *opaque)
394 {
395     BlockJob *job = opaque;
396     const char *msg = NULL;
397     uint64_t progress_current, progress_total;
398
399     if (block_job_is_internal(job)) {
400         return;
401     }
402
403     if (job->job.ret < 0) {
404         msg = error_get_pretty(job->job.err);
405     }
406
407     progress_get_snapshot(&job->job.progress, &progress_current,
408                           &progress_total);
409
410     qapi_event_send_block_job_completed(job_type(&job->job),
411                                         job->job.id,
412                                         progress_total,
413                                         progress_current,
414                                         job->speed,
415                                         msg);
416 }
417
418 /* Called with job_mutex lock held. */
419 static void block_job_event_pending_locked(Notifier *n, void *opaque)
420 {
421     BlockJob *job = opaque;
422
423     if (block_job_is_internal(job)) {
424         return;
425     }
426
427     qapi_event_send_block_job_pending(job_type(&job->job),
428                                       job->job.id);
429 }
430
431 /* Called with job_mutex lock held. */
432 static void block_job_event_ready_locked(Notifier *n, void *opaque)
433 {
434     BlockJob *job = opaque;
435     uint64_t progress_current, progress_total;
436
437     if (block_job_is_internal(job)) {
438         return;
439     }
440
441     progress_get_snapshot(&job->job.progress, &progress_current,
442                           &progress_total);
443
444     qapi_event_send_block_job_ready(job_type(&job->job),
445                                     job->job.id,
446                                     progress_total,
447                                     progress_current,
448                                     job->speed);
449 }
450
451
452 void *block_job_create(const char *job_id, const BlockJobDriver *driver,
453                        JobTxn *txn, BlockDriverState *bs, uint64_t perm,
454                        uint64_t shared_perm, int64_t speed, int flags,
455                        BlockCompletionFunc *cb, void *opaque, Error **errp)
456 {
457     BlockJob *job;
458     int ret;
459     GLOBAL_STATE_CODE();
460
461     if (job_id == NULL && !(flags & JOB_INTERNAL)) {
462         job_id = bdrv_get_device_name(bs);
463     }
464
465     job = job_create(job_id, &driver->job_driver, txn, bdrv_get_aio_context(bs),
466                      flags, cb, opaque, errp);
467     if (job == NULL) {
468         return NULL;
469     }
470
471     assert(is_block_job(&job->job));
472     assert(job->job.driver->free == &block_job_free);
473     assert(job->job.driver->user_resume == &block_job_user_resume);
474
475     ratelimit_init(&job->limit);
476
477     job->finalize_cancelled_notifier.notify = block_job_event_cancelled_locked;
478     job->finalize_completed_notifier.notify = block_job_event_completed_locked;
479     job->pending_notifier.notify = block_job_event_pending_locked;
480     job->ready_notifier.notify = block_job_event_ready_locked;
481     job->idle_notifier.notify = block_job_on_idle_locked;
482
483     WITH_JOB_LOCK_GUARD() {
484         notifier_list_add(&job->job.on_finalize_cancelled,
485                           &job->finalize_cancelled_notifier);
486         notifier_list_add(&job->job.on_finalize_completed,
487                           &job->finalize_completed_notifier);
488         notifier_list_add(&job->job.on_pending, &job->pending_notifier);
489         notifier_list_add(&job->job.on_ready, &job->ready_notifier);
490         notifier_list_add(&job->job.on_idle, &job->idle_notifier);
491     }
492
493     error_setg(&job->blocker, "block device is in use by block job: %s",
494                job_type_str(&job->job));
495
496     ret = block_job_add_bdrv(job, "main node", bs, perm, shared_perm, errp);
497     if (ret < 0) {
498         goto fail;
499     }
500
501     bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
502
503     if (!block_job_set_speed(job, speed, errp)) {
504         goto fail;
505     }
506
507     return job;
508
509 fail:
510     job_early_fail(&job->job);
511     return NULL;
512 }
513
514 void block_job_iostatus_reset_locked(BlockJob *job)
515 {
516     GLOBAL_STATE_CODE();
517     if (job->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
518         return;
519     }
520     assert(job->job.user_paused && job->job.pause_count > 0);
521     job->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
522 }
523
524 static void block_job_iostatus_reset(BlockJob *job)
525 {
526     JOB_LOCK_GUARD();
527     block_job_iostatus_reset_locked(job);
528 }
529
530 void block_job_user_resume(Job *job)
531 {
532     BlockJob *bjob = container_of(job, BlockJob, job);
533     GLOBAL_STATE_CODE();
534     block_job_iostatus_reset(bjob);
535 }
536
537 BlockErrorAction block_job_error_action(BlockJob *job, BlockdevOnError on_err,
538                                         int is_read, int error)
539 {
540     BlockErrorAction action;
541     IO_CODE();
542
543     switch (on_err) {
544     case BLOCKDEV_ON_ERROR_ENOSPC:
545     case BLOCKDEV_ON_ERROR_AUTO:
546         action = (error == ENOSPC) ?
547                  BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
548         break;
549     case BLOCKDEV_ON_ERROR_STOP:
550         action = BLOCK_ERROR_ACTION_STOP;
551         break;
552     case BLOCKDEV_ON_ERROR_REPORT:
553         action = BLOCK_ERROR_ACTION_REPORT;
554         break;
555     case BLOCKDEV_ON_ERROR_IGNORE:
556         action = BLOCK_ERROR_ACTION_IGNORE;
557         break;
558     default:
559         abort();
560     }
561     if (!block_job_is_internal(job)) {
562         qapi_event_send_block_job_error(job->job.id,
563                                         is_read ? IO_OPERATION_TYPE_READ :
564                                         IO_OPERATION_TYPE_WRITE,
565                                         action);
566     }
567     if (action == BLOCK_ERROR_ACTION_STOP) {
568         WITH_JOB_LOCK_GUARD() {
569             if (!job->job.user_paused) {
570                 job_pause_locked(&job->job);
571                 /*
572                  * make the pause user visible, which will be
573                  * resumed from QMP.
574                  */
575                 job->job.user_paused = true;
576             }
577             block_job_iostatus_set_err_locked(job, error);
578         }
579     }
580     return action;
581 }
582
583 AioContext *block_job_get_aio_context(BlockJob *job)
584 {
585     GLOBAL_STATE_CODE();
586     return job->job.aio_context;
587 }