block/amend: add 'force' option
'force' option will be used for some unsafe amend operations. This includes things like erasing last keyslot in luks based formats (which destroys the data, unless the master key is backed up by external means), but that _might_ be desired result. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200608094030.670121-4-mlevitsk@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
557d2bdcca
commit
a3579bfa0a
4
block.c
4
block.c
@ -6482,6 +6482,7 @@ void bdrv_remove_aio_context_notifier(BlockDriverState *bs,
|
|||||||
|
|
||||||
int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
||||||
BlockDriverAmendStatusCB *status_cb, void *cb_opaque,
|
BlockDriverAmendStatusCB *status_cb, void *cb_opaque,
|
||||||
|
bool force,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
if (!bs->drv) {
|
if (!bs->drv) {
|
||||||
@ -6493,7 +6494,8 @@ int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
|||||||
bs->drv->format_name);
|
bs->drv->format_name);
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
return bs->drv->bdrv_amend_options(bs, opts, status_cb, cb_opaque, errp);
|
return bs->drv->bdrv_amend_options(bs, opts, status_cb,
|
||||||
|
cb_opaque, force, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -5351,6 +5351,7 @@ static void qcow2_amend_helper_cb(BlockDriverState *bs,
|
|||||||
static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
||||||
BlockDriverAmendStatusCB *status_cb,
|
BlockDriverAmendStatusCB *status_cb,
|
||||||
void *cb_opaque,
|
void *cb_opaque,
|
||||||
|
bool force,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
|
@ -253,11 +253,14 @@ Command description:
|
|||||||
|
|
||||||
.. program:: qemu-img-commands
|
.. program:: qemu-img-commands
|
||||||
|
|
||||||
.. option:: amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] -o OPTIONS FILENAME
|
.. option:: amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] [--force] -o OPTIONS FILENAME
|
||||||
|
|
||||||
Amends the image format specific *OPTIONS* for the image file
|
Amends the image format specific *OPTIONS* for the image file
|
||||||
*FILENAME*. Not all file formats support this operation.
|
*FILENAME*. Not all file formats support this operation.
|
||||||
|
|
||||||
|
--force allows some unsafe operations. Currently for -f luks, it allows to
|
||||||
|
erase the last encryption key, and to overwrite an active encryption key.
|
||||||
|
|
||||||
.. option:: bench [-c COUNT] [-d DEPTH] [-f FMT] [--flush-interval=FLUSH_INTERVAL] [-i AIO] [-n] [--no-drain] [-o OFFSET] [--pattern=PATTERN] [-q] [-s BUFFER_SIZE] [-S STEP_SIZE] [-t CACHE] [-w] [-U] FILENAME
|
.. option:: bench [-c COUNT] [-d DEPTH] [-f FMT] [--flush-interval=FLUSH_INTERVAL] [-i AIO] [-n] [--no-drain] [-o OFFSET] [--pattern=PATTERN] [-q] [-s BUFFER_SIZE] [-S STEP_SIZE] [-t CACHE] [-w] [-U] FILENAME
|
||||||
|
|
||||||
Run a simple sequential I/O benchmark on the specified image. If ``-w`` is
|
Run a simple sequential I/O benchmark on the specified image. If ``-w`` is
|
||||||
|
@ -450,6 +450,7 @@ typedef void BlockDriverAmendStatusCB(BlockDriverState *bs, int64_t offset,
|
|||||||
int64_t total_work_size, void *opaque);
|
int64_t total_work_size, void *opaque);
|
||||||
int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts *opts,
|
int bdrv_amend_options(BlockDriverState *bs_new, QemuOpts *opts,
|
||||||
BlockDriverAmendStatusCB *status_cb, void *cb_opaque,
|
BlockDriverAmendStatusCB *status_cb, void *cb_opaque,
|
||||||
|
bool force,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
/* check if a named node can be replaced when doing drive-mirror */
|
/* check if a named node can be replaced when doing drive-mirror */
|
||||||
|
@ -440,6 +440,7 @@ struct BlockDriver {
|
|||||||
int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts,
|
int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts,
|
||||||
BlockDriverAmendStatusCB *status_cb,
|
BlockDriverAmendStatusCB *status_cb,
|
||||||
void *cb_opaque,
|
void *cb_opaque,
|
||||||
|
bool force,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
void (*bdrv_debug_event)(BlockDriverState *bs, BlkdebugEvent event);
|
||||||
|
@ -10,9 +10,9 @@ HXCOMM When amending the rST sections, please remember to copy the usage
|
|||||||
HXCOMM over to the per-command sections in docs/tools/qemu-img.rst.
|
HXCOMM over to the per-command sections in docs/tools/qemu-img.rst.
|
||||||
|
|
||||||
DEF("amend", img_amend,
|
DEF("amend", img_amend,
|
||||||
"amend [--object objectdef] [--image-opts] [-p] [-q] [-f fmt] [-t cache] -o options filename")
|
"amend [--object objectdef] [--image-opts] [-p] [-q] [-f fmt] [-t cache] [--force] -o options filename")
|
||||||
SRST
|
SRST
|
||||||
.. option:: amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] -o OPTIONS FILENAME
|
.. option:: amend [--object OBJECTDEF] [--image-opts] [-p] [-q] [-f FMT] [-t CACHE] [--force] -o OPTIONS FILENAME
|
||||||
ERST
|
ERST
|
||||||
|
|
||||||
DEF("bench", img_bench,
|
DEF("bench", img_bench,
|
||||||
|
@ -79,6 +79,7 @@ enum {
|
|||||||
OPTION_DISABLE = 273,
|
OPTION_DISABLE = 273,
|
||||||
OPTION_MERGE = 274,
|
OPTION_MERGE = 274,
|
||||||
OPTION_BITMAPS = 275,
|
OPTION_BITMAPS = 275,
|
||||||
|
OPTION_FORCE = 276,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum OutputFormat {
|
typedef enum OutputFormat {
|
||||||
@ -4090,6 +4091,7 @@ static int img_amend(int argc, char **argv)
|
|||||||
BlockBackend *blk = NULL;
|
BlockBackend *blk = NULL;
|
||||||
BlockDriverState *bs = NULL;
|
BlockDriverState *bs = NULL;
|
||||||
bool image_opts = false;
|
bool image_opts = false;
|
||||||
|
bool force = false;
|
||||||
|
|
||||||
cache = BDRV_DEFAULT_CACHE;
|
cache = BDRV_DEFAULT_CACHE;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -4097,6 +4099,7 @@ static int img_amend(int argc, char **argv)
|
|||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
{"object", required_argument, 0, OPTION_OBJECT},
|
{"object", required_argument, 0, OPTION_OBJECT},
|
||||||
{"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
|
{"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
|
||||||
|
{"force", no_argument, 0, OPTION_FORCE},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
c = getopt_long(argc, argv, ":ho:f:t:pq",
|
c = getopt_long(argc, argv, ":ho:f:t:pq",
|
||||||
@ -4144,6 +4147,9 @@ static int img_amend(int argc, char **argv)
|
|||||||
case OPTION_IMAGE_OPTS:
|
case OPTION_IMAGE_OPTS:
|
||||||
image_opts = true;
|
image_opts = true;
|
||||||
break;
|
break;
|
||||||
|
case OPTION_FORCE:
|
||||||
|
force = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4221,7 +4227,7 @@ static int img_amend(int argc, char **argv)
|
|||||||
|
|
||||||
/* In case the driver does not call amend_status_cb() */
|
/* In case the driver does not call amend_status_cb() */
|
||||||
qemu_progress_print(0.f, 0);
|
qemu_progress_print(0.f, 0);
|
||||||
ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL, &err);
|
ret = bdrv_amend_options(bs, opts, &amend_status_cb, NULL, force, &err);
|
||||||
qemu_progress_print(100.f, 0);
|
qemu_progress_print(100.f, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_report_err(err);
|
error_report_err(err);
|
||||||
|
Loading…
Reference in New Issue
Block a user