Explicitly add vdi.type parameter in RELEASE_VDI request.

Signed-off-by: YAMADA Hideki <[email protected]>
---
 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

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

Reply via email to