[sheepdog] [PATCH 3/5] shared lib: add VDI operation: clone

Yu Yang yuyanggg at gmail.com
Thu Jun 4 14:31:47 CEST 2015


From: Yu Yang <yuyang at cmss.chinamobile.com>

Clone a new VDI from a given snapshot VDI.

Signed-off-by: Yu Yang <yuyang at cmss.chinamobile.com>
---
 lib/shared/sheepdog.h |   14 ++++++++++++++
 lib/shared/vdi.c      |   38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)

diff --git a/lib/shared/sheepdog.h b/lib/shared/sheepdog.h
index f49ecdd..68b37b1 100644
--- a/lib/shared/sheepdog.h
+++ b/lib/shared/sheepdog.h
@@ -148,4 +148,18 @@ int sd_vdi_snapshot(struct sd_cluster *c, char *name, char *tag);
  */
 int sd_vdi_create(struct sd_cluster *c, char *name, uint64_t size);
 
+/*
+ * Clone a new VDI from a snapshot
+ *
+ * @c: pointer to the cluster descriptor
+ * @srcname: the source VDI name
+ * @srctag: the source VDI tag
+ * @dstname: the destination VDI name
+ *
+ * Return error code defined in sheepdog_proto.h.
+ * Only snapshot VDI can be cloned.
+ */
+int sd_vdi_clone(struct sd_cluster *c, char *srcname,
+		 char *srctag, char *dstname);
+
 #endif
diff --git a/lib/shared/vdi.c b/lib/shared/vdi.c
index 064d04d..27fb8d2 100644
--- a/lib/shared/vdi.c
+++ b/lib/shared/vdi.c
@@ -442,3 +442,41 @@ int sd_vdi_create(struct sd_cluster *c, char *name, uint64_t size)
 
 	return ret;
 }
+
+int sd_vdi_clone(struct sd_cluster *c, char *srcname,
+		char *srctag, char *dstname)
+{
+	int ret;
+	struct sd_inode *inode = NULL;
+
+	if (!srcname || *srcname == '\0') {
+		ret = SD_RES_INVALID_PARMS;
+		fprintf(stderr, "VDI name can NOT  be null\n");
+		goto out;
+	}
+	if (!dstname || *dstname == '\0') {
+		ret = SD_RES_INVALID_PARMS;
+		fprintf(stderr, "Destination VDI name can NOT  be null\n");
+		goto out;
+	}
+	if (!srctag || *srctag == '\0') {
+		ret = SD_RES_INVALID_PARMS;
+		fprintf(stderr, "Snapshot tag can NOT be null when clone\n");
+		goto out;
+	}
+
+	inode = xmalloc(sizeof(struct sd_inode));
+	ret = vdi_read_inode(c, srcname, srctag, inode, false);
+	if (ret != SD_RES_SUCCESS)
+		goto out;
+
+	ret = do_vdi_create(c, dstname, inode->vdi_size, inode->vdi_id, false,
+			   inode->nr_copies, inode->copy_policy,
+			   inode->store_policy, inode->block_size_shift);
+	if (ret != SD_RES_SUCCESS)
+		fprintf(stderr, "Clone VDI failed: %s\n", sd_strerror(ret));
+
+out:
+	free(inode);
+	return ret;
+}
-- 
1.7.9.5



More information about the sheepdog mailing list