From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57079) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiQ0V-0006qG-Hj for qemu-devel@nongnu.org; Wed, 15 Apr 2015 12:17:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YiQ0U-0007KI-4h for qemu-devel@nongnu.org; Wed, 15 Apr 2015 12:17:43 -0400 Message-ID: <552E8F16.2000406@redhat.com> Date: Wed, 15 Apr 2015 18:17:26 +0200 From: Max Reitz MIME-Version: 1.0 References: <49410048030019e82e55fc6e6f5bd0dd793b9908.1428503789.git.berto@igalia.com> In-Reply-To: <49410048030019e82e55fc6e6f5bd0dd793b9908.1428503789.git.berto@igalia.com> Content-Type: text/plain; charset=iso-8859-15; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [Qemu-block] [PATCH 5/6] block: Add QMP support for streaming to an intermediate layer List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alberto Garcia , qemu-devel@nongnu.org Cc: Stefan Hajnoczi , qemu-block@nongnu.org On 08.04.2015 16:43, Alberto Garcia wrote: > This patch makes the 'device' paramater of the 'block-stream' command > allow a node name as well as a device name. s/allow/accept/ > In addition to that, operation blockers will be checked in all > intermediate nodes between the top and the base node. > > Signed-off-by: Alberto Garcia > --- > blockdev.c | 20 ++++++++++---------- > qapi/block-core.json | 10 +++++++--- > 2 files changed, 17 insertions(+), 13 deletions(-) > > diff --git a/blockdev.c b/blockdev.c > index dc5d931..f24cf2d 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -2104,8 +2104,7 @@ void qmp_block_stream(const char *device, > bool has_on_error, BlockdevOnError on_error, > Error **errp) > { > - BlockBackend *blk; > - BlockDriverState *bs; > + BlockDriverState *bs, *i; Hmmmm... ;-) Looks good otherwise. Max > BlockDriverState *base_bs = NULL; > AioContext *aio_context; > Error *local_err = NULL; > @@ -2115,20 +2114,14 @@ void qmp_block_stream(const char *device, > on_error = BLOCKDEV_ON_ERROR_REPORT; > } > > - blk = blk_by_name(device); > - if (!blk) { > - error_set(errp, QERR_DEVICE_NOT_FOUND, device); > + bs = bdrv_lookup_bs(device, device, errp); > + if (!bs) { > return; > } > - bs = blk_bs(blk); > > aio_context = bdrv_get_aio_context(bs); > aio_context_acquire(aio_context); > > - if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_STREAM, errp)) { > - goto out; > - } > - > if (has_base) { > base_bs = bdrv_find_backing_image(bs, base); > if (base_bs == NULL) { > @@ -2139,6 +2132,13 @@ void qmp_block_stream(const char *device, > base_name = base; > } > > + /* Check for op blockers in the whole chain between bs and base */ > + for (i = bs; i != NULL && i != base_bs; i = i->backing_hd) { > + if (bdrv_op_is_blocked(i, BLOCK_OP_TYPE_STREAM, errp)) { > + goto out; > + } > + } > + > /* if we are streaming the entire chain, the result will have no backing > * file, and specifying one is therefore an error */ > if (base_bs == NULL && has_backing_file) { > diff --git a/qapi/block-core.json b/qapi/block-core.json > index 3639454..60b9664 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -1014,6 +1014,10 @@ > # with query-block-jobs. The operation can be stopped before it has completed > # using the block-job-cancel command. > # > +# The node that receives the data is called the top image, can be located > +# in any part of the whole chain and can be specified using its device > +# or node name. > +# > # If a base file is specified then sectors are not copied from that base file and > # its backing chain. When streaming completes the image file will have the base > # file as its backing file. This can be used to stream a subset of the backing > @@ -1022,12 +1026,12 @@ > # On successful completion the image file is updated to drop the backing file > # and the BLOCK_JOB_COMPLETED event is emitted. > # > -# @device: the device name > +# @device: the device or node name of the top image > # > # @base: #optional the common backing file name > # > -# @backing-file: #optional The backing file string to write into the active > -# layer. This filename is not validated. > +# @backing-file: #optional The backing file string to write into the top > +# image. This filename is not validated. > # > # If a pathname string is such that it cannot be > # resolved by QEMU, that means that subsequent QMP or