[sheepdog] [PATCH 1/6] sheep: use struct vdi_iocb to simplify the vdi_create api
levin li
levin108 at gmail.com
Mon Aug 6 07:59:54 CEST 2012
From: levin li <xingke.lwp at taobao.com>
Signed-off-by: levin li <xingke.lwp at taobao.com>
---
sheep/ops.c | 12 ++++++++--
sheep/sheep_priv.h | 12 +++++++++-
sheep/vdi.c | 57 +++++++++++++++++++++++++--------------------------
3 files changed, 47 insertions(+), 34 deletions(-)
diff --git a/sheep/ops.c b/sheep/ops.c
index 0cddf66..8793c8d 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -113,11 +113,17 @@ 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;
+ struct vdi_iocb iocb;
int ret;
- ret = add_vdi(req->data, hdr->data_length,
- hdr->vdi.vdi_size, &vid, hdr->vdi.base_vdi_id,
- hdr->vdi.snapid, &nr_copies);
+ iocb.data = req->data;
+ iocb.data_len = hdr->data_length;
+ 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;
+
+ ret = add_vdi(&iocb, &vid);
rsp->vdi.vdi_id = vid;
rsp->vdi.copies = nr_copies;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 857cf87..afd8c33 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -128,6 +128,15 @@ struct siocb {
uint64_t offset;
};
+struct vdi_iocb {
+ char *data;
+ int data_len;
+ uint64_t size;
+ uint32_t base_vid;
+ int is_snapshot;
+ int nr_copies;
+};
+
struct store_driver {
struct list_head list;
const char *name;
@@ -192,8 +201,7 @@ int init_store(const char *dir, int enable_write_cache);
int init_base_path(const char *dir);
int vdi_exist(uint32_t vid);
-int add_vdi(char *data, int data_len, uint64_t size, uint32_t *new_vid,
- uint32_t base_vid, int is_snapshot, unsigned int *nr_copies);
+int add_vdi(struct vdi_iocb *iocb, uint32_t *new_vid);
int del_vdi(struct request *req, char *data, int data_len, uint32_t *vid,
uint32_t snapid, unsigned int *nr_copies);
diff --git a/sheep/vdi.c b/sheep/vdi.c
index c9e070e..28611b8 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -44,15 +44,15 @@ out:
}
/* TODO: should be performed atomically */
-static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
- uint32_t base_vid, uint32_t cur_vid, uint32_t snapid,
- int is_snapshot)
+static int create_vdi_obj(struct vdi_iocb *iocb, uint32_t new_vid,
+ uint32_t cur_vid, uint32_t snapid)
{
/* we are not called concurrently */
struct sheepdog_inode *new = NULL, *base = NULL, *cur = NULL;
struct timeval tv;
int ret = SD_RES_NO_MEM;
unsigned long block_size = SD_DATA_OBJ_SIZE;
+ char *name = iocb->data;
new = zalloc(sizeof(*new));
if (!new) {
@@ -60,7 +60,7 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
goto out;
}
- if (base_vid) {
+ if (iocb->base_vid) {
base = zalloc(sizeof(*base));
if (!base) {
eprintf("failed to allocate memory\n");
@@ -68,7 +68,7 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
}
}
- if (is_snapshot && cur_vid != base_vid) {
+ if (iocb->is_snapshot && cur_vid != iocb->base_vid) {
cur = zalloc(SD_INODE_HEADER_SIZE);
if (!cur) {
eprintf("failed to allocate memory\n");
@@ -76,8 +76,8 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
}
}
- if (base_vid) {
- ret = read_object(vid_to_vdi_oid(base_vid), (char *)base,
+ if (iocb->base_vid) {
+ ret = read_object(vid_to_vdi_oid(iocb->base_vid), (char *)base,
sizeof(*base), 0);
if (ret != SD_RES_SUCCESS) {
ret = SD_RES_BASE_VDI_READ;
@@ -87,10 +87,10 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
gettimeofday(&tv, NULL);
- if (is_snapshot) {
- if (cur_vid != base_vid) {
+ if (iocb->is_snapshot) {
+ if (cur_vid != iocb->base_vid) {
vprintf(SDOG_INFO, "tree snapshot %s %" PRIx32 " %" PRIx32 "\n",
- name, cur_vid, base_vid);
+ name, cur_vid, iocb->base_vid);
ret = read_object(vid_to_vdi_oid(cur_vid), (char *)cur,
SD_INODE_HEADER_SIZE, 0);
@@ -108,16 +108,16 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
strncpy(new->name, name, sizeof(new->name));
new->vdi_id = new_vid;
new->ctime = (uint64_t) tv.tv_sec << 32 | tv.tv_usec * 1000;
- new->vdi_size = size;
+ new->vdi_size = iocb->size;
new->copy_policy = 0;
- new->nr_copies = sys->nr_copies;
+ new->nr_copies = iocb->nr_copies;
new->block_size_shift = find_next_bit(&block_size, BITS_PER_LONG, 0);
- new->snap_id = snapid;
+ new->snap_id = iocb->is_snapshot;
- if (base_vid) {
+ if (iocb->base_vid) {
int i;
- new->parent_vdi_id = base_vid;
+ new->parent_vdi_id = iocb->base_vid;
memcpy(new->data_vdi_id, base->data_vdi_id, sizeof(new->data_vdi_id));
for (i = 0; i < ARRAY_SIZE(base->child_vdi_id); i++) {
@@ -133,7 +133,7 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
}
}
- if (is_snapshot && cur_vid != base_vid) {
+ if (iocb->is_snapshot && cur_vid != iocb->base_vid) {
ret = write_object(vid_to_vdi_oid(cur_vid), (char *)cur,
SD_INODE_HEADER_SIZE, 0, 0, 0);
if (ret != 0) {
@@ -143,8 +143,8 @@ static int create_vdi_obj(char *name, uint32_t new_vid, uint64_t size,
}
}
- if (base_vid) {
- ret = write_object(vid_to_vdi_oid(base_vid), (char *)base,
+ if (iocb->base_vid) {
+ ret = write_object(vid_to_vdi_oid(iocb->base_vid), (char *)base,
SD_INODE_HEADER_SIZE, 0, 0, 0);
if (ret != 0) {
vprintf(SDOG_ERR, "failed\n");
@@ -280,25 +280,25 @@ int lookup_vdi(char *name, char *tag, uint32_t *vid, uint32_t snapid,
ctime);
}
-int add_vdi(char *data, int data_len, uint64_t size, uint32_t *new_vid,
- uint32_t base_vid, int is_snapshot, unsigned int *nr_copies)
+int add_vdi(struct vdi_iocb *iocb, uint32_t *new_vid)
{
uint32_t cur_vid = 0;
uint32_t next_snapid;
unsigned long nr, deleted_nr = SD_NR_VDIS, right_nr = SD_NR_VDIS;
+ unsigned int dummy;
int ret;
char *name;
- if (data_len != SD_MAX_VDI_LEN)
+ if (iocb->data_len != SD_MAX_VDI_LEN)
return SD_RES_INVALID_PARMS;
- name = data;
+ name = iocb->data;
ret = do_lookup_vdi(name, strlen(name), &cur_vid,
NULL, 0, &next_snapid, &right_nr, &deleted_nr,
- nr_copies, NULL);
+ &dummy, NULL);
- if (is_snapshot) {
+ if (iocb->is_snapshot) {
if (ret != SD_RES_SUCCESS) {
if (ret == SD_RES_NO_VDI)
vprintf(SDOG_CRIT, "VDI %s does not exist\n", name);
@@ -324,12 +324,11 @@ int add_vdi(char *data, int data_len, uint64_t size, uint32_t *new_vid,
*new_vid = nr;
vprintf(SDOG_INFO, "creating new %s %s: size %" PRIu64 ", vid %"
- PRIx32 ", base %" PRIx32 ", cur %" PRIx32 "\n",
- is_snapshot ? "snapshot" : "vdi", name, size, *new_vid,
- base_vid, cur_vid);
+ PRIx32 ", base %" PRIx32 ", cur %" PRIx32 ", copies %d\n",
+ iocb->is_snapshot ? "snapshot" : "vdi", name, iocb->size,
+ *new_vid, iocb->base_vid, cur_vid, iocb->nr_copies);
- return create_vdi_obj(name, *new_vid, size, base_vid,
- cur_vid, next_snapid, is_snapshot);
+ return create_vdi_obj(iocb, *new_vid, cur_vid, next_snapid);
}
static int start_deletion(struct request *req, uint32_t vid);
--
1.7.1
More information about the sheepdog
mailing list