|
@@ -41,16 +41,20 @@ struct comm;
|
|
|
struct nodes;
|
|
|
struct node;
|
|
|
|
|
|
-static struct config_group *make_cluster(struct config_group *, const char *);
|
|
|
+static int make_cluster(struct config_group *, const char *,
|
|
|
+ struct config_group **);
|
|
|
static void drop_cluster(struct config_group *, struct config_item *);
|
|
|
static void release_cluster(struct config_item *);
|
|
|
-static struct config_group *make_space(struct config_group *, const char *);
|
|
|
+static int make_space(struct config_group *, const char *,
|
|
|
+ struct config_group **);
|
|
|
static void drop_space(struct config_group *, struct config_item *);
|
|
|
static void release_space(struct config_item *);
|
|
|
-static struct config_item *make_comm(struct config_group *, const char *);
|
|
|
+static int make_comm(struct config_group *, const char *,
|
|
|
+ struct config_item **);
|
|
|
static void drop_comm(struct config_group *, struct config_item *);
|
|
|
static void release_comm(struct config_item *);
|
|
|
-static struct config_item *make_node(struct config_group *, const char *);
|
|
|
+static int make_node(struct config_group *, const char *,
|
|
|
+ struct config_item **);
|
|
|
static void drop_node(struct config_group *, struct config_item *);
|
|
|
static void release_node(struct config_item *);
|
|
|
|
|
@@ -392,8 +396,8 @@ static struct node *to_node(struct config_item *i)
|
|
|
return i ? container_of(i, struct node, item) : NULL;
|
|
|
}
|
|
|
|
|
|
-static struct config_group *make_cluster(struct config_group *g,
|
|
|
- const char *name)
|
|
|
+static int make_cluster(struct config_group *g, const char *name,
|
|
|
+ struct config_group **new_g)
|
|
|
{
|
|
|
struct cluster *cl = NULL;
|
|
|
struct spaces *sps = NULL;
|
|
@@ -431,14 +435,15 @@ static struct config_group *make_cluster(struct config_group *g,
|
|
|
|
|
|
space_list = &sps->ss_group;
|
|
|
comm_list = &cms->cs_group;
|
|
|
- return &cl->group;
|
|
|
+ *new_g = &cl->group;
|
|
|
+ return 0;
|
|
|
|
|
|
fail:
|
|
|
kfree(cl);
|
|
|
kfree(gps);
|
|
|
kfree(sps);
|
|
|
kfree(cms);
|
|
|
- return NULL;
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
static void drop_cluster(struct config_group *g, struct config_item *i)
|
|
@@ -466,7 +471,8 @@ static void release_cluster(struct config_item *i)
|
|
|
kfree(cl);
|
|
|
}
|
|
|
|
|
|
-static struct config_group *make_space(struct config_group *g, const char *name)
|
|
|
+static int make_space(struct config_group *g, const char *name,
|
|
|
+ struct config_group **new_g)
|
|
|
{
|
|
|
struct space *sp = NULL;
|
|
|
struct nodes *nds = NULL;
|
|
@@ -489,13 +495,14 @@ static struct config_group *make_space(struct config_group *g, const char *name)
|
|
|
INIT_LIST_HEAD(&sp->members);
|
|
|
mutex_init(&sp->members_lock);
|
|
|
sp->members_count = 0;
|
|
|
- return &sp->group;
|
|
|
+ *new_g = &sp->group;
|
|
|
+ return 0;
|
|
|
|
|
|
fail:
|
|
|
kfree(sp);
|
|
|
kfree(gps);
|
|
|
kfree(nds);
|
|
|
- return NULL;
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
static void drop_space(struct config_group *g, struct config_item *i)
|
|
@@ -522,19 +529,21 @@ static void release_space(struct config_item *i)
|
|
|
kfree(sp);
|
|
|
}
|
|
|
|
|
|
-static struct config_item *make_comm(struct config_group *g, const char *name)
|
|
|
+static int make_comm(struct config_group *g, const char *name,
|
|
|
+ struct config_item **new_i)
|
|
|
{
|
|
|
struct comm *cm;
|
|
|
|
|
|
cm = kzalloc(sizeof(struct comm), GFP_KERNEL);
|
|
|
if (!cm)
|
|
|
- return NULL;
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
config_item_init_type_name(&cm->item, name, &comm_type);
|
|
|
cm->nodeid = -1;
|
|
|
cm->local = 0;
|
|
|
cm->addr_count = 0;
|
|
|
- return &cm->item;
|
|
|
+ *new_i = &cm->item;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void drop_comm(struct config_group *g, struct config_item *i)
|
|
@@ -554,14 +563,15 @@ static void release_comm(struct config_item *i)
|
|
|
kfree(cm);
|
|
|
}
|
|
|
|
|
|
-static struct config_item *make_node(struct config_group *g, const char *name)
|
|
|
+static int make_node(struct config_group *g, const char *name,
|
|
|
+ struct config_item **new_i)
|
|
|
{
|
|
|
struct space *sp = to_space(g->cg_item.ci_parent);
|
|
|
struct node *nd;
|
|
|
|
|
|
nd = kzalloc(sizeof(struct node), GFP_KERNEL);
|
|
|
if (!nd)
|
|
|
- return NULL;
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
config_item_init_type_name(&nd->item, name, &node_type);
|
|
|
nd->nodeid = -1;
|
|
@@ -573,7 +583,8 @@ static struct config_item *make_node(struct config_group *g, const char *name)
|
|
|
sp->members_count++;
|
|
|
mutex_unlock(&sp->members_lock);
|
|
|
|
|
|
- return &nd->item;
|
|
|
+ *new_i = &nd->item;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void drop_node(struct config_group *g, struct config_item *i)
|