Skip to content

Commit

Permalink
block: Add a 'mutable_opts' field to BlockDriver
Browse files Browse the repository at this point in the history
If we reopen a BlockDriverState and there is an option that is present
in bs->options but missing from the new set of options then we have to
return an error unless the driver is able to reset it to its default
value.

This patch adds a new 'mutable_opts' field to BlockDriver. This is
a list of runtime options that can be modified during reopen. If an
option in this list is unspecified on reopen then it must be reset (or
return an error).

Signed-off-by: Alberto Garcia <berto@igalia.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
bertogg authored and kevmw committed Mar 12, 2019
1 parent cb828c3 commit 8a2ce0b
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 0 deletions.
6 changes: 6 additions & 0 deletions block/file-posix.c
Expand Up @@ -442,6 +442,8 @@ static QemuOptsList raw_runtime_opts = {
},
};

static const char *const mutable_opts[] = { "x-check-cache-dropped", NULL };

static int raw_open_common(BlockDriverState *bs, QDict *options,
int bdrv_flags, int open_flags,
bool device, Error **errp)
Expand Down Expand Up @@ -2870,6 +2872,7 @@ BlockDriver bdrv_file = {
.bdrv_set_perm = raw_set_perm,
.bdrv_abort_perm_update = raw_abort_perm_update,
.create_opts = &raw_create_opts,
.mutable_opts = mutable_opts,
};

/***********************************************/
Expand Down Expand Up @@ -3321,6 +3324,7 @@ static BlockDriver bdrv_host_device = {
.bdrv_reopen_abort = raw_reopen_abort,
.bdrv_co_create_opts = hdev_co_create_opts,
.create_opts = &raw_create_opts,
.mutable_opts = mutable_opts,
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,

Expand Down Expand Up @@ -3447,6 +3451,7 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_reopen_abort = raw_reopen_abort,
.bdrv_co_create_opts = hdev_co_create_opts,
.create_opts = &raw_create_opts,
.mutable_opts = mutable_opts,
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,


Expand Down Expand Up @@ -3580,6 +3585,7 @@ static BlockDriver bdrv_host_cdrom = {
.bdrv_reopen_abort = raw_reopen_abort,
.bdrv_co_create_opts = hdev_co_create_opts,
.create_opts = &raw_create_opts,
.mutable_opts = mutable_opts,

.bdrv_co_preadv = raw_co_preadv,
.bdrv_co_pwritev = raw_co_pwritev,
Expand Down
25 changes: 25 additions & 0 deletions block/qcow2.c
Expand Up @@ -627,6 +627,30 @@ int qcow2_validate_table(BlockDriverState *bs, uint64_t offset,
return 0;
}

static const char *const mutable_opts[] = {
QCOW2_OPT_LAZY_REFCOUNTS,
QCOW2_OPT_DISCARD_REQUEST,
QCOW2_OPT_DISCARD_SNAPSHOT,
QCOW2_OPT_DISCARD_OTHER,
QCOW2_OPT_OVERLAP,
QCOW2_OPT_OVERLAP_TEMPLATE,
QCOW2_OPT_OVERLAP_MAIN_HEADER,
QCOW2_OPT_OVERLAP_ACTIVE_L1,
QCOW2_OPT_OVERLAP_ACTIVE_L2,
QCOW2_OPT_OVERLAP_REFCOUNT_TABLE,
QCOW2_OPT_OVERLAP_REFCOUNT_BLOCK,
QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE,
QCOW2_OPT_OVERLAP_INACTIVE_L1,
QCOW2_OPT_OVERLAP_INACTIVE_L2,
QCOW2_OPT_OVERLAP_BITMAP_DIRECTORY,
QCOW2_OPT_CACHE_SIZE,
QCOW2_OPT_L2_CACHE_SIZE,
QCOW2_OPT_L2_CACHE_ENTRY_SIZE,
QCOW2_OPT_REFCOUNT_CACHE_SIZE,
QCOW2_OPT_CACHE_CLEAN_INTERVAL,
NULL
};

static QemuOptsList qcow2_runtime_opts = {
.name = "qcow2",
.head = QTAILQ_HEAD_INITIALIZER(qcow2_runtime_opts.head),
Expand Down Expand Up @@ -5275,6 +5299,7 @@ BlockDriver bdrv_qcow2 = {

.create_opts = &qcow2_create_opts,
.strong_runtime_opts = qcow2_strong_runtime_opts,
.mutable_opts = mutable_opts,
.bdrv_co_check = qcow2_co_check,
.bdrv_amend_options = qcow2_amend_options,

Expand Down
3 changes: 3 additions & 0 deletions block/raw-format.c
Expand Up @@ -37,6 +37,8 @@ typedef struct BDRVRawState {
bool has_size;
} BDRVRawState;

static const char *const mutable_opts[] = { "offset", "size", NULL };

static QemuOptsList raw_runtime_opts = {
.name = "raw",
.head = QTAILQ_HEAD_INITIALIZER(raw_runtime_opts.head),
Expand Down Expand Up @@ -570,6 +572,7 @@ BlockDriver bdrv_raw = {
.create_opts = &raw_create_opts,
.bdrv_has_zero_init = &raw_has_zero_init,
.strong_runtime_opts = raw_strong_runtime_opts,
.mutable_opts = mutable_opts,
};

static void bdrv_raw_init(void)
Expand Down
8 changes: 8 additions & 0 deletions include/block/block_int.h
Expand Up @@ -383,6 +383,14 @@ struct BlockDriver {

/* List of options for creating images, terminated by name == NULL */
QemuOptsList *create_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.
Expand Down

0 comments on commit 8a2ce0b

Please sign in to comment.