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 |