From: levin li <[email protected]>

Signed-off-by: levin li <[email protected]>
---
 collie/vdi.c |   25 +++++++++++++++++++------
 sheep/ops.c  |    9 ++++++---
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/collie/vdi.c b/collie/vdi.c
index 5781e75..d8fe029 100644
--- a/collie/vdi.c
+++ b/collie/vdi.c
@@ -23,6 +23,7 @@ struct vdi_cmd_data {
        int exclusive;
        int delete;
        int prealloc;
+       int nr_copies;
        int cache;
 } vdi_cmd_data = { ~0, };
 
@@ -400,7 +401,7 @@ out:
 }
 
 static int do_vdi_create(char *vdiname, int64_t vdi_size, uint32_t base_vid,
-                        uint32_t *vdi_id, int snapshot)
+                        uint32_t *vdi_id, int snapshot, int nr_copies)
 {
        struct sd_req hdr;
        struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
@@ -426,6 +427,7 @@ static int do_vdi_create(char *vdiname, int64_t vdi_size, 
uint32_t base_vid,
        hdr.vdi.base_vdi_id = base_vid;
        hdr.vdi.snapid = snapshot;
        hdr.vdi.vdi_size = roundup(vdi_size, 512);
+       hdr.vdi.copies = nr_copies;
 
        ret = exec_req(fd, &hdr, buf, &wlen, &rlen);
 
@@ -470,7 +472,7 @@ static int vdi_create(int argc, char **argv)
                return EXIT_USAGE;
        }
 
-       ret = do_vdi_create(vdiname, size, 0, &vid, 0);
+       ret = do_vdi_create(vdiname, size, 0, &vid, 0, vdi_cmd_data.nr_copies);
        if (ret != EXIT_SUCCESS || !vdi_cmd_data.prealloc)
                goto out;
 
@@ -549,7 +551,8 @@ static int vdi_snapshot(int argc, char **argv)
                                      0, inode->nr_copies, 0);
        }
 
-       return do_vdi_create(vdiname, inode->vdi_size, vid, NULL, 1);
+       return do_vdi_create(vdiname, inode->vdi_size, vid, NULL, 1,
+                            inode->nr_copies);
 }
 
 static int vdi_clone(int argc, char **argv)
@@ -596,7 +599,8 @@ static int vdi_clone(int argc, char **argv)
                goto out;
        }
 
-       ret = do_vdi_create(dst_vdi, inode->vdi_size, base_vid, &new_vid, 0);
+       ret = do_vdi_create(dst_vdi, inode->vdi_size, base_vid, &new_vid, 0,
+                           vdi_cmd_data.nr_copies);
        if (ret != EXIT_SUCCESS || !vdi_cmd_data.prealloc)
                goto out;
 
@@ -1510,11 +1514,11 @@ out:
 static struct subcommand vdi_cmd[] = {
        {"check", "<vdiname>", "saph", "check and repair image's consistency",
         NULL, SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, vdi_check},
-       {"create", "<vdiname> <size>", "Paph", "create an image",
+       {"create", "<vdiname> <size>", "Pcaph", "create an image",
         NULL, SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, 
vdi_create},
        {"snapshot", "<vdiname>", "saph", "create a snapshot",
         NULL, SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, 
vdi_snapshot},
-       {"clone", "<src vdi> <dst vdi>", "sPaph", "clone an image",
+       {"clone", "<src vdi> <dst vdi>", "sPcaph", "clone an image",
         NULL, SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, vdi_clone},
        {"delete", "<vdiname>", "saph", "delete an image",
         NULL, SUBCMD_FLAG_NEED_NODELIST|SUBCMD_FLAG_NEED_THIRD_ARG, 
vdi_delete},
@@ -1546,6 +1550,7 @@ static struct subcommand vdi_cmd[] = {
 static int vdi_parser(int ch, char *opt)
 {
        char *p;
+       int nr_copies;
 
        switch (ch) {
        case 'P':
@@ -1575,6 +1580,14 @@ static int vdi_parser(int ch, char *opt)
        case 'C':
                vdi_cmd_data.cache = 1;
                break;
+       case 'c':
+               nr_copies = strtol(opt, &p, 10);
+               if (opt == p || nr_copies < 0 || nr_copies > SD_MAX_COPIES) {
+                       fprintf(stderr, "Invalid copies number, must be "
+                               "an integer between 0 and %d\n", SD_MAX_COPIES);
+                       exit(EXIT_FAILURE);
+               }
+               vdi_cmd_data.nr_copies = nr_copies;
        }
 
        return 0;
diff --git a/sheep/ops.c b/sheep/ops.c
index 1577706..8e8caa0 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -105,7 +105,7 @@ static int cluster_new_vdi(struct request *req)
 {
        const struct sd_req *hdr = &req->rq;
        struct sd_rsp *rsp = &req->rp;
-       uint32_t vid = 0, nr_copies = sys->nr_copies;
+       uint32_t vid = 0;
        struct vdi_iocb iocb;
        int ret;
 
@@ -114,12 +114,15 @@ static int cluster_new_vdi(struct request *req)
        iocb.size = hdr->vdi.vdi_size;
        iocb.base_vid = hdr->vdi.base_vdi_id;
        iocb.snapid = hdr->vdi.snapid;
-       iocb.nr_copies = sys->nr_copies;
+       iocb.nr_copies = hdr->vdi.copies;
+
+       if (!iocb.nr_copies)
+               iocb.nr_copies = sys->nr_copies;
 
        ret = add_vdi(&iocb, &vid);
 
        rsp->vdi.vdi_id = vid;
-       rsp->vdi.copies = nr_copies;
+       rsp->vdi.copies = iocb.nr_copies;
 
        return ret;
 }
-- 
1.7.1

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

Reply via email to