4 * Copyright (C) 2014-2016 Red Hat, Inc.
7 * Markus Armbruster <armbru@redhat.com>,
9 * This work is licensed under the terms of the GNU LGPL, version 2.1
10 * or later. See the COPYING.LIB file in the top-level directory.
13 #ifndef BLOCK_BACKEND_GLOBAL_STATE_H
14 #define BLOCK_BACKEND_GLOBAL_STATE_H
16 #include "block-backend-common.h"
19 * Global state (GS) API. These functions run under the BQL.
21 * See include/block/block-global-state.h for more information about
25 BlockBackend
*blk_new(AioContext
*ctx
, uint64_t perm
, uint64_t shared_perm
);
27 BlockBackend
* no_coroutine_fn
28 blk_new_with_bs(BlockDriverState
*bs
, uint64_t perm
, uint64_t shared_perm
,
31 BlockBackend
* coroutine_fn no_co_wrapper
32 blk_co_new_with_bs(BlockDriverState
*bs
, uint64_t perm
, uint64_t shared_perm
,
35 BlockBackend
* no_coroutine_fn
36 blk_new_open(const char *filename
, const char *reference
, QDict
*options
,
37 int flags
, Error
**errp
);
39 BlockBackend
* coroutine_fn no_co_wrapper
40 blk_co_new_open(const char *filename
, const char *reference
, QDict
*options
,
41 int flags
, Error
**errp
);
43 int blk_get_refcnt(BlockBackend
*blk
);
44 void blk_ref(BlockBackend
*blk
);
46 void no_coroutine_fn
blk_unref(BlockBackend
*blk
);
47 void coroutine_fn no_co_wrapper
blk_co_unref(BlockBackend
*blk
);
49 void blk_remove_all_bs(void);
50 BlockBackend
*blk_by_name(const char *name
);
51 BlockBackend
*blk_next(BlockBackend
*blk
);
52 BlockBackend
*blk_all_next(BlockBackend
*blk
);
53 bool monitor_add_blk(BlockBackend
*blk
, const char *name
, Error
**errp
);
54 void monitor_remove_blk(BlockBackend
*blk
);
56 BlockBackendPublic
*blk_get_public(BlockBackend
*blk
);
57 BlockBackend
*blk_by_public(BlockBackendPublic
*public);
59 void blk_remove_bs(BlockBackend
*blk
);
60 int blk_insert_bs(BlockBackend
*blk
, BlockDriverState
*bs
, Error
**errp
);
61 int blk_replace_bs(BlockBackend
*blk
, BlockDriverState
*new_bs
, Error
**errp
);
62 bool bdrv_has_blk(BlockDriverState
*bs
);
63 bool bdrv_is_root_node(BlockDriverState
*bs
);
64 int blk_set_perm(BlockBackend
*blk
, uint64_t perm
, uint64_t shared_perm
,
66 void blk_get_perm(BlockBackend
*blk
, uint64_t *perm
, uint64_t *shared_perm
);
68 void blk_iostatus_enable(BlockBackend
*blk
);
69 BlockDeviceIoStatus
blk_iostatus(const BlockBackend
*blk
);
70 void blk_iostatus_disable(BlockBackend
*blk
);
71 void blk_iostatus_reset(BlockBackend
*blk
);
72 int blk_attach_dev(BlockBackend
*blk
, DeviceState
*dev
);
73 void blk_detach_dev(BlockBackend
*blk
, DeviceState
*dev
);
74 DeviceState
*blk_get_attached_dev(BlockBackend
*blk
);
75 BlockBackend
*blk_by_dev(void *dev
);
76 BlockBackend
*blk_by_qdev_id(const char *id
, Error
**errp
);
77 void blk_set_dev_ops(BlockBackend
*blk
, const BlockDevOps
*ops
, void *opaque
);
79 void blk_activate(BlockBackend
*blk
, Error
**errp
);
81 int blk_make_zero(BlockBackend
*blk
, BdrvRequestFlags flags
);
82 void blk_aio_cancel(BlockAIOCB
*acb
);
83 int blk_commit_all(void);
84 void blk_drain(BlockBackend
*blk
);
85 void blk_drain_all(void);
86 void blk_set_on_error(BlockBackend
*blk
, BlockdevOnError on_read_error
,
87 BlockdevOnError on_write_error
);
88 bool blk_supports_write_perm(BlockBackend
*blk
);
89 bool blk_is_sg(BlockBackend
*blk
);
90 void blk_set_enable_write_cache(BlockBackend
*blk
, bool wce
);
91 int blk_get_flags(BlockBackend
*blk
);
92 bool blk_op_is_blocked(BlockBackend
*blk
, BlockOpType op
, Error
**errp
);
93 void blk_op_unblock(BlockBackend
*blk
, BlockOpType op
, Error
*reason
);
94 void blk_op_block_all(BlockBackend
*blk
, Error
*reason
);
95 void blk_op_unblock_all(BlockBackend
*blk
, Error
*reason
);
96 int blk_set_aio_context(BlockBackend
*blk
, AioContext
*new_context
,
98 void blk_add_aio_context_notifier(BlockBackend
*blk
,
99 void (*attached_aio_context
)(AioContext
*new_context
, void *opaque
),
100 void (*detach_aio_context
)(void *opaque
), void *opaque
);
101 void blk_remove_aio_context_notifier(BlockBackend
*blk
,
102 void (*attached_aio_context
)(AioContext
*,
104 void (*detach_aio_context
)(void *),
106 void blk_add_remove_bs_notifier(BlockBackend
*blk
, Notifier
*notify
);
107 void blk_add_insert_bs_notifier(BlockBackend
*blk
, Notifier
*notify
);
108 BlockBackendRootState
*blk_get_root_state(BlockBackend
*blk
);
109 void blk_update_root_state(BlockBackend
*blk
);
110 bool blk_get_detect_zeroes_from_root_state(BlockBackend
*blk
);
111 int blk_get_open_flags_from_root_state(BlockBackend
*blk
);
113 int blk_save_vmstate(BlockBackend
*blk
, const uint8_t *buf
,
114 int64_t pos
, int size
);
115 int blk_load_vmstate(BlockBackend
*blk
, uint8_t *buf
, int64_t pos
, int size
);
116 int blk_probe_blocksizes(BlockBackend
*blk
, BlockSizes
*bsz
);
117 int blk_probe_geometry(BlockBackend
*blk
, HDGeometry
*geo
);
119 void blk_set_io_limits(BlockBackend
*blk
, ThrottleConfig
*cfg
);
120 void blk_io_limits_disable(BlockBackend
*blk
);
121 void blk_io_limits_enable(BlockBackend
*blk
, const char *group
);
122 void blk_io_limits_update_group(BlockBackend
*blk
, const char *group
);
123 void blk_set_force_allow_inactivate(BlockBackend
*blk
);
125 bool blk_register_buf(BlockBackend
*blk
, void *host
, size_t size
, Error
**errp
);
126 void blk_unregister_buf(BlockBackend
*blk
, void *host
, size_t size
);
128 const BdrvChild
*blk_root(BlockBackend
*blk
);
130 int blk_make_empty(BlockBackend
*blk
, Error
**errp
);
132 #endif /* BLOCK_BACKEND_GLOBAL_STATE_H */