[sheepdog] [PATCH] dog/vdi: enable to unlock a vdi locked by tgtd

YAMADA Hideki yamada.hideki at lab.ntt.co.jp
Wed Nov 26 09:45:15 CET 2014


Explicitly add vdi.type parameter in RELEASE_VDI request.

Signed-off-by: YAMADA Hideki <yamada.hideki at lab.ntt.co.jp>
---
 dog/vdi.c |   43 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dog/vdi.c b/dog/vdi.c
index c541706..8bb0501 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -2888,22 +2888,55 @@ static int lock_unlock(int argc, char **argv)
 	struct sd_req hdr;
 	const char *vdiname = argv[optind];
 	struct vdi_tree *vdi;
+	struct vdi_state *vs = NULL;
+	int ret = EXIT_SYSFAIL, vs_count = 0;
+	uint32_t type;
 
 	init_tree();
 	if (parse_vdi(construct_vdi_tree, SD_INODE_HEADER_SIZE,
 			NULL, true) < 0)
-		return EXIT_SYSFAIL;
+		goto out;
 
 	vdi = find_vdi_from_root_by_name(vdiname);
 	if (!vdi) {
 		sd_err("VDI: %s not found", vdiname);
-		return EXIT_SYSFAIL;
+		goto out;
 	}
 
-	sd_init_req(&hdr, SD_OP_RELEASE_VDI);
-	hdr.vdi.base_vdi_id = vdi->vid;
+	vs = get_vdi_state(&vs_count);
+	if (!vs)
+		goto out;
+
+	for (int i = 0; i < vs_count; i++) {
+		if (vs[i].vid != vdi->vid) 
+			continue;
 
-	return dog_exec_req(&sd_nid, &hdr, NULL);
+		switch (vs[i].lock_state) {
+		case LOCK_STATE_UNLOCKED:
+			sd_err("VDI: %s is not locked", vdiname);
+			goto out;
+		case LOCK_STATE_LOCKED:
+			type = LOCK_TYPE_NORMAL;
+			break;
+		case LOCK_STATE_SHARED:
+			type = LOCK_TYPE_SHARED;
+			break;
+		default:
+			sd_err("VDI: %s unknown lock state", vdiname);
+			goto out;
+		}
+
+		sd_init_req(&hdr, SD_OP_RELEASE_VDI);
+		hdr.vdi.base_vdi_id = vdi->vid;
+		hdr.vdi.type = type;
+		ret = dog_exec_req(&sd_nid, &hdr, NULL);
+		goto out;
+	}
+
+out:
+	if (vs)
+		free(vs);
+	return ret;
 }
 
 static struct subcommand vdi_lock_cmd[] = {
-- 
1.7.1




More information about the sheepdog mailing list