block_int-common.h: split function pointers in BlockDriver
Similar to the header split, also the function pointers in BlockDriver can be split in I/O and global state. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Message-Id: <20220303151616.325444-26-eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
1581a70ddd
commit
69c0bf1197
@ -96,6 +96,11 @@ typedef struct BdrvTrackedRequest {
|
|||||||
|
|
||||||
|
|
||||||
struct BlockDriver {
|
struct BlockDriver {
|
||||||
|
/*
|
||||||
|
* These fields are initialized when this object is created,
|
||||||
|
* and are never changed afterwards.
|
||||||
|
*/
|
||||||
|
|
||||||
const char *format_name;
|
const char *format_name;
|
||||||
int instance_size;
|
int instance_size;
|
||||||
|
|
||||||
@ -122,36 +127,6 @@ struct BlockDriver {
|
|||||||
*/
|
*/
|
||||||
bool is_format;
|
bool is_format;
|
||||||
|
|
||||||
/*
|
|
||||||
* This function is invoked under BQL before .bdrv_co_amend()
|
|
||||||
* (which in contrast does not necessarily run under the BQL)
|
|
||||||
* to allow driver-specific initialization code that requires
|
|
||||||
* the BQL, like setting up specific permission flags.
|
|
||||||
*/
|
|
||||||
int (*bdrv_amend_pre_run)(BlockDriverState *bs, Error **errp);
|
|
||||||
/*
|
|
||||||
* This function is invoked under BQL after .bdrv_co_amend()
|
|
||||||
* to allow cleaning up what was done in .bdrv_amend_pre_run().
|
|
||||||
*/
|
|
||||||
void (*bdrv_amend_clean)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return true if @to_replace can be replaced by a BDS with the
|
|
||||||
* same data as @bs without it affecting @bs's behavior (that is,
|
|
||||||
* without it being visible to @bs's parents).
|
|
||||||
*/
|
|
||||||
bool (*bdrv_recurse_can_replace)(BlockDriverState *bs,
|
|
||||||
BlockDriverState *to_replace);
|
|
||||||
|
|
||||||
int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
|
|
||||||
int (*bdrv_probe_device)(const char *filename);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Any driver implementing this callback is expected to be able to handle
|
|
||||||
* NULL file names in its .bdrv_open() implementation.
|
|
||||||
*/
|
|
||||||
void (*bdrv_parse_filename)(const char *filename, QDict *options,
|
|
||||||
Error **errp);
|
|
||||||
/*
|
/*
|
||||||
* Drivers not implementing bdrv_parse_filename nor bdrv_open should have
|
* Drivers not implementing bdrv_parse_filename nor bdrv_open should have
|
||||||
* this field set to true, except ones that are defined only by their
|
* this field set to true, except ones that are defined only by their
|
||||||
@ -173,7 +148,79 @@ struct BlockDriver {
|
|||||||
*/
|
*/
|
||||||
bool supports_backing;
|
bool supports_backing;
|
||||||
|
|
||||||
/* For handling image reopen for split or non-split files */
|
bool has_variable_length;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drivers setting this field must be able to work with just a plain
|
||||||
|
* filename with '<protocol_name>:' as a prefix, and no other options.
|
||||||
|
* Options may be extracted from the filename by implementing
|
||||||
|
* bdrv_parse_filename.
|
||||||
|
*/
|
||||||
|
const char *protocol_name;
|
||||||
|
|
||||||
|
/* List of options for creating images, terminated by name == NULL */
|
||||||
|
QemuOptsList *create_opts;
|
||||||
|
|
||||||
|
/* List of options for image amend */
|
||||||
|
QemuOptsList *amend_opts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If this driver supports reopening images this contains a
|
||||||
|
* NULL-terminated list of the runtime options that can be
|
||||||
|
* modified. If an option in this list is unspecified during
|
||||||
|
* reopen then it _must_ be reset to its default value or return
|
||||||
|
* an error.
|
||||||
|
*/
|
||||||
|
const char *const *mutable_opts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pointer to a NULL-terminated array of names of strong options
|
||||||
|
* that can be specified for bdrv_open(). A strong option is one
|
||||||
|
* that changes the data of a BDS.
|
||||||
|
* If this pointer is NULL, the array is considered empty.
|
||||||
|
* "filename" and "driver" are always considered strong.
|
||||||
|
*/
|
||||||
|
const char *const *strong_runtime_opts;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global state (GS) API. These functions run under the BQL.
|
||||||
|
*
|
||||||
|
* See include/block/block-global-state.h for more information about
|
||||||
|
* the GS API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function is invoked under BQL before .bdrv_co_amend()
|
||||||
|
* (which in contrast does not necessarily run under the BQL)
|
||||||
|
* to allow driver-specific initialization code that requires
|
||||||
|
* the BQL, like setting up specific permission flags.
|
||||||
|
*/
|
||||||
|
int (*bdrv_amend_pre_run)(BlockDriverState *bs, Error **errp);
|
||||||
|
/*
|
||||||
|
* This function is invoked under BQL after .bdrv_co_amend()
|
||||||
|
* to allow cleaning up what was done in .bdrv_amend_pre_run().
|
||||||
|
*/
|
||||||
|
void (*bdrv_amend_clean)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return true if @to_replace can be replaced by a BDS with the
|
||||||
|
* same data as @bs without it affecting @bs's behavior (that is,
|
||||||
|
* without it being visible to @bs's parents).
|
||||||
|
*/
|
||||||
|
bool (*bdrv_recurse_can_replace)(BlockDriverState *bs,
|
||||||
|
BlockDriverState *to_replace);
|
||||||
|
|
||||||
|
int (*bdrv_probe_device)(const char *filename);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Any driver implementing this callback is expected to be able to handle
|
||||||
|
* NULL file names in its .bdrv_open() implementation.
|
||||||
|
*/
|
||||||
|
void (*bdrv_parse_filename)(const char *filename, QDict *options,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
|
/* For handling image reopen for split or non-split files. */
|
||||||
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
|
||||||
BlockReopenQueue *queue, Error **errp);
|
BlockReopenQueue *queue, Error **errp);
|
||||||
void (*bdrv_reopen_commit)(BDRVReopenState *reopen_state);
|
void (*bdrv_reopen_commit)(BDRVReopenState *reopen_state);
|
||||||
@ -189,7 +236,6 @@ struct BlockDriver {
|
|||||||
Error **errp);
|
Error **errp);
|
||||||
void (*bdrv_close)(BlockDriverState *bs);
|
void (*bdrv_close)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
|
||||||
int coroutine_fn (*bdrv_co_create)(BlockdevCreateOptions *opts,
|
int coroutine_fn (*bdrv_co_create)(BlockdevCreateOptions *opts,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
int coroutine_fn (*bdrv_co_create_opts)(BlockDriver *drv,
|
int coroutine_fn (*bdrv_co_create_opts)(BlockDriver *drv,
|
||||||
@ -197,11 +243,6 @@ struct BlockDriver {
|
|||||||
QemuOpts *opts,
|
QemuOpts *opts,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
int coroutine_fn (*bdrv_co_amend)(BlockDriverState *bs,
|
|
||||||
BlockdevAmendOptions *opts,
|
|
||||||
bool force,
|
|
||||||
Error **errp);
|
|
||||||
|
|
||||||
int (*bdrv_amend_options)(BlockDriverState *bs,
|
int (*bdrv_amend_options)(BlockDriverState *bs,
|
||||||
QemuOpts *opts,
|
QemuOpts *opts,
|
||||||
BlockDriverAmendStatusCB *status_cb,
|
BlockDriverAmendStatusCB *status_cb,
|
||||||
@ -248,6 +289,174 @@ struct BlockDriver {
|
|||||||
*/
|
*/
|
||||||
char *(*bdrv_dirname)(BlockDriverState *bs, Error **errp);
|
char *(*bdrv_dirname)(BlockDriverState *bs, Error **errp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This informs the driver that we are no longer interested in the result
|
||||||
|
* of in-flight requests, so don't waste the time if possible.
|
||||||
|
*
|
||||||
|
* One example usage is to avoid waiting for an nbd target node reconnect
|
||||||
|
* timeout during job-cancel with force=true.
|
||||||
|
*/
|
||||||
|
void (*bdrv_cancel_in_flight)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
int (*bdrv_inactivate)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
int (*bdrv_snapshot_create)(BlockDriverState *bs,
|
||||||
|
QEMUSnapshotInfo *sn_info);
|
||||||
|
int (*bdrv_snapshot_goto)(BlockDriverState *bs,
|
||||||
|
const char *snapshot_id);
|
||||||
|
int (*bdrv_snapshot_delete)(BlockDriverState *bs,
|
||||||
|
const char *snapshot_id,
|
||||||
|
const char *name,
|
||||||
|
Error **errp);
|
||||||
|
int (*bdrv_snapshot_list)(BlockDriverState *bs,
|
||||||
|
QEMUSnapshotInfo **psn_info);
|
||||||
|
int (*bdrv_snapshot_load_tmp)(BlockDriverState *bs,
|
||||||
|
const char *snapshot_id,
|
||||||
|
const char *name,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
|
int (*bdrv_change_backing_file)(BlockDriverState *bs,
|
||||||
|
const char *backing_file, const char *backing_fmt);
|
||||||
|
|
||||||
|
/* TODO Better pass a option string/QDict/QemuOpts to add any rule? */
|
||||||
|
int (*bdrv_debug_breakpoint)(BlockDriverState *bs, const char *event,
|
||||||
|
const char *tag);
|
||||||
|
int (*bdrv_debug_remove_breakpoint)(BlockDriverState *bs,
|
||||||
|
const char *tag);
|
||||||
|
int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag);
|
||||||
|
bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag);
|
||||||
|
|
||||||
|
void (*bdrv_refresh_limits)(BlockDriverState *bs, Error **errp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns 1 if newly created images are guaranteed to contain only
|
||||||
|
* zeros, 0 otherwise.
|
||||||
|
*/
|
||||||
|
int (*bdrv_has_zero_init)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove fd handlers, timers, and other event loop callbacks so the event
|
||||||
|
* loop is no longer in use. Called with no in-flight requests and in
|
||||||
|
* depth-first traversal order with parents before child nodes.
|
||||||
|
*/
|
||||||
|
void (*bdrv_detach_aio_context)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add fd handlers, timers, and other event loop callbacks so I/O requests
|
||||||
|
* can be processed again. Called with no in-flight requests and in
|
||||||
|
* depth-first traversal order with child nodes before parent nodes.
|
||||||
|
*/
|
||||||
|
void (*bdrv_attach_aio_context)(BlockDriverState *bs,
|
||||||
|
AioContext *new_context);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to get @bs's logical and physical block size.
|
||||||
|
* On success, store them in @bsz and return zero.
|
||||||
|
* On failure, return negative errno.
|
||||||
|
*/
|
||||||
|
int (*bdrv_probe_blocksizes)(BlockDriverState *bs, BlockSizes *bsz);
|
||||||
|
/**
|
||||||
|
* Try to get @bs's geometry (cyls, heads, sectors)
|
||||||
|
* On success, store them in @geo and return 0.
|
||||||
|
* On failure return -errno.
|
||||||
|
* Only drivers that want to override guest geometry implement this
|
||||||
|
* callback; see hd_geometry_guess().
|
||||||
|
*/
|
||||||
|
int (*bdrv_probe_geometry)(BlockDriverState *bs, HDGeometry *geo);
|
||||||
|
|
||||||
|
void (*bdrv_add_child)(BlockDriverState *parent, BlockDriverState *child,
|
||||||
|
Error **errp);
|
||||||
|
void (*bdrv_del_child)(BlockDriverState *parent, BdrvChild *child,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Informs the block driver that a permission change is intended. The
|
||||||
|
* driver checks whether the change is permissible and may take other
|
||||||
|
* preparations for the change (e.g. get file system locks). This operation
|
||||||
|
* is always followed either by a call to either .bdrv_set_perm or
|
||||||
|
* .bdrv_abort_perm_update.
|
||||||
|
*
|
||||||
|
* Checks whether the requested set of cumulative permissions in @perm
|
||||||
|
* can be granted for accessing @bs and whether no other users are using
|
||||||
|
* permissions other than those given in @shared (both arguments take
|
||||||
|
* BLK_PERM_* bitmasks).
|
||||||
|
*
|
||||||
|
* If both conditions are met, 0 is returned. Otherwise, -errno is returned
|
||||||
|
* and errp is set to an error describing the conflict.
|
||||||
|
*/
|
||||||
|
int (*bdrv_check_perm)(BlockDriverState *bs, uint64_t perm,
|
||||||
|
uint64_t shared, Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to inform the driver that the set of cumulative set of used
|
||||||
|
* permissions for @bs has changed to @perm, and the set of sharable
|
||||||
|
* permission to @shared. The driver can use this to propagate changes to
|
||||||
|
* its children (i.e. request permissions only if a parent actually needs
|
||||||
|
* them).
|
||||||
|
*
|
||||||
|
* This function is only invoked after bdrv_check_perm(), so block drivers
|
||||||
|
* may rely on preparations made in their .bdrv_check_perm implementation.
|
||||||
|
*/
|
||||||
|
void (*bdrv_set_perm)(BlockDriverState *bs, uint64_t perm, uint64_t shared);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called to inform the driver that after a previous bdrv_check_perm()
|
||||||
|
* call, the permission update is not performed and any preparations made
|
||||||
|
* for it (e.g. taken file locks) need to be undone.
|
||||||
|
*
|
||||||
|
* This function can be called even for nodes that never saw a
|
||||||
|
* bdrv_check_perm() call. It is a no-op then.
|
||||||
|
*/
|
||||||
|
void (*bdrv_abort_perm_update)(BlockDriverState *bs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns in @nperm and @nshared the permissions that the driver for @bs
|
||||||
|
* needs on its child @c, based on the cumulative permissions requested by
|
||||||
|
* the parents in @parent_perm and @parent_shared.
|
||||||
|
*
|
||||||
|
* If @c is NULL, return the permissions for attaching a new child for the
|
||||||
|
* given @child_class and @role.
|
||||||
|
*
|
||||||
|
* If @reopen_queue is non-NULL, don't return the currently needed
|
||||||
|
* permissions, but those that will be needed after applying the
|
||||||
|
* @reopen_queue.
|
||||||
|
*/
|
||||||
|
void (*bdrv_child_perm)(BlockDriverState *bs, BdrvChild *c,
|
||||||
|
BdrvChildRole role,
|
||||||
|
BlockReopenQueue *reopen_queue,
|
||||||
|
uint64_t parent_perm, uint64_t parent_shared,
|
||||||
|
uint64_t *nperm, uint64_t *nshared);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register/unregister a buffer for I/O. For example, when the driver is
|
||||||
|
* interested to know the memory areas that will later be used in iovs, so
|
||||||
|
* that it can do IOMMU mapping with VFIO etc., in order to get better
|
||||||
|
* performance. In the case of VFIO drivers, this callback is used to do
|
||||||
|
* DMA mapping for hot buffers.
|
||||||
|
*/
|
||||||
|
void (*bdrv_register_buf)(BlockDriverState *bs, void *host, size_t size);
|
||||||
|
void (*bdrv_unregister_buf)(BlockDriverState *bs, void *host);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This field is modified only under the BQL, and is part of
|
||||||
|
* the global state.
|
||||||
|
*/
|
||||||
|
QLIST_ENTRY(BlockDriver) list;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O API functions. These functions are thread-safe.
|
||||||
|
*
|
||||||
|
* See include/block/block-io.h for more information about
|
||||||
|
* the I/O API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
|
||||||
|
|
||||||
|
int coroutine_fn (*bdrv_co_amend)(BlockDriverState *bs,
|
||||||
|
BlockdevAmendOptions *opts,
|
||||||
|
bool force,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/* aio */
|
/* aio */
|
||||||
BlockAIOCB *(*bdrv_aio_preadv)(BlockDriverState *bs,
|
BlockAIOCB *(*bdrv_aio_preadv)(BlockDriverState *bs,
|
||||||
int64_t offset, int64_t bytes, QEMUIOVector *qiov,
|
int64_t offset, int64_t bytes, QEMUIOVector *qiov,
|
||||||
@ -388,21 +597,11 @@ struct BlockDriver {
|
|||||||
bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
|
bool want_zero, int64_t offset, int64_t bytes, int64_t *pnum,
|
||||||
int64_t *map, BlockDriverState **file);
|
int64_t *map, BlockDriverState **file);
|
||||||
|
|
||||||
/*
|
|
||||||
* This informs the driver that we are no longer interested in the result
|
|
||||||
* of in-flight requests, so don't waste the time if possible.
|
|
||||||
*
|
|
||||||
* One example usage is to avoid waiting for an nbd target node reconnect
|
|
||||||
* timeout during job-cancel with force=true.
|
|
||||||
*/
|
|
||||||
void (*bdrv_cancel_in_flight)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Invalidate any cached meta-data.
|
* Invalidate any cached meta-data.
|
||||||
*/
|
*/
|
||||||
void coroutine_fn (*bdrv_co_invalidate_cache)(BlockDriverState *bs,
|
void coroutine_fn (*bdrv_co_invalidate_cache)(BlockDriverState *bs,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
int (*bdrv_inactivate)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flushes all data for all layers by calling bdrv_co_flush for underlying
|
* Flushes all data for all layers by calling bdrv_co_flush for underlying
|
||||||
@ -428,14 +627,6 @@ struct BlockDriver {
|
|||||||
*/
|
*/
|
||||||
int coroutine_fn (*bdrv_co_flush_to_os)(BlockDriverState *bs);
|
int coroutine_fn (*bdrv_co_flush_to_os)(BlockDriverState *bs);
|
||||||
|
|
||||||
/*
|
|
||||||
* Drivers setting this field must be able to work with just a plain
|
|
||||||
* filename with '<protocol_name>:' as a prefix, and no other options.
|
|
||||||
* Options may be extracted from the filename by implementing
|
|
||||||
* bdrv_parse_filename.
|
|
||||||
*/
|
|
||||||
const char *protocol_name;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Truncate @bs to @offset bytes using the given @prealloc mode
|
* Truncate @bs to @offset bytes using the given @prealloc mode
|
||||||
* when growing. Modes other than PREALLOC_MODE_OFF should be
|
* when growing. Modes other than PREALLOC_MODE_OFF should be
|
||||||
@ -453,7 +644,6 @@ struct BlockDriver {
|
|||||||
bool exact, PreallocMode prealloc,
|
bool exact, PreallocMode prealloc,
|
||||||
BdrvRequestFlags flags, Error **errp);
|
BdrvRequestFlags flags, Error **errp);
|
||||||
int64_t (*bdrv_getlength)(BlockDriverState *bs);
|
int64_t (*bdrv_getlength)(BlockDriverState *bs);
|
||||||
bool has_variable_length;
|
|
||||||
int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs);
|
int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs);
|
||||||
BlockMeasureInfo *(*bdrv_measure)(QemuOpts *opts, BlockDriverState *in_bs,
|
BlockMeasureInfo *(*bdrv_measure)(QemuOpts *opts, BlockDriverState *in_bs,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
@ -464,20 +654,6 @@ struct BlockDriver {
|
|||||||
int64_t offset, int64_t bytes, QEMUIOVector *qiov,
|
int64_t offset, int64_t bytes, QEMUIOVector *qiov,
|
||||||
size_t qiov_offset);
|
size_t qiov_offset);
|
||||||
|
|
||||||
int (*bdrv_snapshot_create)(BlockDriverState *bs,
|
|
||||||
QEMUSnapshotInfo *sn_info);
|
|
||||||
int (*bdrv_snapshot_goto)(BlockDriverState *bs,
|
|
||||||
const char *snapshot_id);
|
|
||||||
int (*bdrv_snapshot_delete)(BlockDriverState *bs,
|
|
||||||
const char *snapshot_id,
|
|
||||||
const char *name,
|
|
||||||
Error **errp);
|
|
||||||
int (*bdrv_snapshot_list)(BlockDriverState *bs,
|
|
||||||
QEMUSnapshotInfo **psn_info);
|
|
||||||
int (*bdrv_snapshot_load_tmp)(BlockDriverState *bs,
|
|
||||||
const char *snapshot_id,
|
|
||||||
const char *name,
|
|
||||||
Error **errp);
|
|
||||||
int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
|
int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
|
||||||
|
|
||||||
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs,
|
ImageInfoSpecific *(*bdrv_get_specific_info)(BlockDriverState *bs,
|
||||||
@ -491,9 +667,6 @@ struct BlockDriver {
|
|||||||
QEMUIOVector *qiov,
|
QEMUIOVector *qiov,
|
||||||
int64_t pos);
|
int64_t pos);
|
||||||
|
|
||||||
int (*bdrv_change_backing_file)(BlockDriverState *bs,
|
|
||||||
const char *backing_file, const char *backing_fmt);
|
|
||||||
|
|
||||||
/* removable device specific */
|
/* removable device specific */
|
||||||
bool (*bdrv_is_inserted)(BlockDriverState *bs);
|
bool (*bdrv_is_inserted)(BlockDriverState *bs);
|
||||||
void (*bdrv_eject)(BlockDriverState *bs, bool eject_flag);
|
void (*bdrv_eject)(BlockDriverState *bs, bool eject_flag);
|
||||||
@ -506,21 +679,6 @@ struct BlockDriver {
|
|||||||
int coroutine_fn (*bdrv_co_ioctl)(BlockDriverState *bs,
|
int coroutine_fn (*bdrv_co_ioctl)(BlockDriverState *bs,
|
||||||
unsigned long int req, void *buf);
|
unsigned long int req, void *buf);
|
||||||
|
|
||||||
/* List of options for creating images, terminated by name == NULL */
|
|
||||||
QemuOptsList *create_opts;
|
|
||||||
|
|
||||||
/* List of options for image amend */
|
|
||||||
QemuOptsList *amend_opts;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If this driver supports reopening images this contains a
|
|
||||||
* NULL-terminated list of the runtime options that can be
|
|
||||||
* modified. If an option in this list is unspecified during
|
|
||||||
* reopen then it _must_ be reset to its default value or return
|
|
||||||
* an error.
|
|
||||||
*/
|
|
||||||
const char *const *mutable_opts;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns 0 for completed check, -errno for internal errors.
|
* Returns 0 for completed check, -errno for internal errors.
|
||||||
* The check results are stored in result.
|
* The check results are stored in result.
|
||||||
@ -531,56 +689,10 @@ struct BlockDriver {
|
|||||||
|
|
||||||
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
||||||
|
|
||||||
/* TODO Better pass a option string/QDict/QemuOpts to add any rule? */
|
|
||||||
int (*bdrv_debug_breakpoint)(BlockDriverState *bs, const char *event,
|
|
||||||
const char *tag);
|
|
||||||
int (*bdrv_debug_remove_breakpoint)(BlockDriverState *bs,
|
|
||||||
const char *tag);
|
|
||||||
int (*bdrv_debug_resume)(BlockDriverState *bs, const char *tag);
|
|
||||||
bool (*bdrv_debug_is_suspended)(BlockDriverState *bs, const char *tag);
|
|
||||||
|
|
||||||
void (*bdrv_refresh_limits)(BlockDriverState *bs, Error **errp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Returns 1 if newly created images are guaranteed to contain only
|
|
||||||
* zeros, 0 otherwise.
|
|
||||||
*/
|
|
||||||
int (*bdrv_has_zero_init)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove fd handlers, timers, and other event loop callbacks so the event
|
|
||||||
* loop is no longer in use. Called with no in-flight requests and in
|
|
||||||
* depth-first traversal order with parents before child nodes.
|
|
||||||
*/
|
|
||||||
void (*bdrv_detach_aio_context)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add fd handlers, timers, and other event loop callbacks so I/O requests
|
|
||||||
* can be processed again. Called with no in-flight requests and in
|
|
||||||
* depth-first traversal order with child nodes before parent nodes.
|
|
||||||
*/
|
|
||||||
void (*bdrv_attach_aio_context)(BlockDriverState *bs,
|
|
||||||
AioContext *new_context);
|
|
||||||
|
|
||||||
/* io queue for linux-aio */
|
/* io queue for linux-aio */
|
||||||
void (*bdrv_io_plug)(BlockDriverState *bs);
|
void (*bdrv_io_plug)(BlockDriverState *bs);
|
||||||
void (*bdrv_io_unplug)(BlockDriverState *bs);
|
void (*bdrv_io_unplug)(BlockDriverState *bs);
|
||||||
|
|
||||||
/**
|
|
||||||
* Try to get @bs's logical and physical block size.
|
|
||||||
* On success, store them in @bsz and return zero.
|
|
||||||
* On failure, return negative errno.
|
|
||||||
*/
|
|
||||||
int (*bdrv_probe_blocksizes)(BlockDriverState *bs, BlockSizes *bsz);
|
|
||||||
/**
|
|
||||||
* Try to get @bs's geometry (cyls, heads, sectors)
|
|
||||||
* On success, store them in @geo and return 0.
|
|
||||||
* On failure return -errno.
|
|
||||||
* Only drivers that want to override guest geometry implement this
|
|
||||||
* callback; see hd_geometry_guess().
|
|
||||||
*/
|
|
||||||
int (*bdrv_probe_geometry)(BlockDriverState *bs, HDGeometry *geo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bdrv_co_drain_begin is called if implemented in the beginning of a
|
* bdrv_co_drain_begin is called if implemented in the beginning of a
|
||||||
* drain operation to drain and stop any internal sources of requests in
|
* drain operation to drain and stop any internal sources of requests in
|
||||||
@ -594,69 +706,6 @@ struct BlockDriver {
|
|||||||
void coroutine_fn (*bdrv_co_drain_begin)(BlockDriverState *bs);
|
void coroutine_fn (*bdrv_co_drain_begin)(BlockDriverState *bs);
|
||||||
void coroutine_fn (*bdrv_co_drain_end)(BlockDriverState *bs);
|
void coroutine_fn (*bdrv_co_drain_end)(BlockDriverState *bs);
|
||||||
|
|
||||||
void (*bdrv_add_child)(BlockDriverState *parent, BlockDriverState *child,
|
|
||||||
Error **errp);
|
|
||||||
void (*bdrv_del_child)(BlockDriverState *parent, BdrvChild *child,
|
|
||||||
Error **errp);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Informs the block driver that a permission change is intended. The
|
|
||||||
* driver checks whether the change is permissible and may take other
|
|
||||||
* preparations for the change (e.g. get file system locks). This operation
|
|
||||||
* is always followed either by a call to either .bdrv_set_perm or
|
|
||||||
* .bdrv_abort_perm_update.
|
|
||||||
*
|
|
||||||
* Checks whether the requested set of cumulative permissions in @perm
|
|
||||||
* can be granted for accessing @bs and whether no other users are using
|
|
||||||
* permissions other than those given in @shared (both arguments take
|
|
||||||
* BLK_PERM_* bitmasks).
|
|
||||||
*
|
|
||||||
* If both conditions are met, 0 is returned. Otherwise, -errno is returned
|
|
||||||
* and errp is set to an error describing the conflict.
|
|
||||||
*/
|
|
||||||
int (*bdrv_check_perm)(BlockDriverState *bs, uint64_t perm,
|
|
||||||
uint64_t shared, Error **errp);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called to inform the driver that the set of cumulative set of used
|
|
||||||
* permissions for @bs has changed to @perm, and the set of sharable
|
|
||||||
* permission to @shared. The driver can use this to propagate changes to
|
|
||||||
* its children (i.e. request permissions only if a parent actually needs
|
|
||||||
* them).
|
|
||||||
*
|
|
||||||
* This function is only invoked after bdrv_check_perm(), so block drivers
|
|
||||||
* may rely on preparations made in their .bdrv_check_perm implementation.
|
|
||||||
*/
|
|
||||||
void (*bdrv_set_perm)(BlockDriverState *bs, uint64_t perm, uint64_t shared);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called to inform the driver that after a previous bdrv_check_perm()
|
|
||||||
* call, the permission update is not performed and any preparations made
|
|
||||||
* for it (e.g. taken file locks) need to be undone.
|
|
||||||
*
|
|
||||||
* This function can be called even for nodes that never saw a
|
|
||||||
* bdrv_check_perm() call. It is a no-op then.
|
|
||||||
*/
|
|
||||||
void (*bdrv_abort_perm_update)(BlockDriverState *bs);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns in @nperm and @nshared the permissions that the driver for @bs
|
|
||||||
* needs on its child @c, based on the cumulative permissions requested by
|
|
||||||
* the parents in @parent_perm and @parent_shared.
|
|
||||||
*
|
|
||||||
* If @c is NULL, return the permissions for attaching a new child for the
|
|
||||||
* given @child_class and @role.
|
|
||||||
*
|
|
||||||
* If @reopen_queue is non-NULL, don't return the currently needed
|
|
||||||
* permissions, but those that will be needed after applying the
|
|
||||||
* @reopen_queue.
|
|
||||||
*/
|
|
||||||
void (*bdrv_child_perm)(BlockDriverState *bs, BdrvChild *c,
|
|
||||||
BdrvChildRole role,
|
|
||||||
BlockReopenQueue *reopen_queue,
|
|
||||||
uint64_t parent_perm, uint64_t parent_shared,
|
|
||||||
uint64_t *nperm, uint64_t *nshared);
|
|
||||||
|
|
||||||
bool (*bdrv_supports_persistent_dirty_bitmap)(BlockDriverState *bs);
|
bool (*bdrv_supports_persistent_dirty_bitmap)(BlockDriverState *bs);
|
||||||
bool (*bdrv_co_can_store_new_dirty_bitmap)(BlockDriverState *bs,
|
bool (*bdrv_co_can_store_new_dirty_bitmap)(BlockDriverState *bs,
|
||||||
const char *name,
|
const char *name,
|
||||||
@ -665,26 +714,6 @@ struct BlockDriver {
|
|||||||
int (*bdrv_co_remove_persistent_dirty_bitmap)(BlockDriverState *bs,
|
int (*bdrv_co_remove_persistent_dirty_bitmap)(BlockDriverState *bs,
|
||||||
const char *name,
|
const char *name,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
/**
|
|
||||||
* Register/unregister a buffer for I/O. For example, when the driver is
|
|
||||||
* interested to know the memory areas that will later be used in iovs, so
|
|
||||||
* that it can do IOMMU mapping with VFIO etc., in order to get better
|
|
||||||
* performance. In the case of VFIO drivers, this callback is used to do
|
|
||||||
* DMA mapping for hot buffers.
|
|
||||||
*/
|
|
||||||
void (*bdrv_register_buf)(BlockDriverState *bs, void *host, size_t size);
|
|
||||||
void (*bdrv_unregister_buf)(BlockDriverState *bs, void *host);
|
|
||||||
QLIST_ENTRY(BlockDriver) list;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pointer to a NULL-terminated array of names of strong options
|
|
||||||
* that can be specified for bdrv_open(). A strong option is one
|
|
||||||
* that changes the data of a BDS.
|
|
||||||
* If this pointer is NULL, the array is considered empty.
|
|
||||||
* "filename" and "driver" are always considered strong.
|
|
||||||
*/
|
|
||||||
const char *const *strong_runtime_opts;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool block_driver_can_compress(BlockDriver *drv)
|
static inline bool block_driver_can_compress(BlockDriver *drv)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user