From: levin li <xingke....@taobao.com>
Signed-off-by: levin li <xingke....@taobao.com> --- collie/vdi.c | 27 ++++++++++++++++++++------- sheep/ops.c | 9 ++++++--- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/collie/vdi.c b/collie/vdi.c index e4f4f65..4c793c9 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; } vdi_cmd_data = { ~0, }; struct get_vdi_info { @@ -399,7 +400,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; @@ -425,6 +426,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); @@ -469,7 +471,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; @@ -548,7 +550,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, + vdi_cmd_data.nr_copies); } static int vdi_clone(int argc, char **argv) @@ -595,7 +598,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; @@ -1479,11 +1483,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", + {"snapshot", "<vdiname>", "scaph", "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}, @@ -1513,6 +1517,7 @@ static struct subcommand vdi_cmd[] = { static int vdi_parser(int ch, char *opt) { char *p; + int nr_copies; switch (ch) { case 'P': @@ -1539,6 +1544,14 @@ static int vdi_parser(int ch, char *opt) case 'd': vdi_cmd_data.delete = 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 8793c8d..062a7b4 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -112,7 +112,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; @@ -121,12 +121,15 @@ static int cluster_new_vdi(struct request *req) iocb.size = hdr->vdi.vdi_size; iocb.base_vid = hdr->vdi.base_vdi_id; iocb.is_snapshot = hdr->vdi.snapid; - iocb.nr_copies = sys->nr_copies; + iocb.nr_copies = hdr->vdi.copies; + + if (!iocb.nr_copies) + iocb.nr_copies = SD_DEFAULT_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 sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog