Statistics
| Branch: | Revision:

root / blockjob.h @ 31a32289

History | View | Annotate | Download (8.1 kB)

1 2f0c9fe6 Paolo Bonzini
/*
2 2f0c9fe6 Paolo Bonzini
 * Declarations for long-running block device operations
3 2f0c9fe6 Paolo Bonzini
 *
4 2f0c9fe6 Paolo Bonzini
 * Copyright (c) 2011 IBM Corp.
5 2f0c9fe6 Paolo Bonzini
 * Copyright (c) 2012 Red Hat, Inc.
6 2f0c9fe6 Paolo Bonzini
 *
7 2f0c9fe6 Paolo Bonzini
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 2f0c9fe6 Paolo Bonzini
 * of this software and associated documentation files (the "Software"), to deal
9 2f0c9fe6 Paolo Bonzini
 * in the Software without restriction, including without limitation the rights
10 2f0c9fe6 Paolo Bonzini
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 2f0c9fe6 Paolo Bonzini
 * copies of the Software, and to permit persons to whom the Software is
12 2f0c9fe6 Paolo Bonzini
 * furnished to do so, subject to the following conditions:
13 2f0c9fe6 Paolo Bonzini
 *
14 2f0c9fe6 Paolo Bonzini
 * The above copyright notice and this permission notice shall be included in
15 2f0c9fe6 Paolo Bonzini
 * all copies or substantial portions of the Software.
16 2f0c9fe6 Paolo Bonzini
 *
17 2f0c9fe6 Paolo Bonzini
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 2f0c9fe6 Paolo Bonzini
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 2f0c9fe6 Paolo Bonzini
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 2f0c9fe6 Paolo Bonzini
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 2f0c9fe6 Paolo Bonzini
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 2f0c9fe6 Paolo Bonzini
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 2f0c9fe6 Paolo Bonzini
 * THE SOFTWARE.
24 2f0c9fe6 Paolo Bonzini
 */
25 2f0c9fe6 Paolo Bonzini
#ifndef BLOCKJOB_H
26 2f0c9fe6 Paolo Bonzini
#define BLOCKJOB_H 1
27 2f0c9fe6 Paolo Bonzini
28 2f0c9fe6 Paolo Bonzini
#include "block.h"
29 2f0c9fe6 Paolo Bonzini
30 2f0c9fe6 Paolo Bonzini
/**
31 2f0c9fe6 Paolo Bonzini
 * BlockJobType:
32 2f0c9fe6 Paolo Bonzini
 *
33 2f0c9fe6 Paolo Bonzini
 * A class type for block job objects.
34 2f0c9fe6 Paolo Bonzini
 */
35 2f0c9fe6 Paolo Bonzini
typedef struct BlockJobType {
36 2f0c9fe6 Paolo Bonzini
    /** Derived BlockJob struct size */
37 2f0c9fe6 Paolo Bonzini
    size_t instance_size;
38 2f0c9fe6 Paolo Bonzini
39 2f0c9fe6 Paolo Bonzini
    /** String describing the operation, part of query-block-jobs QMP API */
40 2f0c9fe6 Paolo Bonzini
    const char *job_type;
41 2f0c9fe6 Paolo Bonzini
42 2f0c9fe6 Paolo Bonzini
    /** Optional callback for job types that support setting a speed limit */
43 2f0c9fe6 Paolo Bonzini
    void (*set_speed)(BlockJob *job, int64_t speed, Error **errp);
44 aeae883b Paolo Bonzini
45 3bd293c3 Paolo Bonzini
    /** Optional callback for job types that need to forward I/O status reset */
46 3bd293c3 Paolo Bonzini
    void (*iostatus_reset)(BlockJob *job);
47 3bd293c3 Paolo Bonzini
48 aeae883b Paolo Bonzini
    /**
49 aeae883b Paolo Bonzini
     * Optional callback for job types whose completion must be triggered
50 aeae883b Paolo Bonzini
     * manually.
51 aeae883b Paolo Bonzini
     */
52 aeae883b Paolo Bonzini
    void (*complete)(BlockJob *job, Error **errp);
53 2f0c9fe6 Paolo Bonzini
} BlockJobType;
54 2f0c9fe6 Paolo Bonzini
55 2f0c9fe6 Paolo Bonzini
/**
56 2f0c9fe6 Paolo Bonzini
 * BlockJob:
57 2f0c9fe6 Paolo Bonzini
 *
58 2f0c9fe6 Paolo Bonzini
 * Long-running operation on a BlockDriverState.
59 2f0c9fe6 Paolo Bonzini
 */
60 2f0c9fe6 Paolo Bonzini
struct BlockJob {
61 2f0c9fe6 Paolo Bonzini
    /** The job type, including the job vtable.  */
62 2f0c9fe6 Paolo Bonzini
    const BlockJobType *job_type;
63 2f0c9fe6 Paolo Bonzini
64 2f0c9fe6 Paolo Bonzini
    /** The block device on which the job is operating.  */
65 2f0c9fe6 Paolo Bonzini
    BlockDriverState *bs;
66 2f0c9fe6 Paolo Bonzini
67 2f0c9fe6 Paolo Bonzini
    /**
68 2f0c9fe6 Paolo Bonzini
     * The coroutine that executes the job.  If not NULL, it is
69 2f0c9fe6 Paolo Bonzini
     * reentered when busy is false and the job is cancelled.
70 2f0c9fe6 Paolo Bonzini
     */
71 2f0c9fe6 Paolo Bonzini
    Coroutine *co;
72 2f0c9fe6 Paolo Bonzini
73 2f0c9fe6 Paolo Bonzini
    /**
74 2f0c9fe6 Paolo Bonzini
     * Set to true if the job should cancel itself.  The flag must
75 2f0c9fe6 Paolo Bonzini
     * always be tested just before toggling the busy flag from false
76 2f0c9fe6 Paolo Bonzini
     * to true.  After a job has been cancelled, it should only yield
77 2f0c9fe6 Paolo Bonzini
     * if #qemu_aio_wait will ("sooner or later") reenter the coroutine.
78 2f0c9fe6 Paolo Bonzini
     */
79 2f0c9fe6 Paolo Bonzini
    bool cancelled;
80 2f0c9fe6 Paolo Bonzini
81 2f0c9fe6 Paolo Bonzini
    /**
82 8acc72a4 Paolo Bonzini
     * Set to true if the job is either paused, or will pause itself
83 8acc72a4 Paolo Bonzini
     * as soon as possible (if busy == true).
84 8acc72a4 Paolo Bonzini
     */
85 8acc72a4 Paolo Bonzini
    bool paused;
86 8acc72a4 Paolo Bonzini
87 8acc72a4 Paolo Bonzini
    /**
88 2f0c9fe6 Paolo Bonzini
     * Set to false by the job while it is in a quiescent state, where
89 2f0c9fe6 Paolo Bonzini
     * no I/O is pending and the job has yielded on any condition
90 2f0c9fe6 Paolo Bonzini
     * that is not detected by #qemu_aio_wait, such as a timer.
91 2f0c9fe6 Paolo Bonzini
     */
92 2f0c9fe6 Paolo Bonzini
    bool busy;
93 2f0c9fe6 Paolo Bonzini
94 32c81a4a Paolo Bonzini
    /** Status that is published by the query-block-jobs QMP API */
95 32c81a4a Paolo Bonzini
    BlockDeviceIoStatus iostatus;
96 32c81a4a Paolo Bonzini
97 2f0c9fe6 Paolo Bonzini
    /** Offset that is published by the query-block-jobs QMP API */
98 2f0c9fe6 Paolo Bonzini
    int64_t offset;
99 2f0c9fe6 Paolo Bonzini
100 2f0c9fe6 Paolo Bonzini
    /** Length that is published by the query-block-jobs QMP API */
101 2f0c9fe6 Paolo Bonzini
    int64_t len;
102 2f0c9fe6 Paolo Bonzini
103 2f0c9fe6 Paolo Bonzini
    /** Speed that was set with @block_job_set_speed.  */
104 2f0c9fe6 Paolo Bonzini
    int64_t speed;
105 2f0c9fe6 Paolo Bonzini
106 2f0c9fe6 Paolo Bonzini
    /** The completion function that will be called when the job completes.  */
107 2f0c9fe6 Paolo Bonzini
    BlockDriverCompletionFunc *cb;
108 2f0c9fe6 Paolo Bonzini
109 2f0c9fe6 Paolo Bonzini
    /** The opaque value that is passed to the completion function.  */
110 2f0c9fe6 Paolo Bonzini
    void *opaque;
111 2f0c9fe6 Paolo Bonzini
};
112 2f0c9fe6 Paolo Bonzini
113 2f0c9fe6 Paolo Bonzini
/**
114 2f0c9fe6 Paolo Bonzini
 * block_job_create:
115 2f0c9fe6 Paolo Bonzini
 * @job_type: The class object for the newly-created job.
116 2f0c9fe6 Paolo Bonzini
 * @bs: The block
117 2f0c9fe6 Paolo Bonzini
 * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
118 2f0c9fe6 Paolo Bonzini
 * @cb: Completion function for the job.
119 2f0c9fe6 Paolo Bonzini
 * @opaque: Opaque pointer value passed to @cb.
120 2f0c9fe6 Paolo Bonzini
 * @errp: Error object.
121 2f0c9fe6 Paolo Bonzini
 *
122 2f0c9fe6 Paolo Bonzini
 * Create a new long-running block device job and return it.  The job
123 2f0c9fe6 Paolo Bonzini
 * will call @cb asynchronously when the job completes.  Note that
124 2f0c9fe6 Paolo Bonzini
 * @bs may have been closed at the time the @cb it is called.  If
125 2f0c9fe6 Paolo Bonzini
 * this is the case, the job may be reported as either cancelled or
126 2f0c9fe6 Paolo Bonzini
 * completed.
127 2f0c9fe6 Paolo Bonzini
 *
128 2f0c9fe6 Paolo Bonzini
 * This function is not part of the public job interface; it should be
129 2f0c9fe6 Paolo Bonzini
 * called from a wrapper that is specific to the job type.
130 2f0c9fe6 Paolo Bonzini
 */
131 2f0c9fe6 Paolo Bonzini
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
132 2f0c9fe6 Paolo Bonzini
                       int64_t speed, BlockDriverCompletionFunc *cb,
133 2f0c9fe6 Paolo Bonzini
                       void *opaque, Error **errp);
134 2f0c9fe6 Paolo Bonzini
135 2f0c9fe6 Paolo Bonzini
/**
136 2f0c9fe6 Paolo Bonzini
 * block_job_sleep_ns:
137 2f0c9fe6 Paolo Bonzini
 * @job: The job that calls the function.
138 2f0c9fe6 Paolo Bonzini
 * @clock: The clock to sleep on.
139 2f0c9fe6 Paolo Bonzini
 * @ns: How many nanoseconds to stop for.
140 2f0c9fe6 Paolo Bonzini
 *
141 2f0c9fe6 Paolo Bonzini
 * Put the job to sleep (assuming that it wasn't canceled) for @ns
142 2f0c9fe6 Paolo Bonzini
 * nanoseconds.  Canceling the job will interrupt the wait immediately.
143 2f0c9fe6 Paolo Bonzini
 */
144 2f0c9fe6 Paolo Bonzini
void block_job_sleep_ns(BlockJob *job, QEMUClock *clock, int64_t ns);
145 2f0c9fe6 Paolo Bonzini
146 2f0c9fe6 Paolo Bonzini
/**
147 65f46322 Paolo Bonzini
 * block_job_completed:
148 2f0c9fe6 Paolo Bonzini
 * @job: The job being completed.
149 2f0c9fe6 Paolo Bonzini
 * @ret: The status code.
150 2f0c9fe6 Paolo Bonzini
 *
151 2f0c9fe6 Paolo Bonzini
 * Call the completion function that was registered at creation time, and
152 2f0c9fe6 Paolo Bonzini
 * free @job.
153 2f0c9fe6 Paolo Bonzini
 */
154 65f46322 Paolo Bonzini
void block_job_completed(BlockJob *job, int ret);
155 2f0c9fe6 Paolo Bonzini
156 2f0c9fe6 Paolo Bonzini
/**
157 2f0c9fe6 Paolo Bonzini
 * block_job_set_speed:
158 2f0c9fe6 Paolo Bonzini
 * @job: The job to set the speed for.
159 2f0c9fe6 Paolo Bonzini
 * @speed: The new value
160 2f0c9fe6 Paolo Bonzini
 * @errp: Error object.
161 2f0c9fe6 Paolo Bonzini
 *
162 2f0c9fe6 Paolo Bonzini
 * Set a rate-limiting parameter for the job; the actual meaning may
163 2f0c9fe6 Paolo Bonzini
 * vary depending on the job type.
164 2f0c9fe6 Paolo Bonzini
 */
165 2f0c9fe6 Paolo Bonzini
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
166 2f0c9fe6 Paolo Bonzini
167 2f0c9fe6 Paolo Bonzini
/**
168 2f0c9fe6 Paolo Bonzini
 * block_job_cancel:
169 2f0c9fe6 Paolo Bonzini
 * @job: The job to be canceled.
170 2f0c9fe6 Paolo Bonzini
 *
171 2f0c9fe6 Paolo Bonzini
 * Asynchronously cancel the specified job.
172 2f0c9fe6 Paolo Bonzini
 */
173 2f0c9fe6 Paolo Bonzini
void block_job_cancel(BlockJob *job);
174 2f0c9fe6 Paolo Bonzini
175 2f0c9fe6 Paolo Bonzini
/**
176 aeae883b Paolo Bonzini
 * block_job_complete:
177 aeae883b Paolo Bonzini
 * @job: The job to be completed.
178 aeae883b Paolo Bonzini
 * @errp: Error object.
179 aeae883b Paolo Bonzini
 *
180 aeae883b Paolo Bonzini
 * Asynchronously complete the specified job.
181 aeae883b Paolo Bonzini
 */
182 aeae883b Paolo Bonzini
void block_job_complete(BlockJob *job, Error **errp);
183 aeae883b Paolo Bonzini
184 aeae883b Paolo Bonzini
/**
185 2f0c9fe6 Paolo Bonzini
 * block_job_is_cancelled:
186 2f0c9fe6 Paolo Bonzini
 * @job: The job being queried.
187 2f0c9fe6 Paolo Bonzini
 *
188 2f0c9fe6 Paolo Bonzini
 * Returns whether the job is scheduled for cancellation.
189 2f0c9fe6 Paolo Bonzini
 */
190 2f0c9fe6 Paolo Bonzini
bool block_job_is_cancelled(BlockJob *job);
191 2f0c9fe6 Paolo Bonzini
192 2f0c9fe6 Paolo Bonzini
/**
193 30e628b7 Paolo Bonzini
 * block_job_query:
194 30e628b7 Paolo Bonzini
 * @job: The job to get information about.
195 30e628b7 Paolo Bonzini
 *
196 30e628b7 Paolo Bonzini
 * Return information about a job.
197 30e628b7 Paolo Bonzini
 */
198 30e628b7 Paolo Bonzini
BlockJobInfo *block_job_query(BlockJob *job);
199 30e628b7 Paolo Bonzini
200 30e628b7 Paolo Bonzini
/**
201 8acc72a4 Paolo Bonzini
 * block_job_pause:
202 8acc72a4 Paolo Bonzini
 * @job: The job to be paused.
203 8acc72a4 Paolo Bonzini
 *
204 8acc72a4 Paolo Bonzini
 * Asynchronously pause the specified job.
205 8acc72a4 Paolo Bonzini
 */
206 8acc72a4 Paolo Bonzini
void block_job_pause(BlockJob *job);
207 8acc72a4 Paolo Bonzini
208 8acc72a4 Paolo Bonzini
/**
209 8acc72a4 Paolo Bonzini
 * block_job_resume:
210 8acc72a4 Paolo Bonzini
 * @job: The job to be resumed.
211 8acc72a4 Paolo Bonzini
 *
212 8acc72a4 Paolo Bonzini
 * Resume the specified job.
213 8acc72a4 Paolo Bonzini
 */
214 8acc72a4 Paolo Bonzini
void block_job_resume(BlockJob *job);
215 8acc72a4 Paolo Bonzini
216 8acc72a4 Paolo Bonzini
/**
217 a66a2a36 Paolo Bonzini
 * qobject_from_block_job:
218 a66a2a36 Paolo Bonzini
 * @job: The job whose information is requested.
219 a66a2a36 Paolo Bonzini
 *
220 a66a2a36 Paolo Bonzini
 * Return a QDict corresponding to @job's query-block-jobs entry.
221 a66a2a36 Paolo Bonzini
 */
222 a66a2a36 Paolo Bonzini
QObject *qobject_from_block_job(BlockJob *job);
223 a66a2a36 Paolo Bonzini
224 a66a2a36 Paolo Bonzini
/**
225 a66a2a36 Paolo Bonzini
 * block_job_ready:
226 a66a2a36 Paolo Bonzini
 * @job: The job which is now ready to complete.
227 a66a2a36 Paolo Bonzini
 *
228 a66a2a36 Paolo Bonzini
 * Send a BLOCK_JOB_READY event for the specified job.
229 a66a2a36 Paolo Bonzini
 */
230 a66a2a36 Paolo Bonzini
void block_job_ready(BlockJob *job);
231 a66a2a36 Paolo Bonzini
232 a66a2a36 Paolo Bonzini
/**
233 8acc72a4 Paolo Bonzini
 * block_job_is_paused:
234 8acc72a4 Paolo Bonzini
 * @job: The job being queried.
235 8acc72a4 Paolo Bonzini
 *
236 8acc72a4 Paolo Bonzini
 * Returns whether the job is currently paused, or will pause
237 8acc72a4 Paolo Bonzini
 * as soon as it reaches a sleeping point.
238 8acc72a4 Paolo Bonzini
 */
239 8acc72a4 Paolo Bonzini
bool block_job_is_paused(BlockJob *job);
240 8acc72a4 Paolo Bonzini
241 8acc72a4 Paolo Bonzini
/**
242 2f0c9fe6 Paolo Bonzini
 * block_job_cancel_sync:
243 2f0c9fe6 Paolo Bonzini
 * @job: The job to be canceled.
244 2f0c9fe6 Paolo Bonzini
 *
245 2f0c9fe6 Paolo Bonzini
 * Synchronously cancel the job.  The completion callback is called
246 2f0c9fe6 Paolo Bonzini
 * before the function returns.  The job may actually complete
247 2f0c9fe6 Paolo Bonzini
 * instead of canceling itself; the circumstances under which this
248 2f0c9fe6 Paolo Bonzini
 * happens depend on the kind of job that is active.
249 2f0c9fe6 Paolo Bonzini
 *
250 2f0c9fe6 Paolo Bonzini
 * Returns the return value from the job if the job actually completed
251 2f0c9fe6 Paolo Bonzini
 * during the call, or -ECANCELED if it was canceled.
252 2f0c9fe6 Paolo Bonzini
 */
253 2f0c9fe6 Paolo Bonzini
int block_job_cancel_sync(BlockJob *job);
254 2f0c9fe6 Paolo Bonzini
255 32c81a4a Paolo Bonzini
/**
256 32c81a4a Paolo Bonzini
 * block_job_iostatus_reset:
257 32c81a4a Paolo Bonzini
 * @job: The job whose I/O status should be reset.
258 32c81a4a Paolo Bonzini
 *
259 3bd293c3 Paolo Bonzini
 * Reset I/O status on @job and on BlockDriverState objects it uses,
260 3bd293c3 Paolo Bonzini
 * other than job->bs.
261 32c81a4a Paolo Bonzini
 */
262 32c81a4a Paolo Bonzini
void block_job_iostatus_reset(BlockJob *job);
263 32c81a4a Paolo Bonzini
264 32c81a4a Paolo Bonzini
/**
265 32c81a4a Paolo Bonzini
 * block_job_error_action:
266 32c81a4a Paolo Bonzini
 * @job: The job to signal an error for.
267 32c81a4a Paolo Bonzini
 * @bs: The block device on which to set an I/O error.
268 32c81a4a Paolo Bonzini
 * @on_err: The error action setting.
269 32c81a4a Paolo Bonzini
 * @is_read: Whether the operation was a read.
270 32c81a4a Paolo Bonzini
 * @error: The error that was reported.
271 32c81a4a Paolo Bonzini
 *
272 32c81a4a Paolo Bonzini
 * Report an I/O error for a block job and possibly stop the VM.  Return the
273 32c81a4a Paolo Bonzini
 * action that was selected based on @on_err and @error.
274 32c81a4a Paolo Bonzini
 */
275 32c81a4a Paolo Bonzini
BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs,
276 32c81a4a Paolo Bonzini
                                        BlockdevOnError on_err,
277 32c81a4a Paolo Bonzini
                                        int is_read, int error);
278 2f0c9fe6 Paolo Bonzini
#endif