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
