qemu/include/block/blockjob.h
<<
>>
Prefs
   1/*
   2 * Declarations for long-running block device operations
   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#ifndef BLOCKJOB_H
  27#define BLOCKJOB_H
  28
  29#include "qapi/qapi-types-block-core.h"
  30#include "qemu/job.h"
  31#include "qemu/ratelimit.h"
  32
  33#define BLOCK_JOB_SLICE_TIME 100000000ULL /* ns */
  34
  35typedef struct BlockJobDriver BlockJobDriver;
  36
  37/**
  38 * BlockJob:
  39 *
  40 * Long-running operation on a BlockDriverState.
  41 */
  42typedef struct BlockJob {
  43    /**
  44     * Data belonging to the generic Job infrastructure.
  45     * Protected by job mutex.
  46     */
  47    Job job;
  48
  49    /**
  50     * Status that is published by the query-block-jobs QMP API.
  51     * Protected by job mutex.
  52     */
  53    BlockDeviceIoStatus iostatus;
  54
  55    /**
  56     * Speed that was set with @block_job_set_speed.
  57     * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
  58     */
  59    int64_t speed;
  60
  61    /**
  62     * Rate limiting data structure for implementing @speed.
  63     * RateLimit API is thread-safe.
  64     */
  65    RateLimit limit;
  66
  67    /**
  68     * Block other operations when block job is running.
  69     * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
  70     */
  71    Error *blocker;
  72
  73    /** All notifiers are set once in block_job_create() and never modified. */
  74
  75    /** Called when a cancelled job is finalised. */
  76    Notifier finalize_cancelled_notifier;
  77
  78    /** Called when a successfully completed job is finalised. */
  79    Notifier finalize_completed_notifier;
  80
  81    /** Called when the job transitions to PENDING */
  82    Notifier pending_notifier;
  83
  84    /** Called when the job transitions to READY */
  85    Notifier ready_notifier;
  86
  87    /** Called when the job coroutine yields or terminates */
  88    Notifier idle_notifier;
  89
  90    /**
  91     * BlockDriverStates that are involved in this block job.
  92     * Always modified and read under QEMU global mutex (GLOBAL_STATE_CODE).
  93     */
  94    GSList *nodes;
  95} BlockJob;
  96
  97/*
  98 * Global state (GS) API. These functions run under the BQL.
  99 *
 100 * See include/block/block-global-state.h for more information about
 101 * the GS API.
 102 */
 103
 104/**
 105 * block_job_next_locked:
 106 * @job: A block job, or %NULL.
 107 *
 108 * Get the next element from the list of block jobs after @job, or the
 109 * first one if @job is %NULL.
 110 *
 111 * Returns the requested job, or %NULL if there are no more jobs left.
 112 * Called with job lock held.
 113 */
 114BlockJob *block_job_next_locked(BlockJob *job);
 115
 116/**
 117 * block_job_get:
 118 * @id: The id of the block job.
 119 *
 120 * Get the block job identified by @id (which must not be %NULL).
 121 *
 122 * Returns the requested job, or %NULL if it doesn't exist.
 123 * Called with job lock *not* held.
 124 */
 125BlockJob *block_job_get(const char *id);
 126
 127/* Same as block_job_get(), but called with job lock held. */
 128BlockJob *block_job_get_locked(const char *id);
 129
 130/**
 131 * block_job_add_bdrv:
 132 * @job: A block job
 133 * @name: The name to assign to the new BdrvChild
 134 * @bs: A BlockDriverState that is involved in @job
 135 * @perm, @shared_perm: Permissions to request on the node
 136 *
 137 * Add @bs to the list of BlockDriverState that are involved in
 138 * @job. This means that all operations will be blocked on @bs while
 139 * @job exists.
 140 */
 141int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
 142                       uint64_t perm, uint64_t shared_perm, Error **errp);
 143
 144/**
 145 * block_job_remove_all_bdrv:
 146 * @job: The block job
 147 *
 148 * Remove all BlockDriverStates from the list of nodes that are involved in the
 149 * job. This removes the blockers added with block_job_add_bdrv().
 150 */
 151void block_job_remove_all_bdrv(BlockJob *job);
 152
 153/**
 154 * block_job_has_bdrv:
 155 * @job: The block job
 156 *
 157 * Searches for @bs in the list of nodes that are involved in the
 158 * job.
 159 */
 160bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs);
 161
 162/**
 163 * block_job_set_speed_locked:
 164 * @job: The job to set the speed for.
 165 * @speed: The new value
 166 * @errp: Error object.
 167 *
 168 * Set a rate-limiting parameter for the job; the actual meaning may
 169 * vary depending on the job type.
 170 *
 171 * Called with job lock held, but might release it temporarily.
 172 */
 173bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp);
 174
 175/**
 176 * block_job_query_locked:
 177 * @job: The job to get information about.
 178 *
 179 * Return information about a job.
 180 *
 181 * Called with job lock held.
 182 */
 183BlockJobInfo *block_job_query_locked(BlockJob *job, Error **errp);
 184
 185/**
 186 * block_job_iostatus_reset_locked:
 187 * @job: The job whose I/O status should be reset.
 188 *
 189 * Reset I/O status on @job and on BlockDriverState objects it uses,
 190 * other than job->blk.
 191 *
 192 * Called with job lock held.
 193 */
 194void block_job_iostatus_reset_locked(BlockJob *job);
 195
 196/*
 197 * block_job_get_aio_context:
 198 *
 199 * Returns aio context associated with a block job.
 200 */
 201AioContext *block_job_get_aio_context(BlockJob *job);
 202
 203
 204/*
 205 * Common functions that are neither I/O nor Global State.
 206 *
 207 * See include/block/block-common.h for more information about
 208 * the Common API.
 209 */
 210
 211/**
 212 * block_job_is_internal:
 213 * @job: The job to determine if it is user-visible or not.
 214 *
 215 * Returns true if the job should not be visible to the management layer.
 216 */
 217bool block_job_is_internal(BlockJob *job);
 218
 219/**
 220 * block_job_driver:
 221 *
 222 * Returns the driver associated with a block job.
 223 */
 224const BlockJobDriver *block_job_driver(BlockJob *job);
 225
 226#endif
 227