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