[Sheepdog] [PATCH 05/10] collie: support snapshot tag strig
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Tue Jan 26 05:34:51 CET 2010
fujita at rose:~/git/qemu-kvm$ qemu-img snapshot -c test3 sheepdog:linux
fujita at rose:~/git/qemu-kvm$ qemu-img snapshot -l sheepdog:linux
Snapshot list:
ID TAG VM SIZE DATE VMCLOCK
1 test1 0 2010-01-19 00:09:39 00:00:00.000
2 test2 0 2010-01-19 00:10:34 00:00:00.000
3 test3 0 2010-01-19 00:10:43 00:00:00.000
Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
collie/collie.h | 2 +-
collie/group.c | 2 +-
collie/store.c | 19 ++++++++++++++-----
3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/collie/collie.h b/collie/collie.h
index 05ee029..f25857a 100644
--- a/collie/collie.h
+++ b/collie/collie.h
@@ -76,7 +76,7 @@ int create_listen_port(int port, void *data);
int init_store(char *dir);
-int add_vdi(struct cluster_info *ci, char *name, int len, uint64_t size,
+int add_vdi(struct cluster_info *ci, char *buf, int len, uint64_t size,
uint64_t *added_oid, uint64_t base_oid, uint32_t tag, int copies,
uint16_t flags);
diff --git a/collie/group.c b/collie/group.c
index b58f60e..716f52c 100644
--- a/collie/group.c
+++ b/collie/group.c
@@ -364,7 +364,7 @@ static void vdi_op(struct cluster_info *ci, struct vdi_op_message *msg)
switch (hdr->opcode) {
case SD_OP_NEW_VDI:
- ret = add_vdi(ci, data, strlen(data), hdr->vdi_size, &oid,
+ ret = add_vdi(ci, data, hdr->data_length, hdr->vdi_size, &oid,
hdr->base_oid, hdr->tag, hdr->copies, hdr->flags);
break;
case SD_OP_LOCK_VDI:
diff --git a/collie/store.c b/collie/store.c
index 337ac7e..9cef425 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -631,9 +631,13 @@ static int so_read_vdis(struct request *req)
*p = '\0';
sde->oid = strtoull(vdent[i]->d_name, NULL, 16);
- if (p)
+ if (p) {
sde->id = strtoull(p + 1, NULL, 16);
- else {
+
+ p = strchr(p + 1, '-');
+ if (p)
+ strcpy(sde->tag, p + 1);
+ } else {
sde->id = 0;
sde->flags = FLAG_CURRENT;
}
@@ -708,6 +712,7 @@ static int so_lookup_vdi(struct request *req)
*p = '\0';
oid = strtoull(dent->d_name, NULL, 16);
rsp->oid = oid;
+
dprintf("%lx, %x\n", oid, hdr->tag);
ret = SD_RES_SUCCESS;
@@ -786,8 +791,8 @@ void so_queue_request(struct work *work, int idx)
goto out;
}
- strncpy(path + strlen(path), "/", 1);
- strncpy(path + strlen(path), (char *)req->data, hdr->data_length);
+ snprintf(path + strlen(path), sizeof(path) - strlen(path),
+ "/%s", (char *)req->data);
if (hdr->flags & SD_FLAG_CMD_SNAPSHOT) {
DIR *dir;
@@ -865,7 +870,11 @@ void so_queue_request(struct work *work, int idx)
close(fd);
if (hdr->flags & SD_FLAG_CMD_SNAPSHOT) {
- snprintf(path, sizeof(path), "%s-%04x", oldname, id);
+ if (hdr->data_length == SD_MAX_VDI_LEN * 2)
+ snprintf(path, sizeof(path), "%s-%04x-%s", oldname,
+ id, (char *)req->data + SD_MAX_VDI_LEN);
+ else
+ snprintf(path, sizeof(path), "%s-%04x", oldname, id);
ret = rename(oldname, path);
if (ret) {
eprintf("%s, %s, %m\n", oldname, path);
--
1.5.6.5
More information about the sheepdog
mailing list