qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v7 08/10] block: Add checks of blocker in block oper


From: Fam Zheng
Subject: [Qemu-devel] [PATCH v7 08/10] block: Add checks of blocker in block operations
Date: Thu, 12 Dec 2013 16:23:44 +0800

Before operate on a BlockDriverState, respective types are checked
against bs->op_blockers and it will error out if there's a blocker.

Signed-off-by: Fam Zheng <address@hidden>
---
 block/snapshot.c | 11 +++++++++++
 blockdev.c       |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/block/snapshot.c b/block/snapshot.c
index 02cfb07..0dc8f40 100644
--- a/block/snapshot.c
+++ b/block/snapshot.c
@@ -164,6 +164,11 @@ int bdrv_snapshot_create(BlockDriverState *bs,
     if (!drv) {
         return -ENOMEDIUM;
     }
+
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)) {
+        return -EPERM;
+    }
+
     if (drv->bdrv_snapshot_create) {
         return drv->bdrv_snapshot_create(bs, sn_info);
     }
@@ -233,6 +238,12 @@ int bdrv_snapshot_delete(BlockDriverState *bs,
         error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, bdrv_get_device_name(bs));
         return -ENOMEDIUM;
     }
+
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT_DELETE,
+                           errp)) {
+        return -EPERM;
+    }
+
     if (!snapshot_id && !name) {
         error_setg(errp, "snapshot_id and name are both NULL");
         return -EINVAL;
diff --git a/blockdev.c b/blockdev.c
index 404159e..5e5d1b0 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -1536,6 +1536,10 @@ void qmp_change_blockdev(const char *device, const char 
*filename,
         return;
     }
 
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_CHANGE, errp)) {
+        return;
+    }
+
     if (format) {
         drv = bdrv_find_whitelisted_format(format, bs->read_only);
         if (!drv) {
@@ -1684,6 +1688,10 @@ void qmp_block_resize(const char *device, int64_t size, 
Error **errp)
         return;
     }
 
+    if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_RESIZE, errp)) {
+        return;
+    }
+
     if (size < 0) {
         error_set(errp, QERR_INVALID_PARAMETER_VALUE, "size", "a >0 size");
         return;
-- 
1.8.5.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]