mirror of https://github.com/xemu-project/xemu.git
block: Add, parse and store "force-share" option
Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
5176196c32
commit
5a9347c673
17
block.c
17
block.c
|
@ -800,6 +800,7 @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options,
|
||||||
* the parent. */
|
* the parent. */
|
||||||
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
|
||||||
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
|
||||||
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE);
|
||||||
|
|
||||||
/* Inherit the read-only option from the parent if it's not set */
|
/* Inherit the read-only option from the parent if it's not set */
|
||||||
qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
|
||||||
|
@ -908,6 +909,7 @@ static void bdrv_backing_options(int *child_flags, QDict *child_options,
|
||||||
* which is only applied on the top level (BlockBackend) */
|
* which is only applied on the top level (BlockBackend) */
|
||||||
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_DIRECT);
|
||||||
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_CACHE_NO_FLUSH);
|
||||||
|
qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE);
|
||||||
|
|
||||||
/* backing files always opened read-only */
|
/* backing files always opened read-only */
|
||||||
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
|
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
|
||||||
|
@ -1150,6 +1152,11 @@ QemuOptsList bdrv_runtime_opts = {
|
||||||
.type = QEMU_OPT_STRING,
|
.type = QEMU_OPT_STRING,
|
||||||
.help = "discard operation (ignore/off, unmap/on)",
|
.help = "discard operation (ignore/off, unmap/on)",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = BDRV_OPT_FORCE_SHARE,
|
||||||
|
.type = QEMU_OPT_BOOL,
|
||||||
|
.help = "always accept other writers (default: off)",
|
||||||
|
},
|
||||||
{ /* end of list */ }
|
{ /* end of list */ }
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -1189,6 +1196,16 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
|
||||||
drv = bdrv_find_format(driver_name);
|
drv = bdrv_find_format(driver_name);
|
||||||
assert(drv != NULL);
|
assert(drv != NULL);
|
||||||
|
|
||||||
|
bs->force_share = qemu_opt_get_bool(opts, BDRV_OPT_FORCE_SHARE, false);
|
||||||
|
|
||||||
|
if (bs->force_share && (bs->open_flags & BDRV_O_RDWR)) {
|
||||||
|
error_setg(errp,
|
||||||
|
BDRV_OPT_FORCE_SHARE
|
||||||
|
"=on can only be used with read-only images");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto fail_opts;
|
||||||
|
}
|
||||||
|
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
filename = blk_bs(file)->filename;
|
filename = blk_bs(file)->filename;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -109,6 +109,7 @@ typedef struct HDGeometry {
|
||||||
#define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
|
#define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
|
||||||
#define BDRV_OPT_READ_ONLY "read-only"
|
#define BDRV_OPT_READ_ONLY "read-only"
|
||||||
#define BDRV_OPT_DISCARD "discard"
|
#define BDRV_OPT_DISCARD "discard"
|
||||||
|
#define BDRV_OPT_FORCE_SHARE "force-share"
|
||||||
|
|
||||||
|
|
||||||
#define BDRV_SECTOR_BITS 9
|
#define BDRV_SECTOR_BITS 9
|
||||||
|
|
|
@ -518,6 +518,7 @@ struct BlockDriverState {
|
||||||
bool valid_key; /* if true, a valid encryption key has been set */
|
bool valid_key; /* if true, a valid encryption key has been set */
|
||||||
bool sg; /* if true, the device is a /dev/sg* */
|
bool sg; /* if true, the device is a /dev/sg* */
|
||||||
bool probed; /* if true, format was probed rather than specified */
|
bool probed; /* if true, format was probed rather than specified */
|
||||||
|
bool force_share; /* if true, always allow all shared permissions */
|
||||||
|
|
||||||
BlockDriver *drv; /* NULL means no media */
|
BlockDriver *drv; /* NULL means no media */
|
||||||
void *opaque;
|
void *opaque;
|
||||||
|
|
|
@ -2898,6 +2898,8 @@
|
||||||
# (default: false)
|
# (default: false)
|
||||||
# @detect-zeroes: detect and optimize zero writes (Since 2.1)
|
# @detect-zeroes: detect and optimize zero writes (Since 2.1)
|
||||||
# (default: off)
|
# (default: off)
|
||||||
|
# @force-share: force share all permission on added nodes.
|
||||||
|
# Requires read-only=true. (Since 2.10)
|
||||||
#
|
#
|
||||||
# Remaining options are determined by the block driver.
|
# Remaining options are determined by the block driver.
|
||||||
#
|
#
|
||||||
|
@ -2909,6 +2911,7 @@
|
||||||
'*discard': 'BlockdevDiscardOptions',
|
'*discard': 'BlockdevDiscardOptions',
|
||||||
'*cache': 'BlockdevCacheOptions',
|
'*cache': 'BlockdevCacheOptions',
|
||||||
'*read-only': 'bool',
|
'*read-only': 'bool',
|
||||||
|
'*force-share': 'bool',
|
||||||
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
|
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
|
||||||
'discriminator': 'driver',
|
'discriminator': 'driver',
|
||||||
'data': {
|
'data': {
|
||||||
|
|
Loading…
Reference in New Issue