From: Yu Yang <[email protected]>

Delete a working/snapshot VDI.

Signed-off-by: Yu Yang <[email protected]>
---
 lib/shared/sheepdog.h |   11 +++++++
 lib/shared/vdi.c      |   88 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 99 insertions(+)

diff --git a/lib/shared/sheepdog.h b/lib/shared/sheepdog.h
index 68b37b1..5abf4c2 100644
--- a/lib/shared/sheepdog.h
+++ b/lib/shared/sheepdog.h
@@ -162,4 +162,15 @@ int sd_vdi_create(struct sd_cluster *c, char *name, 
uint64_t size);
 int sd_vdi_clone(struct sd_cluster *c, char *srcname,
                 char *srctag, char *dstname);
 
+/*
+ * Delete a VDI in the cluster
+ *
+ * @c: pointer to the cluster descriptor
+ * @name: the name of the VDI to be deleted
+ * @tag: the snapshot tag of the VDI
+ *
+ * Return error code defined in sheepdog_proto.h
+ */
+int sd_vdi_delete(struct sd_cluster *c, char *name, char *tag);
+
 #endif
diff --git a/lib/shared/vdi.c b/lib/shared/vdi.c
index 27fb8d2..776c14b 100644
--- a/lib/shared/vdi.c
+++ b/lib/shared/vdi.c
@@ -480,3 +480,91 @@ out:
        free(inode);
        return ret;
 }
+
+#define NR_BATCHED_DISCARD 128 /* TODO: the value should be optional */
+
+int sd_vdi_delete(struct sd_cluster *c, char *name, char *tag)
+{
+       int ret;
+       struct sd_req hdr = {};
+       char data[SD_MAX_VDI_LEN + SD_MAX_VDI_TAG_LEN];
+       uint32_t vid;
+       struct sd_inode *inode = NULL;
+
+       if (!name || *name == '\0') {
+               ret = SD_RES_INVALID_PARMS;
+               fprintf(stderr, "VDI name can NOT be null\n");
+               goto out;
+       }
+
+       ret = find_vdi(c, name, tag, &vid);
+       if (ret != SD_RES_SUCCESS) {
+               fprintf(stderr, "Maybe VDI %s(tag: %s) does NOT exist: %s\n",
+                               name, tag, sd_strerror(ret));
+               goto out;
+       }
+
+       sd_init_req(&hdr, SD_OP_DELETE_CACHE);
+       hdr.obj.oid = vid_to_vdi_oid(vid);
+       ret = sd_run_sdreq(c, &hdr, NULL);
+       if (ret != SD_RES_SUCCESS) {
+               fprintf(stderr, "Failed to delete cache :%s\n",
+                               sd_strerror(ret));
+               goto out;
+       }
+
+       inode = xmalloc(sizeof(*inode));
+       ret = vdi_read_inode(c, name, tag, inode, false);
+       if (ret != SD_RES_SUCCESS) {
+               fprintf(stderr, "Failed to read inode : %s\n",
+                               sd_strerror(ret));
+               goto out;
+       }
+       int i = 0, nr_obj = count_data_objs(inode);
+       while (i < nr_obj) {
+               int start_idx, filled_idx;
+               while (i < nr_obj && !inode->data_vdi_id[i])
+                       ++i;
+
+               start_idx = i;
+               filled_idx = 0;
+               while (i < nr_obj && filled_idx < NR_BATCHED_DISCARD) {
+                       if (inode->data_vdi_id[i]) {
+                               inode->data_vdi_id[i] = 0;
+                               ++filled_idx;
+                       }
+
+                       ++i;
+               }
+
+               ret = write_object(c, vid_to_vdi_oid(vid), 0,
+                               &inode->data_vdi_id[start_idx],
+                               (i - start_idx) * sizeof(uint32_t),
+                               offsetof(struct sd_inode,
+                               data_vdi_id[start_idx]),
+                               0, inode->nr_copies, inode->copy_policy,
+                               false, true);
+               if (ret != SD_RES_SUCCESS) {
+                       fprintf(stderr,
+                                       "failed to update inode for 
discarding\n");
+                       goto out;
+               }
+       }
+
+       sd_init_req(&hdr, SD_OP_DEL_VDI);
+       hdr.flags = SD_FLAG_CMD_WRITE;
+       hdr.data_length = sizeof(data);
+       memset(data, 0, sizeof(data));
+       pstrcpy(data, SD_MAX_VDI_LEN, name);
+       if (tag)
+               pstrcpy(data + SD_MAX_VDI_LEN, SD_MAX_VDI_TAG_LEN, tag);
+
+       ret = sd_run_sdreq(c, &hdr, data);
+       if (ret != SD_RES_SUCCESS)
+               fprintf(stderr, "Failed to delete %s: %s\n",
+                               name, sd_strerror(ret));
+
+out:
+       free(inode);
+       return ret;
+}
-- 
1.7.9.5

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

Reply via email to