[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