This reverts commit 00ecfb24ee46f281a197ef1fc853d1941999dcdd. --- dog/dog.h | 3 +- dog/farm/farm.c | 2 +- dog/vdi.c | 104 ++++++++--------------------------------------- include/sheepdog_proto.h | 2 - sheep/ops.c | 1 - sheep/sheep_priv.h | 1 - sheep/vdi.c | 27 +----------- 7 files changed, 21 insertions(+), 119 deletions(-)
diff --git a/dog/dog.h b/dog/dog.h index 37355e5..bcf0e6e 100644 --- a/dog/dog.h +++ b/dog/dog.h @@ -88,8 +88,7 @@ void work_queue_wait(struct work_queue *q); int do_vdi_create(const char *vdiname, int64_t vdi_size, uint32_t base_vid, uint32_t *vdi_id, bool snapshot, uint8_t nr_copies, uint8_t copy_policy, - uint8_t store_policy, uint8_t block_size_shift, - bool cut_relation); + uint8_t store_policy, uint8_t block_size_shift); int do_vdi_check(const struct sd_inode *inode); void show_progress(uint64_t done, uint64_t total, bool raw); size_t get_store_objsize(uint8_t copy_policy, uint8_t block_size_shift, diff --git a/dog/farm/farm.c b/dog/farm/farm.c index e2b07ad..55bc274 100644 --- a/dog/farm/farm.c +++ b/dog/farm/farm.c @@ -134,7 +134,7 @@ static int create_active_vdis(void) false, vdi->nr_copies, vdi->copy_policy, vdi->store_policy, - vdi->block_size_shift, false) < 0) + vdi->block_size_shift) < 0) return -1; } return 0; diff --git a/dog/vdi.c b/dog/vdi.c index 2097871..8e612af 100644 --- a/dog/vdi.c +++ b/dog/vdi.c @@ -405,8 +405,7 @@ int read_vdi_obj(const char *vdiname, int snapid, const char *tag, int do_vdi_create(const char *vdiname, int64_t vdi_size, uint32_t base_vid, uint32_t *vdi_id, bool snapshot, uint8_t nr_copies, uint8_t copy_policy, - uint8_t store_policy, uint8_t block_size_shift, - bool cut_relation) + uint8_t store_policy, uint8_t block_size_shift) { struct sd_req hdr; struct sd_rsp *rsp = (struct sd_rsp *)&hdr; @@ -427,7 +426,6 @@ int do_vdi_create(const char *vdiname, int64_t vdi_size, hdr.vdi.copy_policy = copy_policy; hdr.vdi.store_policy = store_policy; hdr.vdi.block_size_shift = block_size_shift; - hdr.vdi.cut_relation = cut_relation ? 1 : 0; ret = dog_exec_req(&sd_nid, &hdr, buf); if (ret < 0) @@ -517,7 +515,7 @@ static int vdi_create(int argc, char **argv) ret = do_vdi_create(vdiname, size, 0, &vid, false, vdi_cmd_data.nr_copies, vdi_cmd_data.copy_policy, vdi_cmd_data.store_policy, - vdi_cmd_data.block_size_shift, false); + vdi_cmd_data.block_size_shift); if (ret != EXIT_SUCCESS || !vdi_cmd_data.prealloc) goto out; @@ -612,16 +610,14 @@ static int vdi_snapshot(int argc, char **argv) const char *vdiname = argv[optind++]; uint32_t vid, new_vid; int ret; - struct sd_inode *inode, *new_inode; + char buf[SD_INODE_HEADER_SIZE]; + struct sd_inode *inode = (struct sd_inode *)buf; struct sd_req hdr; struct vdi_state *vs = NULL; int vs_count = 0; struct node_id owners[SD_MAX_COPIES]; int nr_owners = 0, nr_issued_prevent_inode_update = 0; bool fail_if_snapshot = false; - uint32_t object_size; - char *data_obj_buf = NULL; - uint32_t idx, max_idx; if (vdi_cmd_data.snapshot_id != 0) { sd_err("Please specify a non-integer value for " @@ -643,11 +639,9 @@ static int vdi_snapshot(int argc, char **argv) return EXIT_FAILURE; } - inode = xzalloc(sizeof(*inode)); - if (fail_if_snapshot) { - ret = dog_read_object(vid_to_vdi_oid(vid), inode, sizeof(*inode), 0, - true); + ret = dog_read_object(vid_to_vdi_oid(vid), inode, + SD_INODE_HEADER_SIZE, 0, true); if (ret != EXIT_SUCCESS) return ret; @@ -659,7 +653,8 @@ static int vdi_snapshot(int argc, char **argv) return EXIT_FAILURE; } } else { - ret = read_vdi_obj(vdiname, 0, "", &vid, inode, sizeof(*inode)); + ret = read_vdi_obj(vdiname, 0, "", &vid, inode, + SD_INODE_HEADER_SIZE); if (ret != EXIT_SUCCESS) return ret; } @@ -717,80 +712,16 @@ static int vdi_snapshot(int argc, char **argv) if (ret != SD_RES_SUCCESS) goto out; - ret = do_vdi_create(vdiname, inode->vdi_size, - vid, &new_vid, true, + ret = do_vdi_create(vdiname, inode->vdi_size, vid, &new_vid, true, inode->nr_copies, inode->copy_policy, - inode->store_policy, inode->block_size_shift, - vdi_cmd_data.no_share); - if (!vdi_cmd_data.no_share) { - if (ret == EXIT_SUCCESS) - goto print_result; - else - goto out; - } - - new_inode = xmalloc(sizeof(*inode)); - ret = read_vdi_obj(vdiname, 0, "", &new_vid, new_inode, - SD_INODE_HEADER_SIZE); - if (ret != EXIT_SUCCESS) - goto out; - - /* - * Clients (QEMU, tgtd) cannot find the new working VDI because - * COW requests are prevented by SD_OP_PREVENT_INODE_UPDATE. - * So we don't have to worry about that clients see working VDI with - * inconsistent data_vdi_id. - */ - object_size = (UINT32_C(1) << inode->block_size_shift); - data_obj_buf = xzalloc(object_size); - max_idx = count_data_objs(inode); - - for (idx = 0; idx < max_idx; idx++) { - uint32_t vdi_id; - uint64_t oid; - - vdi_show_progress(idx * object_size, inode->vdi_size); - - vdi_id = sd_inode_get_vid(inode, idx); - if (!vdi_id) - continue; + inode->store_policy, inode->block_size_shift); - oid = vid_to_data_oid(vdi_id, idx); - ret = dog_read_object(oid, data_obj_buf, object_size, 0, - true); - if (ret) { - ret = EXIT_FAILURE; - goto out; - } - - oid = vid_to_data_oid(new_vid, idx); - ret = dog_write_object(oid, 0, data_obj_buf, object_size, 0, 0, - inode->nr_copies, - inode->copy_policy, true, true); - if (ret != SD_RES_SUCCESS) { - ret = EXIT_FAILURE; - goto out; - } - - sd_inode_set_vid(new_inode, idx, new_vid); - ret = sd_inode_write_vid(new_inode, idx, new_vid, new_vid, 0, - false, true); - if (ret) { - ret = EXIT_FAILURE; - goto out; - } - } - - vdi_show_progress(idx * object_size, inode->vdi_size); - -print_result: - if (verbose) { + if (ret == EXIT_SUCCESS && verbose) { if (raw_output) printf("%x %x\n", new_vid, vid); else printf("new VID of original VDI: %x," - " VDI ID of newly created snapshot:" - " %x\n", new_vid, vid); + " VDI ID of newly created snapshot: %x\n", new_vid, vid); } out: @@ -842,7 +773,7 @@ static int vdi_clone(int argc, char **argv) object_size = (UINT32_C(1) << inode->block_size_shift); ret = do_vdi_create(dst_vdi, inode->vdi_size, base_vid, &new_vid, false, inode->nr_copies, inode->copy_policy, - inode->store_policy, inode->block_size_shift, false); + inode->store_policy, inode->block_size_shift); if (ret != EXIT_SUCCESS || (!vdi_cmd_data.prealloc && !vdi_cmd_data.no_share)) goto out; @@ -1100,7 +1031,7 @@ static int vdi_rollback(int argc, char **argv) ret = do_vdi_create(vdiname, inode->vdi_size, base_vid, &new_vid, false, vdi_cmd_data.nr_copies, inode->copy_policy, - inode->store_policy, inode->block_size_shift, false); + inode->store_policy, inode->block_size_shift); if (ret == EXIT_SUCCESS && verbose) { if (raw_output) @@ -2478,7 +2409,7 @@ static uint32_t do_restore(const char *vdiname, int snapid, const char *tag) ret = do_vdi_create(vdiname, inode->vdi_size, inode->vdi_id, &vid, false, inode->nr_copies, inode->copy_policy, - inode->store_policy, inode->block_size_shift, false); + inode->store_policy, inode->block_size_shift); if (ret != EXIT_SUCCESS) { sd_err("Failed to read VDI"); goto out; @@ -2592,8 +2523,7 @@ out: true, current_inode->nr_copies, current_inode->copy_policy, current_inode->store_policy, - current_inode->block_size_shift, - false); + current_inode->block_size_shift); if (recovery_ret != EXIT_SUCCESS) { sd_err("failed to resume the current vdi"); ret = recovery_ret; @@ -3127,7 +3057,7 @@ static struct subcommand vdi_cmd[] = { {"create", "<vdiname> <size>", "PycaphrvzT", "create an image", NULL, CMD_NEED_NODELIST|CMD_NEED_ARG, vdi_create, vdi_options}, - {"snapshot", "<vdiname>", "saphrvTn", "create a snapshot", + {"snapshot", "<vdiname>", "saphrvT", "create a snapshot", NULL, CMD_NEED_ARG, vdi_snapshot, vdi_options}, {"clone", "<src vdi> <dst vdi>", "sPnaphrvT", "clone an image", diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h index 16b6b35..0599ece 100644 --- a/include/sheepdog_proto.h +++ b/include/sheepdog_proto.h @@ -166,8 +166,6 @@ struct sd_req { uint8_t block_size_shift; uint32_t snapid; uint32_t type; - uint8_t cut_relation; - uint8_t __pad[3]; } vdi; /* sheepdog-internal */ diff --git a/sheep/ops.c b/sheep/ops.c index 9af72d1..b6ce84f 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -95,7 +95,6 @@ static int cluster_new_vdi(struct request *req) .nr_copies = hdr->vdi.copies, .block_size_shift = hdr->vdi.block_size_shift, .time = (uint64_t) tv.tv_sec << 32 | tv.tv_usec * 1000, - .cut_relation = !!hdr->vdi.cut_relation, }; /* Client doesn't specify redundancy scheme (copy = 0) */ diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index a867874..46d0ba9 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -223,7 +223,6 @@ struct vdi_iocb { uint8_t nr_copies; uint8_t block_size_shift; uint64_t time; - bool cut_relation; }; /* This structure is used to get information from sheepdog. */ diff --git a/sheep/vdi.c b/sheep/vdi.c index bb7fa6a..8114fb5 100644 --- a/sheep/vdi.c +++ b/sheep/vdi.c @@ -1404,10 +1404,7 @@ static int fill_vdi_info_range(uint32_t left, uint32_t right, ret = SD_RES_NO_MEM; goto out; } - for (i = right - 1; i && i >= left; i--) { - if (!test_bit(i, sys->vdi_inuse)) - continue; - + for (i = right - 1; i >= left; i--) { ret = sd_read_object(vid_to_vdi_oid(i), (char *)inode, SD_INODE_HEADER_SIZE, 0); if (ret != SD_RES_SUCCESS) @@ -1477,25 +1474,6 @@ int vdi_lookup(const struct vdi_iocb *iocb, struct vdi_info *info) sd_debug("%s left %lx right %lx, %x", iocb->name, left, right, ret); switch (ret) { case SD_RES_NO_VDI: - /* - * handle a case like this: - * dog vdi create A - * dog vdi snapshot A --no-share - * dog vdi delete A -s 1 - * try to find vdi A - * - * In this case, the above get_vdi_bitmap_range() cannot find - * bitmap range for vdi A, because original VID is already - * freed (newly working vdi A shares nothing with the snapshot - * because it is created with --no-share). - * - * Of course, the below fill_vdi_info() can take long time. But - * another case (SD_RES_SUCCESS) can also have similar cost. - * - * TODO: for checking before creation, the below fill_vdi_info() - * isn't required. It must be eliminated. - */ - return fill_vdi_info(0, SD_NR_VDIS, iocb, info); case SD_RES_FULL_VDI: return ret; case SD_RES_SUCCESS: @@ -1613,8 +1591,7 @@ int vdi_snapshot(const struct vdi_iocb *iocb, uint32_t *new_vid) assert(info.snapid > 0); *new_vid = info.free_bit; - ret = notify_vdi_add(*new_vid, iocb->nr_copies, - iocb->cut_relation ? 0 : info.vid, + ret = notify_vdi_add(*new_vid, iocb->nr_copies, info.vid, iocb->copy_policy, iocb->block_size_shift); if (ret != SD_RES_SUCCESS) return ret; -- 1.9.1 -- sheepdog mailing list sheepdog@lists.wpkg.org https://lists.wpkg.org/mailman/listinfo/sheepdog