xref: /openbmc/qemu/blockjob.c (revision e285977e77e534f128413b86cabab68bbffcbe4c)
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 "qemu-common.h"
28  #include "block/block.h"
29  #include "block/blockjob_int.h"
30  #include "block/block_int.h"
31  #include "block/trace.h"
32  #include "sysemu/block-backend.h"
33  #include "qapi/error.h"
34  #include "qapi/qapi-events-block-core.h"
35  #include "qapi/qmp/qerror.h"
36  #include "qemu/coroutine.h"
37  #include "qemu/timer.h"
38  
39  /*
40   * The block job API is composed of two categories of functions.
41   *
42   * The first includes functions used by the monitor.  The monitor is
43   * peculiar in that it accesses the block job list with block_job_get, and
44   * therefore needs consistency across block_job_get and the actual operation
45   * (e.g. block_job_set_speed).  The consistency is achieved with
46   * aio_context_acquire/release.  These functions are declared in blockjob.h.
47   *
48   * The second includes functions used by the block job drivers and sometimes
49   * by the core block layer.  These do not care about locking, because the
50   * whole coroutine runs under the AioContext lock, and are declared in
51   * blockjob_int.h.
52   */
53  
54  static bool is_block_job(Job *job)
55  {
56      return job_type(job) == JOB_TYPE_BACKUP ||
57             job_type(job) == JOB_TYPE_COMMIT ||
58             job_type(job) == JOB_TYPE_MIRROR ||
59             job_type(job) == JOB_TYPE_STREAM;
60  }
61  
62  BlockJob *block_job_next(BlockJob *bjob)
63  {
64      Job *job = bjob ? &bjob->job : NULL;
65  
66      do {
67          job = job_next(job);
68      } while (job && !is_block_job(job));
69  
70      return job ? container_of(job, BlockJob, job) : NULL;
71  }
72  
73  BlockJob *block_job_get(const char *id)
74  {
75      Job *job = job_get(id);
76  
77      if (job && is_block_job(job)) {
78          return container_of(job, BlockJob, job);
79      } else {
80          return NULL;
81      }
82  }
83  
84  static void block_job_attached_aio_context(AioContext *new_context,
85                                             void *opaque);
86  static void block_job_detach_aio_context(void *opaque);
87  
88  void block_job_free(Job *job)
89  {
90      BlockJob *bjob = container_of(job, BlockJob, job);
91      BlockDriverState *bs = blk_bs(bjob->blk);
92  
93      bs->job = NULL;
94      block_job_remove_all_bdrv(bjob);
95      blk_remove_aio_context_notifier(bjob->blk,
96                                      block_job_attached_aio_context,
97                                      block_job_detach_aio_context, bjob);
98      blk_unref(bjob->blk);
99      error_free(bjob->blocker);
100  }
101  
102  static void block_job_attached_aio_context(AioContext *new_context,
103                                             void *opaque)
104  {
105      BlockJob *job = opaque;
106      const JobDriver *drv = job->job.driver;
107      BlockJobDriver *bjdrv = container_of(drv, BlockJobDriver, job_driver);
108  
109      job->job.aio_context = new_context;
110      if (bjdrv->attached_aio_context) {
111          bjdrv->attached_aio_context(job, new_context);
112      }
113  
114      job_resume(&job->job);
115  }
116  
117  void block_job_drain(Job *job)
118  {
119      BlockJob *bjob = container_of(job, BlockJob, job);
120      const JobDriver *drv = job->driver;
121      BlockJobDriver *bjdrv = container_of(drv, BlockJobDriver, job_driver);
122  
123      blk_drain(bjob->blk);
124      if (bjdrv->drain) {
125          bjdrv->drain(bjob);
126      }
127  }
128  
129  static void block_job_detach_aio_context(void *opaque)
130  {
131      BlockJob *job = opaque;
132  
133      /* In case the job terminates during aio_poll()... */
134      job_ref(&job->job);
135  
136      job_pause(&job->job);
137  
138      while (!job->job.paused && !job_is_completed(&job->job)) {
139          job_drain(&job->job);
140      }
141  
142      job->job.aio_context = NULL;
143      job_unref(&job->job);
144  }
145  
146  static char *child_job_get_parent_desc(BdrvChild *c)
147  {
148      BlockJob *job = c->opaque;
149      return g_strdup_printf("%s job '%s'", job_type_str(&job->job), job->job.id);
150  }
151  
152  static void child_job_drained_begin(BdrvChild *c)
153  {
154      BlockJob *job = c->opaque;
155      job_pause(&job->job);
156  }
157  
158  static bool child_job_drained_poll(BdrvChild *c)
159  {
160      BlockJob *bjob = c->opaque;
161      Job *job = &bjob->job;
162      const BlockJobDriver *drv = block_job_driver(bjob);
163  
164      /* An inactive or completed job doesn't have any pending requests. Jobs
165       * with !job->busy are either already paused or have a pause point after
166       * being reentered, so no job driver code will run before they pause. */
167      if (!job->busy || job_is_completed(job)) {
168          return false;
169      }
170  
171      /* Otherwise, assume that it isn't fully stopped yet, but allow the job to
172       * override this assumption. */
173      if (drv->drained_poll) {
174          return drv->drained_poll(bjob);
175      } else {
176          return true;
177      }
178  }
179  
180  static void child_job_drained_end(BdrvChild *c)
181  {
182      BlockJob *job = c->opaque;
183      job_resume(&job->job);
184  }
185  
186  static const BdrvChildRole child_job = {
187      .get_parent_desc    = child_job_get_parent_desc,
188      .drained_begin      = child_job_drained_begin,
189      .drained_poll       = child_job_drained_poll,
190      .drained_end        = child_job_drained_end,
191      .stay_at_node       = true,
192  };
193  
194  void block_job_remove_all_bdrv(BlockJob *job)
195  {
196      GSList *l;
197      for (l = job->nodes; l; l = l->next) {
198          BdrvChild *c = l->data;
199          bdrv_op_unblock_all(c->bs, job->blocker);
200          bdrv_root_unref_child(c);
201      }
202      g_slist_free(job->nodes);
203      job->nodes = NULL;
204  }
205  
206  int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
207                         uint64_t perm, uint64_t shared_perm, Error **errp)
208  {
209      BdrvChild *c;
210  
211      c = bdrv_root_attach_child(bs, name, &child_job, perm, shared_perm,
212                                 job, errp);
213      if (c == NULL) {
214          return -EPERM;
215      }
216  
217      job->nodes = g_slist_prepend(job->nodes, c);
218      bdrv_ref(bs);
219      bdrv_op_block_all(bs, job->blocker);
220  
221      return 0;
222  }
223  
224  static void block_job_on_idle(Notifier *n, void *opaque)
225  {
226      aio_wait_kick();
227  }
228  
229  bool block_job_is_internal(BlockJob *job)
230  {
231      return (job->job.id == NULL);
232  }
233  
234  const BlockJobDriver *block_job_driver(BlockJob *job)
235  {
236      return container_of(job->job.driver, BlockJobDriver, job_driver);
237  }
238  
239  /* Assumes the job_mutex is held */
240  static bool job_timer_pending(Job *job)
241  {
242      return timer_pending(&job->sleep_timer);
243  }
244  
245  void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
246  {
247      int64_t old_speed = job->speed;
248  
249      if (job_apply_verb(&job->job, JOB_VERB_SET_SPEED, errp)) {
250          return;
251      }
252      if (speed < 0) {
253          error_setg(errp, QERR_INVALID_PARAMETER, "speed");
254          return;
255      }
256  
257      ratelimit_set_speed(&job->limit, speed, BLOCK_JOB_SLICE_TIME);
258  
259      job->speed = speed;
260      if (speed && speed <= old_speed) {
261          return;
262      }
263  
264      /* kick only if a timer is pending */
265      job_enter_cond(&job->job, job_timer_pending);
266  }
267  
268  int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
269  {
270      if (!job->speed) {
271          return 0;
272      }
273  
274      return ratelimit_calculate_delay(&job->limit, n);
275  }
276  
277  BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
278  {
279      BlockJobInfo *info;
280  
281      if (block_job_is_internal(job)) {
282          error_setg(errp, "Cannot query QEMU internal jobs");
283          return NULL;
284      }
285      info = g_new0(BlockJobInfo, 1);
286      info->type      = g_strdup(job_type_str(&job->job));
287      info->device    = g_strdup(job->job.id);
288      info->busy      = atomic_read(&job->job.busy);
289      info->paused    = job->job.pause_count > 0;
290      info->offset    = job->job.progress_current;
291      info->len       = job->job.progress_total;
292      info->speed     = job->speed;
293      info->io_status = job->iostatus;
294      info->ready     = job_is_ready(&job->job),
295      info->status    = job->job.status;
296      info->auto_finalize = job->job.auto_finalize;
297      info->auto_dismiss  = job->job.auto_dismiss;
298      info->has_error = job->job.ret != 0;
299      info->error     = job->job.ret ? g_strdup(strerror(-job->job.ret)) : NULL;
300      return info;
301  }
302  
303  static void block_job_iostatus_set_err(BlockJob *job, int error)
304  {
305      if (job->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
306          job->iostatus = error == ENOSPC ? BLOCK_DEVICE_IO_STATUS_NOSPACE :
307                                            BLOCK_DEVICE_IO_STATUS_FAILED;
308      }
309  }
310  
311  static void block_job_event_cancelled(Notifier *n, void *opaque)
312  {
313      BlockJob *job = opaque;
314  
315      if (block_job_is_internal(job)) {
316          return;
317      }
318  
319      qapi_event_send_block_job_cancelled(job_type(&job->job),
320                                          job->job.id,
321                                          job->job.progress_total,
322                                          job->job.progress_current,
323                                          job->speed);
324  }
325  
326  static void block_job_event_completed(Notifier *n, void *opaque)
327  {
328      BlockJob *job = opaque;
329      const char *msg = NULL;
330  
331      if (block_job_is_internal(job)) {
332          return;
333      }
334  
335      if (job->job.ret < 0) {
336          msg = strerror(-job->job.ret);
337      }
338  
339      qapi_event_send_block_job_completed(job_type(&job->job),
340                                          job->job.id,
341                                          job->job.progress_total,
342                                          job->job.progress_current,
343                                          job->speed,
344                                          !!msg,
345                                          msg);
346  }
347  
348  static void block_job_event_pending(Notifier *n, void *opaque)
349  {
350      BlockJob *job = opaque;
351  
352      if (block_job_is_internal(job)) {
353          return;
354      }
355  
356      qapi_event_send_block_job_pending(job_type(&job->job),
357                                        job->job.id);
358  }
359  
360  static void block_job_event_ready(Notifier *n, void *opaque)
361  {
362      BlockJob *job = opaque;
363  
364      if (block_job_is_internal(job)) {
365          return;
366      }
367  
368      qapi_event_send_block_job_ready(job_type(&job->job),
369                                      job->job.id,
370                                      job->job.progress_total,
371                                      job->job.progress_current,
372                                      job->speed);
373  }
374  
375  
376  /*
377   * API for block job drivers and the block layer.  These functions are
378   * declared in blockjob_int.h.
379   */
380  
381  void *block_job_create(const char *job_id, const BlockJobDriver *driver,
382                         JobTxn *txn, BlockDriverState *bs, uint64_t perm,
383                         uint64_t shared_perm, int64_t speed, int flags,
384                         BlockCompletionFunc *cb, void *opaque, Error **errp)
385  {
386      BlockBackend *blk;
387      BlockJob *job;
388      int ret;
389  
390      if (bs->job) {
391          error_setg(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs));
392          return NULL;
393      }
394  
395      if (job_id == NULL && !(flags & JOB_INTERNAL)) {
396          job_id = bdrv_get_device_name(bs);
397      }
398  
399      blk = blk_new(perm, shared_perm);
400      ret = blk_insert_bs(blk, bs, errp);
401      if (ret < 0) {
402          blk_unref(blk);
403          return NULL;
404      }
405  
406      job = job_create(job_id, &driver->job_driver, txn, blk_get_aio_context(blk),
407                       flags, cb, opaque, errp);
408      if (job == NULL) {
409          blk_unref(blk);
410          return NULL;
411      }
412  
413      assert(is_block_job(&job->job));
414      assert(job->job.driver->free == &block_job_free);
415      assert(job->job.driver->user_resume == &block_job_user_resume);
416      assert(job->job.driver->drain == &block_job_drain);
417  
418      job->blk = blk;
419  
420      job->finalize_cancelled_notifier.notify = block_job_event_cancelled;
421      job->finalize_completed_notifier.notify = block_job_event_completed;
422      job->pending_notifier.notify = block_job_event_pending;
423      job->ready_notifier.notify = block_job_event_ready;
424      job->idle_notifier.notify = block_job_on_idle;
425  
426      notifier_list_add(&job->job.on_finalize_cancelled,
427                        &job->finalize_cancelled_notifier);
428      notifier_list_add(&job->job.on_finalize_completed,
429                        &job->finalize_completed_notifier);
430      notifier_list_add(&job->job.on_pending, &job->pending_notifier);
431      notifier_list_add(&job->job.on_ready, &job->ready_notifier);
432      notifier_list_add(&job->job.on_idle, &job->idle_notifier);
433  
434      error_setg(&job->blocker, "block device is in use by block job: %s",
435                 job_type_str(&job->job));
436      block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
437      bs->job = job;
438  
439      bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
440  
441      blk_add_aio_context_notifier(blk, block_job_attached_aio_context,
442                                   block_job_detach_aio_context, job);
443  
444      /* Only set speed when necessary to avoid NotSupported error */
445      if (speed != 0) {
446          Error *local_err = NULL;
447  
448          block_job_set_speed(job, speed, &local_err);
449          if (local_err) {
450              job_early_fail(&job->job);
451              error_propagate(errp, local_err);
452              return NULL;
453          }
454      }
455  
456      return job;
457  }
458  
459  void block_job_iostatus_reset(BlockJob *job)
460  {
461      if (job->iostatus == BLOCK_DEVICE_IO_STATUS_OK) {
462          return;
463      }
464      assert(job->job.user_paused && job->job.pause_count > 0);
465      job->iostatus = BLOCK_DEVICE_IO_STATUS_OK;
466  }
467  
468  void block_job_user_resume(Job *job)
469  {
470      BlockJob *bjob = container_of(job, BlockJob, job);
471      block_job_iostatus_reset(bjob);
472  }
473  
474  BlockErrorAction block_job_error_action(BlockJob *job, BlockdevOnError on_err,
475                                          int is_read, int error)
476  {
477      BlockErrorAction action;
478  
479      switch (on_err) {
480      case BLOCKDEV_ON_ERROR_ENOSPC:
481      case BLOCKDEV_ON_ERROR_AUTO:
482          action = (error == ENOSPC) ?
483                   BLOCK_ERROR_ACTION_STOP : BLOCK_ERROR_ACTION_REPORT;
484          break;
485      case BLOCKDEV_ON_ERROR_STOP:
486          action = BLOCK_ERROR_ACTION_STOP;
487          break;
488      case BLOCKDEV_ON_ERROR_REPORT:
489          action = BLOCK_ERROR_ACTION_REPORT;
490          break;
491      case BLOCKDEV_ON_ERROR_IGNORE:
492          action = BLOCK_ERROR_ACTION_IGNORE;
493          break;
494      default:
495          abort();
496      }
497      if (!block_job_is_internal(job)) {
498          qapi_event_send_block_job_error(job->job.id,
499                                          is_read ? IO_OPERATION_TYPE_READ :
500                                          IO_OPERATION_TYPE_WRITE,
501                                          action);
502      }
503      if (action == BLOCK_ERROR_ACTION_STOP) {
504          job_pause(&job->job);
505          /* make the pause user visible, which will be resumed from QMP. */
506          job->job.user_paused = true;
507          block_job_iostatus_set_err(job, error);
508      }
509      return action;
510  }
511