mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-30 06:50:57 +00:00
qemu-io: Add command 'reopen'
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
ff7cfd7d92
commit
5bbd2e595e
@ -1979,6 +1979,95 @@ static const cmdinfo_t map_cmd = {
|
|||||||
.oneline = "prints the allocated areas of a file",
|
.oneline = "prints the allocated areas of a file",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void reopen_help(void)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"\n"
|
||||||
|
" Changes the open options of an already opened image\n"
|
||||||
|
"\n"
|
||||||
|
" Example:\n"
|
||||||
|
" 'reopen -o lazy-refcounts=on' - activates lazy refcount writeback on a qcow2 image\n"
|
||||||
|
"\n"
|
||||||
|
" -r, -- Reopen the image read-only\n"
|
||||||
|
" -c, -- Change the cache mode to the given value\n"
|
||||||
|
" -o, -- Changes block driver options (cf. 'open' command)\n"
|
||||||
|
"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static int reopen_f(BlockBackend *blk, int argc, char **argv);
|
||||||
|
|
||||||
|
static QemuOptsList reopen_opts = {
|
||||||
|
.name = "reopen",
|
||||||
|
.merge_lists = true,
|
||||||
|
.head = QTAILQ_HEAD_INITIALIZER(reopen_opts.head),
|
||||||
|
.desc = {
|
||||||
|
/* no elements => accept any params */
|
||||||
|
{ /* end of list */ }
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const cmdinfo_t reopen_cmd = {
|
||||||
|
.name = "reopen",
|
||||||
|
.argmin = 0,
|
||||||
|
.argmax = -1,
|
||||||
|
.cfunc = reopen_f,
|
||||||
|
.args = "[-r] [-c cache] [-o options]",
|
||||||
|
.oneline = "reopens an image with new options",
|
||||||
|
.help = reopen_help,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int reopen_f(BlockBackend *blk, int argc, char **argv)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs = blk_bs(blk);
|
||||||
|
QemuOpts *qopts;
|
||||||
|
QDict *opts;
|
||||||
|
int c;
|
||||||
|
int flags = bs->open_flags;
|
||||||
|
|
||||||
|
BlockReopenQueue *brq;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "c:o:r")) != -1) {
|
||||||
|
switch (c) {
|
||||||
|
case 'c':
|
||||||
|
if (bdrv_parse_cache_flags(optarg, &flags) < 0) {
|
||||||
|
error_report("Invalid cache option: %s", optarg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
if (!qemu_opts_parse_noisily(&reopen_opts, optarg, 0)) {
|
||||||
|
qemu_opts_reset(&reopen_opts);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
flags &= ~BDRV_O_RDWR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qemu_opts_reset(&reopen_opts);
|
||||||
|
return qemuio_command_usage(&reopen_cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (optind != argc) {
|
||||||
|
qemu_opts_reset(&reopen_opts);
|
||||||
|
return qemuio_command_usage(&reopen_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
qopts = qemu_opts_find(&reopen_opts, NULL);
|
||||||
|
opts = qopts ? qemu_opts_to_qdict(qopts, NULL) : NULL;
|
||||||
|
qemu_opts_reset(&reopen_opts);
|
||||||
|
|
||||||
|
brq = bdrv_reopen_queue(NULL, bs, opts, flags);
|
||||||
|
bdrv_reopen_multiple(brq, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_report_err(local_err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int break_f(BlockBackend *blk, int argc, char **argv)
|
static int break_f(BlockBackend *blk, int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -2266,6 +2355,7 @@ static void __attribute((constructor)) init_qemuio_commands(void)
|
|||||||
qemuio_add_command(&discard_cmd);
|
qemuio_add_command(&discard_cmd);
|
||||||
qemuio_add_command(&alloc_cmd);
|
qemuio_add_command(&alloc_cmd);
|
||||||
qemuio_add_command(&map_cmd);
|
qemuio_add_command(&map_cmd);
|
||||||
|
qemuio_add_command(&reopen_cmd);
|
||||||
qemuio_add_command(&break_cmd);
|
qemuio_add_command(&break_cmd);
|
||||||
qemuio_add_command(&remove_break_cmd);
|
qemuio_add_command(&remove_break_cmd);
|
||||||
qemuio_add_command(&resume_cmd);
|
qemuio_add_command(&resume_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user