From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5SQX-0007l6-Hd for qemu-devel@nongnu.org; Mon, 20 Jan 2014 22:55:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W5SQS-0003Wr-E7 for qemu-devel@nongnu.org; Mon, 20 Jan 2014 22:55:01 -0500 Received: from mx1.redhat.com ([209.132.183.28]:18262) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5SQS-0003Wn-5M for qemu-devel@nongnu.org; Mon, 20 Jan 2014 22:54:56 -0500 Date: Tue, 21 Jan 2014 11:54:53 +0800 From: Fam Zheng Message-ID: <20140121035453.GJ29842@T430.redhat.com> References: <1386862440-8003-1-git-send-email-benoit@irqsave.net> <1386862440-8003-8-git-send-email-benoit@irqsave.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <1386862440-8003-8-git-send-email-benoit@irqsave.net> Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH V5 7/7] qmp: Allow to take external snapshots on bs graphs node. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?iso-8859-1?Q?Beno=EEt?= Canet Cc: kwolf@redhat.com, jcody@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, armbru@redhat.com On Thu, 12/12 16:34, Beno=EEt Canet wrote: > Signed-off-by: Benoit Canet > --- > blockdev.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++= ------- > hmp.c | 4 +++- > qapi-schema.json | 13 ++++++++++--- > qmp-commands.hx | 11 ++++++++++- > 4 files changed, 71 insertions(+), 12 deletions(-) >=20 > diff --git a/blockdev.c b/blockdev.c > index 374d03d..1246544 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -940,14 +940,22 @@ static void blockdev_do_action(int kind, void *da= ta, Error **errp) > qmp_transaction(&list, errp); > } > =20 > -void qmp_blockdev_snapshot_sync(const char *device, const char *snapsh= ot_file, > +void qmp_blockdev_snapshot_sync(bool has_device, const char *device, > + bool has_node_name, const char *node_n= ame, > + const char *snapshot_file, > + bool has_snapshot_node_name, > + const char *snapshot_node_name, > bool has_format, const char *format, > - bool has_mode, enum NewImageMode mode, > - Error **errp) > + bool has_mode, NewImageMode mode, Erro= r **errp) > { > BlockdevSnapshot snapshot =3D { > + .has_device =3D has_device, > .device =3D (char *) device, > + .has_node_name =3D has_node_name, > + .node_name =3D (char *) node_name, > .snapshot_file =3D (char *) snapshot_file, > + .has_snapshot_node_name =3D has_snapshot_node_name, > + .snapshot_node_name =3D (char *) snapshot_node_name, > .has_format =3D has_format, > .format =3D (char *) format, > .has_mode =3D has_mode, > @@ -1185,8 +1193,14 @@ static void external_snapshot_prepare(BlkTransac= tionState *common, > { > BlockDriver *drv; > int flags, ret; > + QDict *options =3D NULL; > Error *local_err =3D NULL; > + bool has_device =3D false; > const char *device; > + bool has_node_name =3D false; > + const char *node_name; > + bool has_snapshot_node_name =3D false; > + const char *snapshot_node_name; > const char *new_image_file; > const char *format =3D "qcow2"; > enum NewImageMode mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; > @@ -1197,7 +1211,14 @@ static void external_snapshot_prepare(BlkTransac= tionState *common, > /* get parameters */ > g_assert(action->kind =3D=3D TRANSACTION_ACTION_KIND_BLOCKDEV_SNAP= SHOT_SYNC); > =20 > + has_device =3D action->blockdev_snapshot_sync->has_device; > device =3D action->blockdev_snapshot_sync->device; > + has_node_name =3D action->blockdev_snapshot_sync->has_node_name; > + node_name =3D action->blockdev_snapshot_sync->node_name; > + has_snapshot_node_name =3D > + action->blockdev_snapshot_sync->has_snapshot_node_name; > + snapshot_node_name =3D action->blockdev_snapshot_sync->snapshot_no= de_name; > + > new_image_file =3D action->blockdev_snapshot_sync->snapshot_file; > if (action->blockdev_snapshot_sync->has_format) { > format =3D action->blockdev_snapshot_sync->format; > @@ -1213,9 +1234,21 @@ static void external_snapshot_prepare(BlkTransac= tionState *common, > return; > } > =20 > - state->old_bs =3D bdrv_find(device); > - if (!state->old_bs) { > - error_set(errp, QERR_DEVICE_NOT_FOUND, device); > + state->old_bs =3D bdrv_lookup_bs(has_device, device, > + has_node_name, node_name, > + &local_err); > + if (error_is_set(&local_err)) { > + error_propagate(errp, local_err); > + return; > + } > + > + if (has_node_name && !has_snapshot_node_name) { > + error_setg(errp, "New snapshot node name missing"); > + return; > + } > + > + if (has_snapshot_node_name && bdrv_find_node(snapshot_node_name)) = { > + error_setg(errp, "New snapshot node name already existing"); > return; > } > =20 > @@ -1255,15 +1288,23 @@ static void external_snapshot_prepare(BlkTransa= ctionState *common, > } > } > =20 > + if (has_snapshot_node_name) { > + options =3D qdict_new(); > + qdict_put(options, "node-name", > + qstring_from_str(snapshot_node_name)); > + } > + > /* We will manually add the backing_hd field to the bs later */ > state->new_bs =3D bdrv_new(""); > /* TODO Inherit bs->options or only take explicit options with an > * extended QMP command? */ > - ret =3D bdrv_open(state->new_bs, new_image_file, NULL, > + ret =3D bdrv_open(state->new_bs, new_image_file, options, > flags | BDRV_O_NO_BACKING, drv, &local_err); > if (ret !=3D 0) { > error_propagate(errp, local_err); > } > + > + QDECREF(options); > } > =20 > static void external_snapshot_commit(BlkTransactionState *common) > diff --git a/hmp.c b/hmp.c > index 906ddb7..47dcf0c 100644 > --- a/hmp.c > +++ b/hmp.c > @@ -971,7 +971,9 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict = *qdict) > } > =20 > mode =3D reuse ? NEW_IMAGE_MODE_EXISTING : NEW_IMAGE_MODE_ABSOLUTE= _PATHS; > - qmp_blockdev_snapshot_sync(device, filename, !!format, format, > + qmp_blockdev_snapshot_sync(true, device, false, NULL, > + filename, false, NULL, > + !!format, format, > true, mode, &errp); > hmp_handle_error(mon, &errp); > } > diff --git a/qapi-schema.json b/qapi-schema.json > index 3977619..d7afb69 100644 > --- a/qapi-schema.json > +++ b/qapi-schema.json > @@ -1759,18 +1759,25 @@ > ## > # @BlockdevSnapshot > # > -# @device: the name of the device to generate the snapshot from. > +# Either @device or @node-name must be set but not both. > +# > +# @device: #optional the name of the device to generate the snapshot f= rom. > +# > +# @node-name: #optional graph node name to generate the snapshot from = (Since 2.0) > # > # @snapshot-file: the target of the new image. A new file will be crea= ted. > # > +# @snapshot-node-name: #optional the graph node name of the new image = (Since 2.0) > +# > # @format: #optional the format of the snapshot image, default is 'qco= w2'. > # > # @mode: #optional whether and how QEMU should create a new image, def= ault is > # 'absolute-paths'. > ## > { 'type': 'BlockdevSnapshot', > - 'data': { 'device': 'str', 'snapshot-file': 'str', '*format': 'str', > - '*mode': 'NewImageMode' } } > + 'data': { '*device': 'str', '*node-name': 'str', > + 'snapshot-file': 'str', '*snapshot-node-name': 'str', > + '*format': 'str', '*mode': 'NewImageMode' } } > =20 > ## > # @BlockdevSnapshotInternal > diff --git a/qmp-commands.hx b/qmp-commands.hx > index 5696b08..b62b0f5 100644 > --- a/qmp-commands.hx > +++ b/qmp-commands.hx > @@ -1038,7 +1038,9 @@ actions array: > - "data": a dictionary. The contents depend on the value > of "type". When "type" is "blockdev-snapshot-sync": > - "device": device name to snapshot (json-string) > + - "node-name": graph node name to snapshot (json-string) > - "snapshot-file": name of new image file (json-string) > + - "snapshot-node-name": graph node name of the new snapshot (jso= n-string) > - "format": format of new image (json-string, optional) > - "mode": whether and how QEMU should create the snapshot file > (NewImageMode, optional, default "absolute-paths") > @@ -1053,6 +1055,11 @@ Example: > { 'type': 'blockdev-snapshot-sync', 'data' : { "device": "ide= -hd0", > "snapshot-file": "/some/place= /my-image", > "format": "qcow2" } }, > + { 'type': 'blockdev-snapshot-sync', 'data' : { "node-name": "= myfile", > + "snapshot-file": "/some/place= /my-image2", > + "snapshot-node-name": "node34= 32", > + "mode": "existing", > + "format": "qcow2" } }, > { 'type': 'blockdev-snapshot-sync', 'data' : { "device": "ide= -hd1", > "snapshot-file": "/some/place= /my-image2", > "mode": "existing", > @@ -1066,7 +1073,7 @@ EQMP > =20 > { > .name =3D "blockdev-snapshot-sync", > - .args_type =3D "device:B,snapshot-file:s,format:s?,mode:s?", > + .args_type =3D "device:s?,node-name:s?,snapshot-file:s,snapsh= ot-node-name:s?,format:s?,mode:s?", > .mhandler.cmd_new =3D qmp_marshal_input_blockdev_snapshot_sync= , > }, > =20 > @@ -1083,7 +1090,9 @@ snapshot image, default is qcow2. > Arguments: > =20 > - "device": device name to snapshot (json-string) > +- "node-name": graph node name to snapshot (json-string) > - "snapshot-file": name of new image file (json-string) > +- "snapshot-node-name": graph node name of the new snapshot (json-stri= ng) > - "mode": whether and how QEMU should create the snapshot file > (NewImageMode, optional, default "absolute-paths") > - "format": format of new image (json-string, optional) > --=20 > 1.8.3.2 >=20 >=20 Reviewed-by: Fam Zheng