From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=48007 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1ODyC6-0000Ho-Ow for qemu-devel@nongnu.org; Mon, 17 May 2010 07:09:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1ODyC4-0004xL-72 for qemu-devel@nongnu.org; Mon, 17 May 2010 07:09:10 -0400 Received: from mx1.redhat.com ([209.132.183.28]:11831) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1ODyC3-0004wx-HP for qemu-devel@nongnu.org; Mon, 17 May 2010 07:09:08 -0400 Message-ID: <4BF12398.2040203@redhat.com> Date: Mon, 17 May 2010 13:08:08 +0200 From: Kevin Wolf MIME-Version: 1.0 Subject: Re: [Qemu-devel] [RFC PATCH v3 2/3] block: call the snapshot handlers of the protocol drivers References: <1273830676-2349-1-git-send-email-morita.kazutaka@lab.ntt.co.jp> <1274091589-19991-3-git-send-email-morita.kazutaka@lab.ntt.co.jp> In-Reply-To: <1274091589-19991-3-git-send-email-morita.kazutaka@lab.ntt.co.jp> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: MORITA Kazutaka Cc: aliguori@us.ibm.com, sheepdog@lists.wpkg.org, kvm@vger.kernel.org, qemu-devel@nongnu.org, fujita.tomonori@lab.ntt.co.jp, avi@redhat.com, hch@lst.de Am 17.05.2010 12:19, schrieb MORITA Kazutaka: > When snapshot handlers are not defined in the format driver, it is > better to call the ones of the protocol driver. This enables us to > implement snapshot support in the protocol driver. > > We need to call bdrv_close() and bdrv_open() handlers of the format > driver before and after bdrv_snapshot_goto() call of the protocol. It is > because the contents of the block driver state may need to be changed > after loading vmstate. > > Signed-off-by: MORITA Kazutaka > --- > block.c | 61 +++++++++++++++++++++++++++++++++++++++++++------------------ > 1 files changed, 43 insertions(+), 18 deletions(-) > > diff --git a/block.c b/block.c > index f3bf3f2..c987e57 100644 > --- a/block.c > +++ b/block.c > @@ -1683,9 +1683,11 @@ int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf, > BlockDriver *drv = bs->drv; > if (!drv) > return -ENOMEDIUM; > - if (!drv->bdrv_save_vmstate) > - return -ENOTSUP; > - return drv->bdrv_save_vmstate(bs, buf, pos, size); > + if (drv->bdrv_save_vmstate) > + return drv->bdrv_save_vmstate(bs, buf, pos, size); > + if (bs->file) > + return bdrv_save_vmstate(bs->file, buf, pos, size); > + return -ENOTSUP; > } > > int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, > @@ -1694,9 +1696,11 @@ int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf, > BlockDriver *drv = bs->drv; > if (!drv) > return -ENOMEDIUM; > - if (!drv->bdrv_load_vmstate) > - return -ENOTSUP; > - return drv->bdrv_load_vmstate(bs, buf, pos, size); > + if (drv->bdrv_load_vmstate) > + return drv->bdrv_load_vmstate(bs, buf, pos, size); > + if (bs->file) > + return bdrv_load_vmstate(bs->file, buf, pos, size); > + return -ENOTSUP; > } > > void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event) > @@ -1720,20 +1724,37 @@ int bdrv_snapshot_create(BlockDriverState *bs, > BlockDriver *drv = bs->drv; > if (!drv) > return -ENOMEDIUM; > - if (!drv->bdrv_snapshot_create) > - return -ENOTSUP; > - return drv->bdrv_snapshot_create(bs, sn_info); > + if (drv->bdrv_snapshot_create) > + return drv->bdrv_snapshot_create(bs, sn_info); > + if (bs->file) > + return bdrv_snapshot_create(bs->file, sn_info); > + return -ENOTSUP; > } > > int bdrv_snapshot_goto(BlockDriverState *bs, > const char *snapshot_id) > { > BlockDriver *drv = bs->drv; > + int ret, open_ret; > + > if (!drv) > return -ENOMEDIUM; > - if (!drv->bdrv_snapshot_goto) > - return -ENOTSUP; > - return drv->bdrv_snapshot_goto(bs, snapshot_id); > + if (drv->bdrv_snapshot_goto) > + return drv->bdrv_snapshot_goto(bs, snapshot_id); > + > + if (bs->file) { > + drv->bdrv_close(bs); > + ret = bdrv_snapshot_goto(bs->file, snapshot_id); > + open_ret = drv->bdrv_open(bs, bs->open_flags); > + if (open_ret < 0) { > + bdrv_delete(bs); I think you mean bs->file here. Kevin > + bs->drv = NULL; > + return open_ret; > + } > + return ret; > + } > + > + return -ENOTSUP; > } > > int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)