From: Wang Zhengyong <[email protected]>

Current sheepdog driver will send LOCK_VDI/RELEASE_VDI ops,
while start/stop QEMU VM with sheepdog protocol, this mechanism
will lead qemu-img/qemu-io report error when the sheepdog VDI is locking

To keep backward compatiblity, this patch modify the functionality
that make the vdi lock mechanism optional(with --lock opention),
default VDI lock is disabled

Enable VDI lock:
e.g. dog cluster format --lock

Cc: Hitoshi Mitake <[email protected]>
Signed-off-by: Wang Zhengyong <[email protected]>
Signed-off-by: Hitoshi Mitake <[email protected]>

Conflicts:
        dog/cluster.c
        include/internal_proto.h

Conflicts were resolved by Hitoshi Mitake.
Signed-off-by: Hitoshi Mitake <[email protected]>
---
 dog/cluster.c            |  9 ++++++++-
 include/internal_proto.h |  1 +
 sheep/ops.c              | 10 ++++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/dog/cluster.c b/dog/cluster.c
index e42bc54..ad61295 100644
--- a/dog/cluster.c
+++ b/dog/cluster.c
@@ -21,6 +21,7 @@ static struct sd_option cluster_options[] = {
        {'b', "store", true, "specify backend store"},
        {'c', "copies", true, "specify the default data redundancy (number of 
copies)"},
        {'f', "force", false, "do not prompt for confirmation"},
+       {'l', "lock", false, "Lock vdi to exclude multiple users"},
        {'m', "multithread", false,
         "use multi-thread for 'cluster snapshot save'"},
        {'t', "strict", false,
@@ -35,6 +36,7 @@ static struct cluster_cmd_data {
        bool force;
        bool strict;
        char name[STORE_LEN];
+       bool use_lock;
 } cluster_cmd_data;
 
 #define DEFAULT_STORE  "plain"
@@ -123,6 +125,8 @@ static int cluster_format(int argc, char **argv)
        hdr.flags |= SD_FLAG_CMD_WRITE;
        if (cluster_cmd_data.strict)
                hdr.cluster.flags |= SD_CLUSTER_FLAG_STRICT;
+       if (cluster_cmd_data.use_lock)
+               hdr.cluster.flags |= SD_CLUSTER_FLAG_USE_LOCK;
 
 #ifdef HAVE_DISKVNODES
        hdr.cluster.flags |= SD_CLUSTER_FLAG_DISKMODE;
@@ -752,7 +756,7 @@ failure:
 static struct subcommand cluster_cmd[] = {
        {"info", NULL, "aprhvT", "show cluster information",
         NULL, CMD_NEED_NODELIST, cluster_info, cluster_options},
-       {"format", NULL, "bctaphT", "create a Sheepdog store",
+       {"format", NULL, "bcltaphT", "create a Sheepdog store",
         NULL, CMD_NEED_NODELIST, cluster_format, cluster_options},
        {"shutdown", NULL, "aphT", "stop Sheepdog",
         NULL, 0, cluster_shutdown, cluster_options},
@@ -797,6 +801,9 @@ static int cluster_parser(int ch, const char *opt)
        case 'f':
                cluster_cmd_data.force = true;
                break;
+       case 'l':
+               cluster_cmd_data.use_lock = true;
+               break;
        case 'm':
                cluster_cmd_data.multithread = true;
        case 't':
diff --git a/include/internal_proto.h b/include/internal_proto.h
index 85f66b8..151f8cd 100644
--- a/include/internal_proto.h
+++ b/include/internal_proto.h
@@ -142,6 +142,7 @@
 
 #define SD_CLUSTER_FLAG_STRICT         0x0001 /* Strict mode for write */
 #define SD_CLUSTER_FLAG_DISKMODE       0x0002 /* Disk mode for cluster */
+#define SD_CLUSTER_FLAG_USE_LOCK       0x0008 /* Lock/Unlock vdi */
 
 enum sd_status {
        SD_STATUS_OK = 1,
diff --git a/sheep/ops.c b/sheep/ops.c
index b039c58..9e038f6 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -1344,6 +1344,11 @@ static int cluster_lock_vdi_main(const struct sd_req 
*req, struct sd_rsp *rsp,
                return SD_RES_SUCCESS;
        }
 
+       if (!(sys->cinfo.flags & SD_CLUSTER_FLAG_USE_LOCK)) {
+               sd_debug("vdi lock is disabled");
+               return SD_RES_SUCCESS;
+       }
+
        sd_info("node: %s is locking VDI (type: %s): %"PRIx32,
                node_to_str(sender),
                req->vdi.type == LOCK_TYPE_NORMAL ? "normal" : "shared", vid);
@@ -1368,6 +1373,11 @@ static int cluster_release_vdi_main(const struct sd_req 
*req,
                return SD_RES_SUCCESS;
        }
 
+       if (!(sys->cinfo.flags & SD_CLUSTER_FLAG_USE_LOCK)) {
+               sd_debug("vdi lock is disabled");
+               return SD_RES_SUCCESS;
+       }
+
        sd_info("node: %s is unlocking VDI (type: %s): %"PRIx32, 
node_to_str(sender),
                req->vdi.type == LOCK_TYPE_NORMAL ? "normal" : "shared", vid);
 
-- 
1.9.1

-- 
sheepdog mailing list
[email protected]
https://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to