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 "qemu/job.h"
  30#include "block/block.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    /** Data belonging to the generic Job infrastructure */
  44    Job job;
  45
  46    /** Status that is published by the query-block-jobs QMP API */
  47    BlockDeviceIoStatus iostatus;
  48
  49    /** Speed that was set with @block_job_set_speed.  */
  50    int64_t speed;
  51
  52    /** Rate limiting data structure for implementing @speed. */
  53    RateLimit limit;
  54
  55    /** Block other operations when block job is running */
  56    Error *blocker;
  57
  58    /** Called when a cancelled job is finalised. */
  59    Notifier finalize_cancelled_notifier;
  60
  61    /** Called when a successfully completed job is finalised. */
  62    Notifier finalize_completed_notifier;
  63
  64    /** Called when the job transitions to PENDING */
  65    Notifier pending_notifier;
  66
  67    /** Called when the job transitions to READY */
  68    Notifier ready_notifier;
  69
  70    /** Called when the job coroutine yields or terminates */
  71    Notifier idle_notifier;
  72
  73    /** BlockDriverStates that are involved in this block job */
  74    GSList *nodes;
  75} BlockJob;
  76
  77/*
  78 * Global state (GS) API. These functions run under the BQL.
  79 *
  80 * See include/block/block-global-state.h for more information about
  81 * the GS API.
  82 */
  83
  84/**
  85 * block_job_next:
  86 * @job: A block job, or %NULL.
  87 *
  88 * Get the next element from the list of block jobs after @job, or the
  89 * first one if @job is %NULL.
  90 *
  91 * Returns the requested job, or %NULL if there are no more jobs left.
  92 */
  93BlockJob *block_job_next(BlockJob *job);
  94
  95/**
  96 * block_job_get:
  97 * @id: The id of the block job.
  98 *
  99 * Get the block job identified by @id (which must not be %NULL).
 100 *
 101 * Returns the requested job, or %NULL if it doesn't exist.
 102 */
 103BlockJob *block_job_get(const char *id);
 104
 105/**
 106 * block_job_add_bdrv:
 107 * @job: A block job
 108 * @name: The name to assign to the new BdrvChild
 109 * @bs: A BlockDriverState that is involved in @job
 110 * @perm, @shared_perm: Permissions to request on the node
 111 *
 112 * Add @bs to the list of BlockDriverState that are involved in
 113 * @job. This means that all operations will be blocked on @bs while
 114 * @job exists.
 115 */
 116int block_job_add_bdrv(BlockJob *job, const char *name, BlockDriverState *bs,
 117                       uint64_t perm, uint64_t shared_perm, Error **errp);
 118
 119/**
 120 * block_job_remove_all_bdrv:
 121 * @job: The block job
 122 *
 123 * Remove all BlockDriverStates from the list of nodes that are involved in the
 124 * job. This removes the blockers added with block_job_add_bdrv().
 125 */
 126void block_job_remove_all_bdrv(BlockJob *job);
 127
 128/**
 129 * block_job_has_bdrv:
 130 * @job: The block job
 131 *
 132 * Searches for @bs in the list of nodes that are involved in the
 133 * job.
 134 */
 135bool block_job_has_bdrv(BlockJob *job, BlockDriverState *bs);
 136
 137/**
 138 * block_job_set_speed:
 139 * @job: The job to set the speed for.
 140 * @speed: The new value
 141 * @errp: Error object.
 142 *
 143 * Set a rate-limiting parameter for the job; the actual meaning may
 144 * vary depending on the job type.
 145 */
 146bool block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
 147
 148/**
 149 * block_job_query:
 150 * @job: The job to get information about.
 151 *
 152 * Return information about a job.
 153 */
 154BlockJobInfo *block_job_query(BlockJob *job, Error **errp);
 155
 156/**
 157 * block_job_iostatus_reset:
 158 * @job: The job whose I/O status should be reset.
 159 *
 160 * Reset I/O status on @job and on BlockDriverState objects it uses,
 161 * other than job->blk.
 162 */
 163void block_job_iostatus_reset(BlockJob *job);
 164
 165/*
 166 * block_job_get_aio_context:
 167 *
 168 * Returns aio context associated with a block job.
 169 */
 170AioContext *block_job_get_aio_context(BlockJob *job);
 171
 172
 173/*
 174 * Common functions that are neither I/O nor Global State.
 175 *
 176 * See include/block/block-common.h for more information about
 177 * the Common API.
 178 */
 179
 180/**
 181 * block_job_is_internal:
 182 * @job: The job to determine if it is user-visible or not.
 183 *
 184 * Returns true if the job should not be visible to the management layer.
 185 */
 186bool block_job_is_internal(BlockJob *job);
 187
 188/**
 189 * block_job_driver:
 190 *
 191 * Returns the driver associated with a block job.
 192 */
 193const BlockJobDriver *block_job_driver(BlockJob *job);
 194
 195#endif
 196