[sheepdog] [PATCH] sheep: clean vdi_state when formatting cluster

Kai Zhang kyle at zelin.io
Mon May 13 09:04:43 CEST 2013


Signed-off-by: Kai Zhang <kyle at zelin.io>
---
 sheep/ops.c        |    1 +
 sheep/sheep_priv.h |    1 +
 sheep/vdi.c        |   17 +++++++++++++++++
 3 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/sheep/ops.c b/sheep/ops.c
index 26bd84c..e40fc65 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -286,6 +286,7 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp,
 		remove_epoch(i);
 
 	memset(sys->vdi_inuse, 0, sizeof(sys->vdi_inuse));
+	clean_vdi_state();
 
 	sys->epoch = 1;
 
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 5596215..ab2636a 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -266,6 +266,7 @@ int vdi_exist(uint32_t vid);
 int vdi_create(struct vdi_iocb *iocb, uint32_t *new_vid);
 int vdi_delete(struct vdi_iocb *iocb, struct request *req);
 int vdi_lookup(struct vdi_iocb *iocb, struct vdi_info *info);
+void clean_vdi_state(void);
 
 int read_vdis(char *data, int len, unsigned int *rsp_len);
 
diff --git a/sheep/vdi.c b/sheep/vdi.c
index 7e67ff1..4c515fd 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -933,3 +933,20 @@ int get_vdi_attr(struct sheepdog_vdi_attr *vattr, int data_len,
 out:
 	return ret;
 }
+
+void clean_vdi_state(void)
+{
+	struct rb_node *current_node = rb_first(&vdi_state_root);
+	struct vdi_state_entry *entry = NULL;
+
+	pthread_rwlock_rdlock(&vdi_state_lock);
+	while(current_node) {
+		entry = rb_entry(current_node, struct vdi_state_entry, node);
+		rb_erase(current_node, &vdi_state_root);
+		free(entry);
+		entry = NULL;
+		current_node = rb_first(&vdi_state_root);
+	}
+	INIT_RB_ROOT(&vdi_state_root);
+	pthread_rwlock_unlock(&vdi_state_lock);
+}
-- 
1.7.1




More information about the sheepdog mailing list