From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 23/27] block: call the snapshot handlers of the protocol drivers
Date: Fri, 4 Jun 2010 18:33:11 +0200 [thread overview]
Message-ID: <1275669195-28312-24-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1275669195-28312-1-git-send-email-kwolf@redhat.com>
From: MORITA Kazutaka <morita.kazutaka@lab.ntt.co.jp>
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 <morita.kazutaka@lab.ntt.co.jp>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 61 +++++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 43 insertions(+), 18 deletions(-)
diff --git a/block.c b/block.c
index b1ef85c..cacf11b 100644
--- a/block.c
+++ b/block.c
@@ -1631,9 +1631,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,
@@ -1642,9 +1644,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)
@@ -1668,20 +1672,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->file);
+ bs->drv = NULL;
+ return open_ret;
+ }
+ return ret;
+ }
+
+ return -ENOTSUP;
}
int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
@@ -1689,9 +1710,11 @@ int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
BlockDriver *drv = bs->drv;
if (!drv)
return -ENOMEDIUM;
- if (!drv->bdrv_snapshot_delete)
- return -ENOTSUP;
- return drv->bdrv_snapshot_delete(bs, snapshot_id);
+ if (drv->bdrv_snapshot_delete)
+ return drv->bdrv_snapshot_delete(bs, snapshot_id);
+ if (bs->file)
+ return bdrv_snapshot_delete(bs->file, snapshot_id);
+ return -ENOTSUP;
}
int bdrv_snapshot_list(BlockDriverState *bs,
@@ -1700,9 +1723,11 @@ int bdrv_snapshot_list(BlockDriverState *bs,
BlockDriver *drv = bs->drv;
if (!drv)
return -ENOMEDIUM;
- if (!drv->bdrv_snapshot_list)
- return -ENOTSUP;
- return drv->bdrv_snapshot_list(bs, psn_info);
+ if (drv->bdrv_snapshot_list)
+ return drv->bdrv_snapshot_list(bs, psn_info);
+ if (bs->file)
+ return bdrv_snapshot_list(bs->file, psn_info);
+ return -ENOTSUP;
}
#define NB_SUFFIXES 4
--
1.6.6.1
next prev parent reply other threads:[~2010-06-04 17:37 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-04 16:32 [Qemu-devel] [PULL 00/27] Block patches Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 01/27] Cleanup: bdrv_open() no need to shift total_size just to shift back Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 02/27] Cleanup: Be consistent and use BDRV_SECTOR_SIZE instead of 512 Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 03/27] Cleanup: raw-posix.c: Be more consistent using " Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 04/27] Cleanup: virtio-blk.c: Be more consistent using BDRV_SECTOR_SIZE instead Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 05/27] qemu-io: Fix error messages Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 06/27] blockdev: Belatedly remove MAX_DRIVES Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 07/27] blockdev: Belatedly remove driveopts Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 08/27] usb: Remove unused usb_device_add() parameter is_hotplug Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 09/27] ide: Remove useless IDEDeviceInfo members unit, drive Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 10/27] ide: Remove redundant IDEState member conf Kevin Wolf
2010-06-04 16:32 ` [Qemu-devel] [PATCH 11/27] ide: Split ide_init1() off ide_init2() Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 12/27] ide: Change ide_init_drive() to require valid dinfo argument Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 13/27] ide: Split non-qdev code off ide_init2() Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 14/27] qdev: New qdev_prop_set_string() Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 15/27] qdev: Don't leak string property value on hot unplug Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 16/27] ide: Turn drive serial into a qdev property ide-drive.serial Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 17/27] ide: Fix info qtree for ide-drive.ver Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 18/27] scsi: Turn drive serial into a qdev property scsi-disk.serial Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 19/27] scsi: Fix info qtree for scsi-disk.ver Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 20/27] Fix error message in drive_init Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 21/27] block: Assume raw for drives without media Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 22/27] close all the block drivers before the qemu process exits Kevin Wolf
2010-06-04 16:33 ` Kevin Wolf [this message]
2010-06-04 16:33 ` [Qemu-devel] [PATCH 24/27] blockdev: Hide QEMUMachine from drive_init() Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 25/27] qdev: Move declaration of qdev_init_bdrv() into qdev.h Kevin Wolf
2010-06-04 16:33 ` [Qemu-devel] [PATCH 26/27] blockdev: Collect block device code in new blockdev.c Kevin Wolf
2010-12-15 15:04 ` Artyom Tarasenko
2010-12-15 15:31 ` Kevin Wolf
2012-05-17 9:15 ` Artyom Tarasenko
2010-06-04 16:33 ` [Qemu-devel] [PATCH 27/27] block: Fix serial number assignment Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1275669195-28312-24-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).