1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef BLOCK_IO_H
25#define BLOCK_IO_H
26
27#include "block-common.h"
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42int bdrv_pwrite_zeroes(BdrvChild *child, int64_t offset,
43 int64_t bytes, BdrvRequestFlags flags);
44int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags);
45int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int64_t bytes);
46int bdrv_pwrite(BdrvChild *child, int64_t offset, const void *buf,
47 int64_t bytes);
48int bdrv_pwrite_sync(BdrvChild *child, int64_t offset,
49 const void *buf, int64_t bytes);
50
51
52
53
54
55
56int coroutine_fn bdrv_co_pwrite_zeroes(BdrvChild *child, int64_t offset,
57 int64_t bytes, BdrvRequestFlags flags);
58
59int coroutine_fn bdrv_co_truncate(BdrvChild *child, int64_t offset, bool exact,
60 PreallocMode prealloc, BdrvRequestFlags flags,
61 Error **errp);
62
63int64_t bdrv_nb_sectors(BlockDriverState *bs);
64int64_t bdrv_getlength(BlockDriverState *bs);
65int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
66BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
67 BlockDriverState *in_bs, Error **errp);
68void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
69int coroutine_fn bdrv_co_delete_file(BlockDriverState *bs, Error **errp);
70void coroutine_fn bdrv_co_delete_file_noerr(BlockDriverState *bs);
71
72
73
74void bdrv_aio_cancel(BlockAIOCB *acb);
75void bdrv_aio_cancel_async(BlockAIOCB *acb);
76
77
78int bdrv_co_ioctl(BlockDriverState *bs, int req, void *buf);
79
80
81int coroutine_fn bdrv_co_flush(BlockDriverState *bs);
82
83int bdrv_co_pdiscard(BdrvChild *child, int64_t offset, int64_t bytes);
84bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs);
85int bdrv_block_status(BlockDriverState *bs, int64_t offset,
86 int64_t bytes, int64_t *pnum, int64_t *map,
87 BlockDriverState **file);
88int bdrv_block_status_above(BlockDriverState *bs, BlockDriverState *base,
89 int64_t offset, int64_t bytes, int64_t *pnum,
90 int64_t *map, BlockDriverState **file);
91int bdrv_is_allocated(BlockDriverState *bs, int64_t offset, int64_t bytes,
92 int64_t *pnum);
93int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
94 bool include_base, int64_t offset, int64_t bytes,
95 int64_t *pnum);
96int coroutine_fn bdrv_co_is_zero_fast(BlockDriverState *bs, int64_t offset,
97 int64_t bytes);
98
99int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
100 bool ignore_allow_rdw, Error **errp);
101int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
102 Error **errp);
103bool bdrv_is_read_only(BlockDriverState *bs);
104bool bdrv_is_writable(BlockDriverState *bs);
105bool bdrv_is_sg(BlockDriverState *bs);
106bool bdrv_is_inserted(BlockDriverState *bs);
107void bdrv_lock_medium(BlockDriverState *bs, bool locked);
108void bdrv_eject(BlockDriverState *bs, bool eject_flag);
109const char *bdrv_get_format_name(BlockDriverState *bs);
110
111bool bdrv_supports_compressed_writes(BlockDriverState *bs);
112const char *bdrv_get_node_name(const BlockDriverState *bs);
113const char *bdrv_get_device_name(const BlockDriverState *bs);
114const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
115int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
116ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs,
117 Error **errp);
118BlockStatsSpecific *bdrv_get_specific_stats(BlockDriverState *bs);
119void bdrv_round_to_clusters(BlockDriverState *bs,
120 int64_t offset, int64_t bytes,
121 int64_t *cluster_offset,
122 int64_t *cluster_bytes);
123
124void bdrv_get_backing_filename(BlockDriverState *bs,
125 char *filename, int filename_size);
126
127int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
128 int64_t pos, int size);
129
130int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
131 int64_t pos, int size);
132
133
134
135
136
137size_t bdrv_min_mem_align(BlockDriverState *bs);
138
139size_t bdrv_opt_mem_align(BlockDriverState *bs);
140void *qemu_blockalign(BlockDriverState *bs, size_t size);
141void *qemu_blockalign0(BlockDriverState *bs, size_t size);
142void *qemu_try_blockalign(BlockDriverState *bs, size_t size);
143void *qemu_try_blockalign0(BlockDriverState *bs, size_t size);
144bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov);
145
146void bdrv_enable_copy_on_read(BlockDriverState *bs);
147void bdrv_disable_copy_on_read(BlockDriverState *bs);
148
149void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event);
150
151#define BLKDBG_EVENT(child, evt) \
152 do { \
153 if (child) { \
154 bdrv_debug_event(child->bs, evt); \
155 } \
156 } while (0)
157
158
159
160
161
162
163AioContext *bdrv_get_aio_context(BlockDriverState *bs);
164
165
166
167
168
169
170
171
172
173
174AioContext *coroutine_fn bdrv_co_enter(BlockDriverState *bs);
175
176
177
178
179
180void coroutine_fn bdrv_co_leave(BlockDriverState *bs, AioContext *old_ctx);
181
182
183
184
185void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co);
186
187AioContext *child_of_bds_get_parent_aio_context(BdrvChild *c);
188
189void bdrv_io_plug(BlockDriverState *bs);
190void bdrv_io_unplug(BlockDriverState *bs);
191
192bool bdrv_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
193 uint32_t granularity, Error **errp);
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224int coroutine_fn bdrv_co_copy_range(BdrvChild *src, int64_t src_offset,
225 BdrvChild *dst, int64_t dst_offset,
226 int64_t bytes, BdrvRequestFlags read_flags,
227 BdrvRequestFlags write_flags);
228
229
230
231
232
233
234
235
236
237
238
239
240
241void bdrv_drained_end_no_poll(BlockDriverState *bs, int *drained_end_counter);
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265#define BDRV_POLL_WHILE(bs, cond) ({ \
266 BlockDriverState *bs_ = (bs); \
267 IO_OR_GS_CODE(); \
268 AIO_WAIT_WHILE(bdrv_get_aio_context(bs_), \
269 cond); })
270
271void bdrv_drain(BlockDriverState *bs);
272void coroutine_fn bdrv_co_drain(BlockDriverState *bs);
273
274int generated_co_wrapper
275bdrv_truncate(BdrvChild *child, int64_t offset, bool exact,
276 PreallocMode prealloc, BdrvRequestFlags flags, Error **errp);
277
278int generated_co_wrapper bdrv_check(BlockDriverState *bs, BdrvCheckResult *res,
279 BdrvCheckMode fix);
280
281
282int generated_co_wrapper bdrv_invalidate_cache(BlockDriverState *bs,
283 Error **errp);
284int generated_co_wrapper bdrv_flush(BlockDriverState *bs);
285int generated_co_wrapper bdrv_pdiscard(BdrvChild *child, int64_t offset,
286 int64_t bytes);
287int generated_co_wrapper
288bdrv_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
289int generated_co_wrapper
290bdrv_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
291
292
293
294
295
296
297
298void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll);
299
300
301
302
303
304
305
306
307
308void bdrv_parent_drained_end_single(BdrvChild *c);
309
310
311
312
313
314
315
316
317
318
319
320
321
322bool bdrv_drain_poll(BlockDriverState *bs, bool recursive,
323 BdrvChild *ignore_parent, bool ignore_bds_parents);
324
325
326
327
328
329
330
331
332
333void bdrv_drained_begin(BlockDriverState *bs);
334
335
336
337
338
339
340
341void bdrv_do_drained_begin_quiesce(BlockDriverState *bs,
342 BdrvChild *parent, bool ignore_bds_parents);
343
344
345
346
347
348void bdrv_subtree_drained_begin(BlockDriverState *bs);
349
350
351
352
353
354
355
356
357
358
359
360
361void bdrv_drained_end(BlockDriverState *bs);
362
363
364
365
366void bdrv_subtree_drained_end(BlockDriverState *bs);
367
368#endif
369