block.h 26.0 KB
Newer Older
P
pbrook 已提交
1 2 3
#ifndef BLOCK_H
#define BLOCK_H

4
#include "block/aio.h"
5
#include "qapi-types.h"
6
#include "qemu/iov.h"
7
#include "qemu/coroutine.h"
8
#include "block/accounting.h"
9
#include "block/dirty-bitmap.h"
10
#include "block/blockjob.h"
F
Fam Zheng 已提交
11
#include "qemu/hbitmap.h"
12

P
pbrook 已提交
13 14
/* block.c */
typedef struct BlockDriver BlockDriver;
K
Kevin Wolf 已提交
15
typedef struct BdrvChild BdrvChild;
16
typedef struct BdrvChildRole BdrvChildRole;
P
pbrook 已提交
17 18 19 20 21 22

typedef struct BlockDriverInfo {
    /* in bytes, 0 if irrelevant */
    int cluster_size;
    /* offset at which the VM state can be saved (0 if not possible) */
    int64_t vm_state_offset;
D
Dong Xu Wang 已提交
23
    bool is_dirty;
24 25
    /*
     * True if unallocated blocks read back as zeroes. This is equivalent
26
     * to the LBPRZ flag in the SCSI logical block provisioning page.
27 28
     */
    bool unallocated_blocks_are_zero;
29 30 31 32
    /*
     * True if this block driver only supports compressed writes
     */
    bool needs_compressed_writes;
P
pbrook 已提交
33 34
} BlockDriverInfo;

35 36 37 38
typedef struct BlockFragInfo {
    uint64_t allocated_clusters;
    uint64_t total_clusters;
    uint64_t fragmented_clusters;
39
    uint64_t compressed_clusters;
40 41
} BlockFragInfo;

P
Peter Lieven 已提交
42
typedef enum {
43 44
    BDRV_REQ_COPY_ON_READ       = 0x1,
    BDRV_REQ_ZERO_WRITE         = 0x2,
45 46 47 48 49 50
    /* The BDRV_REQ_MAY_UNMAP flag is used to indicate that the block driver
     * is allowed to optimize a write zeroes request by unmapping (discarding)
     * blocks if it is guaranteed that the result will read back as
     * zeroes. The flag is only passed to the driver if the block device is
     * opened with BDRV_O_UNMAP.
     */
51
    BDRV_REQ_MAY_UNMAP          = 0x4,
52
    BDRV_REQ_NO_SERIALISING     = 0x8,
53
    BDRV_REQ_FUA                = 0x10,
54
    BDRV_REQ_WRITE_COMPRESSED   = 0x20,
55 56

    /* Mask of valid flags */
57
    BDRV_REQ_MASK               = 0x3f,
P
Peter Lieven 已提交
58 59
} BdrvRequestFlags;

60 61 62 63 64 65 66 67 68 69 70
typedef struct BlockSizes {
    uint32_t phys;
    uint32_t log;
} BlockSizes;

typedef struct HDGeometry {
    uint32_t heads;
    uint32_t sectors;
    uint32_t cylinders;
} HDGeometry;

P
pbrook 已提交
71
#define BDRV_O_RDWR        0x0002
72
#define BDRV_O_RESIZE      0x0004 /* request permission for resizing the node */
P
pbrook 已提交
73
#define BDRV_O_SNAPSHOT    0x0008 /* open the file read only and save writes in a snapshot */
74
#define BDRV_O_TEMPORARY   0x0010 /* delete the file after use */
75
#define BDRV_O_NOCACHE     0x0020 /* do not use the host page cache */
76
#define BDRV_O_NATIVE_AIO  0x0080 /* use native AIO instead of the thread pool */
K
Kevin Wolf 已提交
77
#define BDRV_O_NO_BACKING  0x0100 /* don't open the backing file */
78
#define BDRV_O_NO_FLUSH    0x0200 /* disable flushing on this disk */
79
#define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */
80
#define BDRV_O_INACTIVE    0x0800  /* consistency hint for migration handoff */
81
#define BDRV_O_CHECK       0x1000  /* open solely for consistency check */
82
#define BDRV_O_ALLOW_RDWR  0x2000  /* allow reopen to change from r/o to r/w */
P
Paolo Bonzini 已提交
83
#define BDRV_O_UNMAP       0x4000  /* execute guest UNMAP/TRIM operations */
M
Max Reitz 已提交
84 85 86
#define BDRV_O_PROTOCOL    0x8000  /* if no block driver is explicitly given:
                                      select an appropriate protocol driver,
                                      ignoring the format layer */
87
#define BDRV_O_NO_IO       0x10000 /* don't initialize for I/O */
88

K
Kevin Wolf 已提交
89
#define BDRV_O_CACHE_MASK  (BDRV_O_NOCACHE | BDRV_O_NO_FLUSH)
P
pbrook 已提交
90

91 92 93 94 95 96

/* Option names of options parsed by the block layer */

#define BDRV_OPT_CACHE_WB       "cache.writeback"
#define BDRV_OPT_CACHE_DIRECT   "cache.direct"
#define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
97
#define BDRV_OPT_READ_ONLY      "read-only"
98
#define BDRV_OPT_DISCARD        "discard"
99
#define BDRV_OPT_FORCE_SHARE    "force-share"
100 101


J
Jan Kiszka 已提交
102
#define BDRV_SECTOR_BITS   9
103
#define BDRV_SECTOR_SIZE   (1ULL << BDRV_SECTOR_BITS)
104
#define BDRV_SECTOR_MASK   ~(BDRV_SECTOR_SIZE - 1)
J
Jan Kiszka 已提交
105

106 107
#define BDRV_REQUEST_MAX_SECTORS MIN(SIZE_MAX >> BDRV_SECTOR_BITS, \
                                     INT_MAX >> BDRV_SECTOR_BITS)
108
#define BDRV_REQUEST_MAX_BYTES (BDRV_REQUEST_MAX_SECTORS << BDRV_SECTOR_BITS)
109

110
/*
111
 * Allocation status flags for bdrv_block_status() and friends.
112 113 114 115 116
 *
 * Public flags:
 * BDRV_BLOCK_DATA: allocation for data at offset is tied to this layer
 * BDRV_BLOCK_ZERO: offset reads as zero
 * BDRV_BLOCK_OFFSET_VALID: an associated offset exists for accessing raw data
117
 * BDRV_BLOCK_ALLOCATED: the content of the block is determined by this
118 119 120
 *                       layer rather than any backing, set by block layer
 * BDRV_BLOCK_EOF: the returned pnum covers through end of file for this
 *                 layer, set by block layer
121
 *
122
 * Internal flag:
123 124 125
 * BDRV_BLOCK_RAW: for use by passthrough drivers, such as raw, to request
 *                 that the block layer recompute the answer from the returned
 *                 BDS; must be accompanied by just BDRV_BLOCK_OFFSET_VALID.
126
 *
127 128 129 130
 * If BDRV_BLOCK_OFFSET_VALID is set, the map parameter represents the
 * host offset within the returned BDS that is allocated for the
 * corresponding raw guest data.  However, whether that offset
 * actually contains data also depends on BDRV_BLOCK_DATA, as follows:
131 132
 *
 * DATA ZERO OFFSET_VALID
133 134 135
 *  t    t        t       sectors read as zero, returned file is zero at offset
 *  t    f        t       sectors read as valid from file at offset
 *  f    t        t       sectors preallocated, read as zero, returned file not
136 137
 *                        necessarily zero at offset
 *  f    f        t       sectors preallocated but read from backing_hd,
138
 *                        returned file contains garbage at offset
139 140 141 142 143
 *  t    t        f       sectors preallocated, read as zero, unknown offset
 *  t    f        f       sectors read from unknown file or offset
 *  f    t        f       not allocated or unknown offset, read as zero
 *  f    f        f       not allocated or unknown offset, read from backing_hd
 */
144 145 146 147 148
#define BDRV_BLOCK_DATA         0x01
#define BDRV_BLOCK_ZERO         0x02
#define BDRV_BLOCK_OFFSET_VALID 0x04
#define BDRV_BLOCK_RAW          0x08
#define BDRV_BLOCK_ALLOCATED    0x10
149
#define BDRV_BLOCK_EOF          0x20
150 151
#define BDRV_BLOCK_OFFSET_MASK  BDRV_SECTOR_MASK

152 153 154 155 156
typedef QSIMPLEQ_HEAD(BlockReopenQueue, BlockReopenQueueEntry) BlockReopenQueue;

typedef struct BDRVReopenState {
    BlockDriverState *bs;
    int flags;
157
    uint64_t perm, shared_perm;
158
    QDict *options;
K
Kevin Wolf 已提交
159
    QDict *explicit_options;
160 161 162
    void *opaque;
} BDRVReopenState;

F
Fam Zheng 已提交
163 164 165 166 167 168 169
/*
 * Block operation types
 */
typedef enum BlockOpType {
    BLOCK_OP_TYPE_BACKUP_SOURCE,
    BLOCK_OP_TYPE_BACKUP_TARGET,
    BLOCK_OP_TYPE_CHANGE,
170 171
    BLOCK_OP_TYPE_COMMIT_SOURCE,
    BLOCK_OP_TYPE_COMMIT_TARGET,
F
Fam Zheng 已提交
172 173 174 175 176 177
    BLOCK_OP_TYPE_DATAPLANE,
    BLOCK_OP_TYPE_DRIVE_DEL,
    BLOCK_OP_TYPE_EJECT,
    BLOCK_OP_TYPE_EXTERNAL_SNAPSHOT,
    BLOCK_OP_TYPE_INTERNAL_SNAPSHOT,
    BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
178
    BLOCK_OP_TYPE_MIRROR_SOURCE,
F
Fam Zheng 已提交
179
    BLOCK_OP_TYPE_MIRROR_TARGET,
F
Fam Zheng 已提交
180 181
    BLOCK_OP_TYPE_RESIZE,
    BLOCK_OP_TYPE_STREAM,
182
    BLOCK_OP_TYPE_REPLACE,
F
Fam Zheng 已提交
183 184
    BLOCK_OP_TYPE_MAX,
} BlockOpType;
185

186 187 188 189 190 191 192 193 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
/* Block node permission constants */
enum {
    /**
     * A user that has the "permission" of consistent reads is guaranteed that
     * their view of the contents of the block device is complete and
     * self-consistent, representing the contents of a disk at a specific
     * point.
     *
     * For most block devices (including their backing files) this is true, but
     * the property cannot be maintained in a few situations like for
     * intermediate nodes of a commit block job.
     */
    BLK_PERM_CONSISTENT_READ    = 0x01,

    /** This permission is required to change the visible disk contents. */
    BLK_PERM_WRITE              = 0x02,

    /**
     * This permission (which is weaker than BLK_PERM_WRITE) is both enough and
     * required for writes to the block node when the caller promises that
     * the visible disk content doesn't change.
     */
    BLK_PERM_WRITE_UNCHANGED    = 0x04,

    /** This permission is required to change the size of a block node. */
    BLK_PERM_RESIZE             = 0x08,

    /**
     * This permission is required to change the node that this BdrvChild
     * points to.
     */
    BLK_PERM_GRAPH_MOD          = 0x10,

    BLK_PERM_ALL                = 0x1f,
};

F
Fam Zheng 已提交
222 223
char *bdrv_perm_names(uint64_t perm);

224
/* disk I/O throttling */
P
pbrook 已提交
225
void bdrv_init(void);
226
void bdrv_init_with_whitelist(void);
227
bool bdrv_uses_whitelist(void);
228
BlockDriver *bdrv_find_protocol(const char *filename,
229 230
                                bool allow_protocol_prefix,
                                Error **errp);
P
pbrook 已提交
231
BlockDriver *bdrv_find_format(const char *format_name);
232
int bdrv_create(BlockDriver *drv, const char* filename,
C
Chunyan Liu 已提交
233 234
                QemuOpts *opts, Error **errp);
int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
235
BlockDriverState *bdrv_new(void);
236 237
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
                 Error **errp);
238 239
void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
                       Error **errp);
240

K
Kevin Wolf 已提交
241
int bdrv_parse_cache_mode(const char *mode, int *flags, bool *writethrough);
P
Paolo Bonzini 已提交
242
int bdrv_parse_discard_flags(const char *mode, int *flags);
K
Kevin Wolf 已提交
243 244 245 246 247
BdrvChild *bdrv_open_child(const char *filename,
                           QDict *options, const char *bdref_key,
                           BlockDriverState* parent,
                           const BdrvChildRole *child_role,
                           bool allow_none, Error **errp);
248 249
void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
                         Error **errp);
250 251
int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
                           const char *bdref_key, Error **errp);
M
Max Reitz 已提交
252 253
BlockDriverState *bdrv_open(const char *filename, const char *reference,
                            QDict *options, int flags, Error **errp);
K
Kevin Wolf 已提交
254 255
BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
                                       int flags, Error **errp);
256
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
257 258
                                    BlockDriverState *bs,
                                    QDict *options, int flags);
259
int bdrv_reopen_multiple(AioContext *ctx, BlockReopenQueue *bs_queue, Error **errp);
260 261 262 263 264
int bdrv_reopen(BlockDriverState *bs, int bdrv_flags, Error **errp);
int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
                        BlockReopenQueue *queue, Error **errp);
void bdrv_reopen_commit(BDRVReopenState *reopen_state);
void bdrv_reopen_abort(BDRVReopenState *reopen_state);
265
int bdrv_read(BdrvChild *child, int64_t sector_num,
P
pbrook 已提交
266
              uint8_t *buf, int nb_sectors);
267
int bdrv_write(BdrvChild *child, int64_t sector_num,
P
pbrook 已提交
268
               const uint8_t *buf, int nb_sectors);
269
int bdrv_pwrite_zeroes(BdrvChild *child, int64_t offset,
270
                       int bytes, BdrvRequestFlags flags);
271
int bdrv_make_zero(BdrvChild *child, BdrvRequestFlags flags);
272 273
int bdrv_pread(BdrvChild *child, int64_t offset, void *buf, int bytes);
int bdrv_preadv(BdrvChild *child, int64_t offset, QEMUIOVector *qiov);
274 275 276 277
int bdrv_pwrite(BdrvChild *child, int64_t offset, const void *buf, int bytes);
int bdrv_pwritev(BdrvChild *child, int64_t offset, QEMUIOVector *qiov);
int bdrv_pwrite_sync(BdrvChild *child, int64_t offset,
                     const void *buf, int count);
278 279
int coroutine_fn bdrv_co_readv(BdrvChild *child, int64_t sector_num,
                               int nb_sectors, QEMUIOVector *qiov);
280 281
int coroutine_fn bdrv_co_writev(BdrvChild *child, int64_t sector_num,
                               int nb_sectors, QEMUIOVector *qiov);
282 283 284 285 286 287
/*
 * Efficiently zero a region of the disk image.  Note that this is a regular
 * I/O request like read or write and should have a reasonable size.  This
 * function is not suitable for zeroing the entire image in a single request
 * because it may allocate memory for the entire region.
 */
288
int coroutine_fn bdrv_co_pwrite_zeroes(BdrvChild *child, int64_t offset,
289
                                       int bytes, BdrvRequestFlags flags);
290 291
BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
    const char *backing_file);
M
Max Reitz 已提交
292
void bdrv_refresh_filename(BlockDriverState *bs);
293 294
int bdrv_truncate(BdrvChild *child, int64_t offset, PreallocMode prealloc,
                  Error **errp);
M
Markus Armbruster 已提交
295
int64_t bdrv_nb_sectors(BlockDriverState *bs);
P
pbrook 已提交
296
int64_t bdrv_getlength(BlockDriverState *bs);
297
int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
S
Stefan Hajnoczi 已提交
298 299
BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
                               BlockDriverState *in_bs, Error **errp);
300
void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
301
void bdrv_refresh_limits(BlockDriverState *bs, Error **errp);
P
pbrook 已提交
302
int bdrv_commit(BlockDriverState *bs);
K
Kevin Wolf 已提交
303 304
int bdrv_change_backing_file(BlockDriverState *bs,
    const char *backing_file, const char *backing_fmt);
305
void bdrv_register(BlockDriver *bdrv);
K
Kevin Wolf 已提交
306
int bdrv_drop_intermediate(BlockDriverState *top, BlockDriverState *base,
307
                           const char *backing_file_str);
308 309
BlockDriverState *bdrv_find_overlay(BlockDriverState *active,
                                    BlockDriverState *bs);
310
BlockDriverState *bdrv_find_base(BlockDriverState *bs);
311

312 313 314 315 316

typedef struct BdrvCheckResult {
    int corruptions;
    int leaks;
    int check_errors;
317 318
    int corruptions_fixed;
    int leaks_fixed;
319
    int64_t image_end_offset;
320
    BlockFragInfo bfi;
321 322
} BdrvCheckResult;

323 324 325 326 327 328
typedef enum {
    BDRV_FIX_LEAKS    = 1,
    BDRV_FIX_ERRORS   = 2,
} BdrvCheckMode;

int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
329

330 331 332 333
/* The units of offset and total_work_size may be chosen arbitrarily by the
 * block driver; total_work_size may change during the course of the amendment
 * operation */
typedef void BlockDriverAmendStatusCB(BlockDriverState *bs, int64_t offset,
334
                                      int64_t total_work_size, void *opaque);
335
int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts *opts,
336
                       BlockDriverAmendStatusCB *status_cb, void *cb_opaque);
M
Max Reitz 已提交
337

338
/* external snapshots */
339 340 341
bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
                                      BlockDriverState *candidate);
bool bdrv_is_first_non_filter(BlockDriverState *candidate);
342

343
/* check if a named node can be replaced when doing drive-mirror */
344 345
BlockDriverState *check_to_replace_node(BlockDriverState *parent_bs,
                                        const char *node_name, Error **errp);
346

P
pbrook 已提交
347
/* async block I/O */
348 349
void bdrv_aio_cancel(BlockAIOCB *acb);
void bdrv_aio_cancel_async(BlockAIOCB *acb);
P
pbrook 已提交
350

351
/* sg packet commands */
352
int bdrv_co_ioctl(BlockDriverState *bs, int req, void *buf);
353

354
/* Invalidate any cached metadata used by image formats */
355 356
void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp);
void bdrv_invalidate_cache_all(Error **errp);
357
int bdrv_inactivate_all(void);
358

P
pbrook 已提交
359
/* Ensure contents are flushed to disk.  */
360
int bdrv_flush(BlockDriverState *bs);
P
Paolo Bonzini 已提交
361
int coroutine_fn bdrv_co_flush(BlockDriverState *bs);
J
John Snow 已提交
362
int bdrv_flush_all(void);
363
void bdrv_close_all(void);
S
Stefan Hajnoczi 已提交
364
void bdrv_drain(BlockDriverState *bs);
F
Fam Zheng 已提交
365
void coroutine_fn bdrv_co_drain(BlockDriverState *bs);
366 367
void bdrv_drain_all_begin(void);
void bdrv_drain_all_end(void);
368
void bdrv_drain_all(void);
A
aliguori 已提交
369

P
Paolo Bonzini 已提交
370 371
#define BDRV_POLL_WHILE(bs, cond) ({                       \
    bool waited_ = false;                                  \
372
    bool busy_ = true;                                     \
P
Paolo Bonzini 已提交
373
    BlockDriverState *bs_ = (bs);                          \
374
    AioContext *ctx_ = bdrv_get_aio_context(bs_);          \
375
    if (in_aio_context_home_thread(ctx_)) {                \
376 377 378
        while ((cond) || busy_) {                          \
            busy_ = aio_poll(ctx_, (cond));                \
            waited_ |= !!(cond) | busy_;                   \
379 380 381 382 383 384 385 386 387 388
        }                                                  \
    } else {                                               \
        assert(qemu_get_current_aio_context() ==           \
               qemu_get_aio_context());                    \
        /* Ask bdrv_dec_in_flight to wake up the main      \
         * QEMU AioContext.  Extra I/O threads never take  \
         * other I/O threads' AioContexts (see for example \
         * block_job_defer_to_main_loop for how to do it). \
         */                                                \
        assert(!bs_->wakeup);                              \
389 390
        /* Set bs->wakeup before evaluating cond.  */      \
        atomic_mb_set(&bs_->wakeup, true);                 \
391 392 393 394 395 396 397 398 399 400
        while (busy_) {                                    \
            if ((cond)) {                                  \
                waited_ = busy_ = true;                    \
                aio_context_release(ctx_);                 \
                aio_poll(qemu_get_aio_context(), true);    \
                aio_context_acquire(ctx_);                 \
            } else {                                       \
                busy_ = aio_poll(ctx_, false);             \
                waited_ |= busy_;                          \
            }                                              \
401
        }                                                  \
402
        atomic_set(&bs_->wakeup, false);                   \
P
Paolo Bonzini 已提交
403 404 405
    }                                                      \
    waited_; })

406 407
int bdrv_pdiscard(BlockDriverState *bs, int64_t offset, int bytes);
int bdrv_co_pdiscard(BlockDriverState *bs, int64_t offset, int bytes);
408
int bdrv_has_zero_init_1(BlockDriverState *bs);
K
Kevin Wolf 已提交
409
int bdrv_has_zero_init(BlockDriverState *bs);
410 411
bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs);
bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs);
412 413 414
int bdrv_block_status(BlockDriverState *bs, int64_t offset,
                      int64_t bytes, int64_t *pnum, int64_t *map,
                      BlockDriverState **file);
415 416 417
int bdrv_block_status_above(BlockDriverState *bs, BlockDriverState *base,
                            int64_t offset, int64_t bytes, int64_t *pnum,
                            int64_t *map, BlockDriverState **file);
418 419
int bdrv_is_allocated(BlockDriverState *bs, int64_t offset, int64_t bytes,
                      int64_t *pnum);
420
int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
421
                            int64_t offset, int64_t bytes, int64_t *pnum);
P
pbrook 已提交
422

423
bool bdrv_is_read_only(BlockDriverState *bs);
424 425
int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
                           bool ignore_allow_rdw, Error **errp);
426
int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
427
bool bdrv_is_sg(BlockDriverState *bs);
428
bool bdrv_is_inserted(BlockDriverState *bs);
429
void bdrv_lock_medium(BlockDriverState *bs, bool locked);
430
void bdrv_eject(BlockDriverState *bs, bool eject_flag);
431
const char *bdrv_get_format_name(BlockDriverState *bs);
432
BlockDriverState *bdrv_find_node(const char *node_name);
433
BlockDeviceInfoList *bdrv_named_nodes_list(Error **errp);
434 435 436
BlockDriverState *bdrv_lookup_bs(const char *device,
                                 const char *node_name,
                                 Error **errp);
437
bool bdrv_chain_contains(BlockDriverState *top, BlockDriverState *base);
F
Fam Zheng 已提交
438
BlockDriverState *bdrv_next_node(BlockDriverState *bs);
K
Kevin Wolf 已提交
439 440 441 442 443 444 445 446 447 448 449 450

typedef struct BdrvNextIterator {
    enum {
        BDRV_NEXT_BACKEND_ROOTS,
        BDRV_NEXT_MONITOR_OWNED,
    } phase;
    BlockBackend *blk;
    BlockDriverState *bs;
} BdrvNextIterator;

BlockDriverState *bdrv_first(BdrvNextIterator *it);
BlockDriverState *bdrv_next(BdrvNextIterator *it);
451
void bdrv_next_cleanup(BdrvNextIterator *it);
K
Kevin Wolf 已提交
452

M
Max Reitz 已提交
453
BlockDriverState *bdrv_next_monitor_owned(BlockDriverState *bs);
454
bool bdrv_is_encrypted(BlockDriverState *bs);
P
pbrook 已提交
455 456
void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
                         void *opaque);
F
Fam Zheng 已提交
457
const char *bdrv_get_node_name(const BlockDriverState *bs);
458
const char *bdrv_get_device_name(const BlockDriverState *bs);
459
const char *bdrv_get_device_or_node_name(const BlockDriverState *bs);
M
Markus Armbruster 已提交
460
int bdrv_get_flags(BlockDriverState *bs);
P
pbrook 已提交
461
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
M
Max Reitz 已提交
462
ImageInfoSpecific *bdrv_get_specific_info(BlockDriverState *bs);
463
void bdrv_round_to_clusters(BlockDriverState *bs,
464
                            int64_t offset, int64_t bytes,
465
                            int64_t *cluster_offset,
466
                            int64_t *cluster_bytes);
P
pbrook 已提交
467

468
const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
P
pbrook 已提交
469 470
void bdrv_get_backing_filename(BlockDriverState *bs,
                               char *filename, int filename_size);
471
void bdrv_get_full_backing_filename(BlockDriverState *bs,
472
                                    char *dest, size_t sz, Error **errp);
473 474
void bdrv_get_full_backing_filename_from_filename(const char *backed,
                                                  const char *backing,
475 476
                                                  char *dest, size_t sz,
                                                  Error **errp);
P
pbrook 已提交
477

478
int path_has_protocol(const char *path);
P
pbrook 已提交
479 480 481 482 483
int path_is_absolute(const char *path);
void path_combine(char *dest, int dest_size,
                  const char *base_path,
                  const char *filename);

484
int bdrv_readv_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
485
int bdrv_writev_vmstate(BlockDriverState *bs, QEMUIOVector *qiov, int64_t pos);
486 487
int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
                      int64_t pos, int size);
488

489 490
int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
                      int64_t pos, int size);
491

492 493
void bdrv_img_create(const char *filename, const char *fmt,
                     const char *base_filename, const char *base_fmt,
494
                     char *options, uint64_t img_size, int flags,
495
                     bool quiet, Error **errp);
J
Jes Sorensen 已提交
496

497 498
/* Returns the alignment in bytes that is required so that no bounce buffer
 * is required throughout the stack */
499 500
size_t bdrv_min_mem_align(BlockDriverState *bs);
/* Returns optimal alignment in bytes for bounce buffer */
501
size_t bdrv_opt_mem_align(BlockDriverState *bs);
502
void *qemu_blockalign(BlockDriverState *bs, size_t size);
M
Max Reitz 已提交
503
void *qemu_blockalign0(BlockDriverState *bs, size_t size);
504
void *qemu_try_blockalign(BlockDriverState *bs, size_t size);
M
Max Reitz 已提交
505
void *qemu_try_blockalign0(BlockDriverState *bs, size_t size);
506
bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov);
507

508 509 510
void bdrv_enable_copy_on_read(BlockDriverState *bs);
void bdrv_disable_copy_on_read(BlockDriverState *bs);

511 512
void bdrv_ref(BlockDriverState *bs);
void bdrv_unref(BlockDriverState *bs);
K
Kevin Wolf 已提交
513
void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child);
514 515 516
BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
                             BlockDriverState *child_bs,
                             const char *child_name,
517 518
                             const BdrvChildRole *child_role,
                             Error **errp);
K
Kevin Wolf 已提交
519

520 521 522 523 524 525 526
bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp);
void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason);
void bdrv_op_unblock(BlockDriverState *bs, BlockOpType op, Error *reason);
void bdrv_op_block_all(BlockDriverState *bs, Error *reason);
void bdrv_op_unblock_all(BlockDriverState *bs, Error *reason);
bool bdrv_op_blocker_is_empty(BlockDriverState *bs);

K
Kevin Wolf 已提交
527 528 529 530 531 532 533
#define BLKDBG_EVENT(child, evt) \
    do { \
        if (child) { \
            bdrv_debug_event(child->bs, evt); \
        } \
    } while (0)

534
void bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event);
K
Kevin Wolf 已提交
535

K
Kevin Wolf 已提交
536 537
int bdrv_debug_breakpoint(BlockDriverState *bs, const char *event,
                           const char *tag);
F
Fam Zheng 已提交
538
int bdrv_debug_remove_breakpoint(BlockDriverState *bs, const char *tag);
K
Kevin Wolf 已提交
539 540 541
int bdrv_debug_resume(BlockDriverState *bs, const char *tag);
bool bdrv_debug_is_suspended(BlockDriverState *bs, const char *tag);

542 543 544 545 546 547 548
/**
 * bdrv_get_aio_context:
 *
 * Returns: the currently bound #AioContext
 */
AioContext *bdrv_get_aio_context(BlockDriverState *bs);

549 550 551 552 553
/**
 * Transfer control to @co in the aio context of @bs
 */
void bdrv_coroutine_enter(BlockDriverState *bs, Coroutine *co);

554 555 556 557 558 559
/**
 * bdrv_set_aio_context:
 *
 * Changes the #AioContext used for fd handlers, timers, and BHs by this
 * BlockDriverState and all its children.
 *
560
 * This function must be called with iothread lock held.
561 562
 */
void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context);
563 564
int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz);
int bdrv_probe_geometry(BlockDriverState *bs, HDGeometry *geo);
565

566 567 568
void bdrv_io_plug(BlockDriverState *bs);
void bdrv_io_unplug(BlockDriverState *bs);

569 570 571 572 573 574
/**
 * bdrv_parent_drained_begin:
 *
 * Begin a quiesced section of all users of @bs. This is part of
 * bdrv_drained_begin.
 */
575
void bdrv_parent_drained_begin(BlockDriverState *bs, BdrvChild *ignore);
576 577 578 579 580 581 582

/**
 * bdrv_parent_drained_end:
 *
 * End a quiesced section of all users of @bs. This is part of
 * bdrv_drained_end.
 */
583
void bdrv_parent_drained_end(BlockDriverState *bs, BdrvChild *ignore);
584

585 586 587 588 589 590 591 592 593 594 595 596
/**
 * bdrv_drained_begin:
 *
 * Begin a quiesced section for exclusive access to the BDS, by disabling
 * external request sources including NBD server and device model. Note that
 * this doesn't block timers or coroutines from submitting more requests, which
 * means block_job_pause is still necessary.
 *
 * This function can be recursive.
 */
void bdrv_drained_begin(BlockDriverState *bs);

597 598 599 600 601 602
/**
 * Like bdrv_drained_begin, but recursively begins a quiesced section for
 * exclusive access to all child nodes as well.
 */
void bdrv_subtree_drained_begin(BlockDriverState *bs);

603 604 605 606 607 608 609
/**
 * bdrv_drained_end:
 *
 * End a quiescent section started by bdrv_drained_begin().
 */
void bdrv_drained_end(BlockDriverState *bs);

610 611 612 613 614
/**
 * End a quiescent section started by bdrv_subtree_drained_begin().
 */
void bdrv_subtree_drained_end(BlockDriverState *bs);

615 616 617 618
void bdrv_add_child(BlockDriverState *parent, BlockDriverState *child,
                    Error **errp);
void bdrv_del_child(BlockDriverState *parent, BdrvChild *child, Error **errp);

619 620
bool bdrv_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
                                     uint32_t granularity, Error **errp);
F
Fam Zheng 已提交
621 622 623 624 625 626 627 628 629 630
/**
 *
 * bdrv_register_buf/bdrv_unregister_buf:
 *
 * Register/unregister a buffer for I/O. For example, VFIO drivers are
 * interested to know the memory areas that would later be used for I/O, so
 * that they can prepare IOMMU mapping etc., to get better performance.
 */
void bdrv_register_buf(BlockDriverState *bs, void *host, size_t size);
void bdrv_unregister_buf(BlockDriverState *bs, void *host);
631
#endif