Loading block.c +17 −0 Original line number Diff line number Diff line Loading @@ -800,6 +800,7 @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options, * the parent. */ 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_FORCE_SHARE); /* Inherit the read-only option from the parent if it's not set */ qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY); Loading Loading @@ -908,6 +909,7 @@ static void bdrv_backing_options(int *child_flags, QDict *child_options, * 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_NO_FLUSH); qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE); /* backing files always opened read-only */ qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on"); Loading Loading @@ -1150,6 +1152,11 @@ QemuOptsList bdrv_runtime_opts = { .type = QEMU_OPT_STRING, .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 */ } }, }; Loading Loading @@ -1189,6 +1196,16 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file, drv = bdrv_find_format(driver_name); 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) { filename = blk_bs(file)->filename; } else { Loading include/block/block.h +1 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,7 @@ typedef struct HDGeometry { #define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush" #define BDRV_OPT_READ_ONLY "read-only" #define BDRV_OPT_DISCARD "discard" #define BDRV_OPT_FORCE_SHARE "force-share" #define BDRV_SECTOR_BITS 9 Loading include/block/block_int.h +1 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,7 @@ struct BlockDriverState { bool valid_key; /* if true, a valid encryption key has been set */ bool sg; /* if true, the device is a /dev/sg* */ 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 */ void *opaque; Loading qapi/block-core.json +3 −0 Original line number Diff line number Diff line Loading @@ -2898,6 +2898,8 @@ # (default: false) # @detect-zeroes: detect and optimize zero writes (Since 2.1) # (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. # Loading @@ -2909,6 +2911,7 @@ '*discard': 'BlockdevDiscardOptions', '*cache': 'BlockdevCacheOptions', '*read-only': 'bool', '*force-share': 'bool', '*detect-zeroes': 'BlockdevDetectZeroesOptions' }, 'discriminator': 'driver', 'data': { Loading Loading
block.c +17 −0 Original line number Diff line number Diff line Loading @@ -800,6 +800,7 @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options, * the parent. */ 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_FORCE_SHARE); /* Inherit the read-only option from the parent if it's not set */ qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY); Loading Loading @@ -908,6 +909,7 @@ static void bdrv_backing_options(int *child_flags, QDict *child_options, * 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_NO_FLUSH); qdict_copy_default(child_options, parent_options, BDRV_OPT_FORCE_SHARE); /* backing files always opened read-only */ qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on"); Loading Loading @@ -1150,6 +1152,11 @@ QemuOptsList bdrv_runtime_opts = { .type = QEMU_OPT_STRING, .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 */ } }, }; Loading Loading @@ -1189,6 +1196,16 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file, drv = bdrv_find_format(driver_name); 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) { filename = blk_bs(file)->filename; } else { Loading
include/block/block.h +1 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,7 @@ typedef struct HDGeometry { #define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush" #define BDRV_OPT_READ_ONLY "read-only" #define BDRV_OPT_DISCARD "discard" #define BDRV_OPT_FORCE_SHARE "force-share" #define BDRV_SECTOR_BITS 9 Loading
include/block/block_int.h +1 −0 Original line number Diff line number Diff line Loading @@ -518,6 +518,7 @@ struct BlockDriverState { bool valid_key; /* if true, a valid encryption key has been set */ bool sg; /* if true, the device is a /dev/sg* */ 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 */ void *opaque; Loading
qapi/block-core.json +3 −0 Original line number Diff line number Diff line Loading @@ -2898,6 +2898,8 @@ # (default: false) # @detect-zeroes: detect and optimize zero writes (Since 2.1) # (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. # Loading @@ -2909,6 +2911,7 @@ '*discard': 'BlockdevDiscardOptions', '*cache': 'BlockdevCacheOptions', '*read-only': 'bool', '*force-share': 'bool', '*detect-zeroes': 'BlockdevDetectZeroesOptions' }, 'discriminator': 'driver', 'data': { Loading