[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 17/61] block: Add BlockDriver.bdrv_check_ext_snapshot
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 17/61] block: Add BlockDriver.bdrv_check_ext_snapshot. |
Date: |
Fri, 11 Oct 2013 17:05:07 +0200 |
From: BenoƮt Canet <address@hidden>
This field is used by blkverify to disable external snapshots creation.
It will also be used by block filters like quorum to disable external
snapshot creation.
Signed-off-by: Benoit Canet <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block.c | 19 +++++++++++++++++++
block/blkverify.c | 2 ++
blockdev.c | 5 +++++
include/block/block.h | 14 ++++++++++++++
include/block/block_int.h | 6 ++++++
5 files changed, 46 insertions(+)
diff --git a/block.c b/block.c
index d86efad..beea027 100644
--- a/block.c
+++ b/block.c
@@ -4647,3 +4647,22 @@ int bdrv_amend_options(BlockDriverState *bs,
QEMUOptionParameter *options)
}
return bs->drv->bdrv_amend_options(bs, options);
}
+
+ExtSnapshotPerm bdrv_check_ext_snapshot(BlockDriverState *bs)
+{
+ if (bs->drv->bdrv_check_ext_snapshot) {
+ return bs->drv->bdrv_check_ext_snapshot(bs);
+ }
+
+ if (bs->file && bs->file->drv && bs->file->drv->bdrv_check_ext_snapshot) {
+ return bs->file->drv->bdrv_check_ext_snapshot(bs);
+ }
+
+ /* external snapshots are allowed by default */
+ return EXT_SNAPSHOT_ALLOWED;
+}
+
+ExtSnapshotPerm bdrv_check_ext_snapshot_forbidden(BlockDriverState *bs)
+{
+ return EXT_SNAPSHOT_FORBIDDEN;
+}
diff --git a/block/blkverify.c b/block/blkverify.c
index bff95d2..1e8e6d9 100644
--- a/block/blkverify.c
+++ b/block/blkverify.c
@@ -417,6 +417,8 @@ static BlockDriver bdrv_blkverify = {
.bdrv_aio_readv = blkverify_aio_readv,
.bdrv_aio_writev = blkverify_aio_writev,
.bdrv_aio_flush = blkverify_aio_flush,
+
+ .bdrv_check_ext_snapshot = bdrv_check_ext_snapshot_forbidden,
};
static void bdrv_blkverify_init(void)
diff --git a/blockdev.c b/blockdev.c
index 8c83f6f..a91d5a8 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1131,6 +1131,11 @@ static void
external_snapshot_prepare(BlkTransactionState *common,
}
}
+ if (bdrv_check_ext_snapshot(state->old_bs) != EXT_SNAPSHOT_ALLOWED) {
+ error_set(errp, QERR_FEATURE_DISABLED, "snapshot");
+ return;
+ }
+
flags = state->old_bs->open_flags;
/* create new image w/backing file */
diff --git a/include/block/block.h b/include/block/block.h
index 0d4d5c3..3560deb 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -248,6 +248,20 @@ int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res,
BdrvCheckMode fix);
int bdrv_amend_options(BlockDriverState *bs_new, QEMUOptionParameter *options);
+/* external snapshots */
+
+typedef enum {
+ EXT_SNAPSHOT_ALLOWED,
+ EXT_SNAPSHOT_FORBIDDEN,
+} ExtSnapshotPerm;
+
+/* return EXT_SNAPSHOT_ALLOWED if external snapshot is allowed
+ * return EXT_SNAPSHOT_FORBIDDEN if external snapshot is forbidden
+ */
+ExtSnapshotPerm bdrv_check_ext_snapshot(BlockDriverState *bs);
+/* helper used to forbid external snapshots like in blkverify */
+ExtSnapshotPerm bdrv_check_ext_snapshot_forbidden(BlockDriverState *bs);
+
/* async block I/O */
typedef void BlockDriverDirtyHandler(BlockDriverState *bs, int64_t sector,
int sector_num);
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 17b26b2..a48731d 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -67,6 +67,12 @@ typedef struct BdrvTrackedRequest {
struct BlockDriver {
const char *format_name;
int instance_size;
+
+ /* if not defined external snapshots are allowed
+ * future block filters will query their children to build the response
+ */
+ ExtSnapshotPerm (*bdrv_check_ext_snapshot)(BlockDriverState *bs);
+
int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
int (*bdrv_probe_device)(const char *filename);
--
1.8.1.4
- [Qemu-devel] [PULL 06/61] block/qapi: Human-readable ImageInfoSpecific dump, (continued)
- [Qemu-devel] [PULL 06/61] block/qapi: Human-readable ImageInfoSpecific dump, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 07/61] qcow2: Add support for ImageInfoSpecific, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 09/61] qemu-iotests: Additional info from qemu-img info, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 10/61] qcow2: Alignment of snapshot table entries, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 08/61] qemu-iotests: Discard specific info in _img_info, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 11/61] qcow2: Use pread for inactive L1 in overlap check, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 12/61] qcow2: Free preallocated zero clusters, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 13/61] qcow2: Always use error path on writing snapshots, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 14/61] qcow2: Free allocated snapshot table on error, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 16/61] block/get_block_status: avoid redundant callouts on raw devices, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 17/61] block: Add BlockDriver.bdrv_check_ext_snapshot.,
Kevin Wolf <=
- [Qemu-devel] [PULL 15/61] qcow2: Assert against snapshot name/ID overflow, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 18/61] qemu-iotests: Discard preallocated zero clusters, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 19/61] ahci: set ahci mode on reset, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 21/61] qcow2: Add missing space in error message, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 20/61] block: qemu-iotests for vhdx, read sample dynamic image, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 22/61] qcow2: Remove wrong metadata overlap check, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 23/61] qcow2: Fix snapshot restoration in snapshot_create, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 24/61] qcow2: Use better type for numerical snapshot ID, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 25/61] block: Improve driver whitelist checks, Kevin Wolf, 2013/10/11
- [Qemu-devel] [PULL 26/61] qcow2: Use negated overflow check mask, Kevin Wolf, 2013/10/11