You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'configfs-fixup-ptr-error' of git://oss.oracle.com/git/jlbec/linux-2.6
* 'configfs-fixup-ptr-error' of git://oss.oracle.com/git/jlbec/linux-2.6: configfs: Allow ->make_item() and ->make_group() to return detailed errors. Revert "configfs: Allow ->make_item() and ->make_group() to return detailed errors."
This commit is contained in:
+17
-11
@@ -1027,9 +1027,10 @@ EXPORT_SYMBOL(configfs_undepend_item);
|
||||
|
||||
static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
||||
{
|
||||
int ret, module_got = 0;
|
||||
struct config_group *group;
|
||||
struct config_item *item;
|
||||
int ret = 0;
|
||||
int module_got = 0;
|
||||
struct config_group *group = NULL;
|
||||
struct config_item *item = NULL;
|
||||
struct config_item *parent_item;
|
||||
struct configfs_subsystem *subsys;
|
||||
struct configfs_dirent *sd;
|
||||
@@ -1070,25 +1071,30 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
||||
snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name);
|
||||
|
||||
mutex_lock(&subsys->su_mutex);
|
||||
group = NULL;
|
||||
item = NULL;
|
||||
if (type->ct_group_ops->make_group) {
|
||||
ret = type->ct_group_ops->make_group(to_config_group(parent_item), name, &group);
|
||||
if (!ret) {
|
||||
group = type->ct_group_ops->make_group(to_config_group(parent_item), name);
|
||||
if (!group)
|
||||
group = ERR_PTR(-ENOMEM);
|
||||
if (!IS_ERR(group)) {
|
||||
link_group(to_config_group(parent_item), group);
|
||||
item = &group->cg_item;
|
||||
}
|
||||
} else
|
||||
ret = PTR_ERR(group);
|
||||
} else {
|
||||
ret = type->ct_group_ops->make_item(to_config_group(parent_item), name, &item);
|
||||
if (!ret)
|
||||
item = type->ct_group_ops->make_item(to_config_group(parent_item), name);
|
||||
if (!item)
|
||||
item = ERR_PTR(-ENOMEM);
|
||||
if (!IS_ERR(item))
|
||||
link_obj(parent_item, item);
|
||||
else
|
||||
ret = PTR_ERR(item);
|
||||
}
|
||||
mutex_unlock(&subsys->su_mutex);
|
||||
|
||||
kfree(name);
|
||||
if (ret) {
|
||||
/*
|
||||
* If ret != 0, then link_obj() was never called.
|
||||
* If item == NULL, then link_obj() was never called.
|
||||
* There are no extra references to clean up.
|
||||
*/
|
||||
goto out_put;
|
||||
|
||||
+17
-28
@@ -41,20 +41,16 @@ struct comm;
|
||||
struct nodes;
|
||||
struct node;
|
||||
|
||||
static int make_cluster(struct config_group *, const char *,
|
||||
struct config_group **);
|
||||
static struct config_group *make_cluster(struct config_group *, const char *);
|
||||
static void drop_cluster(struct config_group *, struct config_item *);
|
||||
static void release_cluster(struct config_item *);
|
||||
static int make_space(struct config_group *, const char *,
|
||||
struct config_group **);
|
||||
static struct config_group *make_space(struct config_group *, const char *);
|
||||
static void drop_space(struct config_group *, struct config_item *);
|
||||
static void release_space(struct config_item *);
|
||||
static int make_comm(struct config_group *, const char *,
|
||||
struct config_item **);
|
||||
static struct config_item *make_comm(struct config_group *, const char *);
|
||||
static void drop_comm(struct config_group *, struct config_item *);
|
||||
static void release_comm(struct config_item *);
|
||||
static int make_node(struct config_group *, const char *,
|
||||
struct config_item **);
|
||||
static struct config_item *make_node(struct config_group *, const char *);
|
||||
static void drop_node(struct config_group *, struct config_item *);
|
||||
static void release_node(struct config_item *);
|
||||
|
||||
@@ -396,8 +392,8 @@ static struct node *to_node(struct config_item *i)
|
||||
return i ? container_of(i, struct node, item) : NULL;
|
||||
}
|
||||
|
||||
static int make_cluster(struct config_group *g, const char *name,
|
||||
struct config_group **new_g)
|
||||
static struct config_group *make_cluster(struct config_group *g,
|
||||
const char *name)
|
||||
{
|
||||
struct cluster *cl = NULL;
|
||||
struct spaces *sps = NULL;
|
||||
@@ -435,15 +431,14 @@ static int make_cluster(struct config_group *g, const char *name,
|
||||
|
||||
space_list = &sps->ss_group;
|
||||
comm_list = &cms->cs_group;
|
||||
*new_g = &cl->group;
|
||||
return 0;
|
||||
return &cl->group;
|
||||
|
||||
fail:
|
||||
kfree(cl);
|
||||
kfree(gps);
|
||||
kfree(sps);
|
||||
kfree(cms);
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
static void drop_cluster(struct config_group *g, struct config_item *i)
|
||||
@@ -471,8 +466,7 @@ static void release_cluster(struct config_item *i)
|
||||
kfree(cl);
|
||||
}
|
||||
|
||||
static int make_space(struct config_group *g, const char *name,
|
||||
struct config_group **new_g)
|
||||
static struct config_group *make_space(struct config_group *g, const char *name)
|
||||
{
|
||||
struct space *sp = NULL;
|
||||
struct nodes *nds = NULL;
|
||||
@@ -495,14 +489,13 @@ static int make_space(struct config_group *g, const char *name,
|
||||
INIT_LIST_HEAD(&sp->members);
|
||||
mutex_init(&sp->members_lock);
|
||||
sp->members_count = 0;
|
||||
*new_g = &sp->group;
|
||||
return 0;
|
||||
return &sp->group;
|
||||
|
||||
fail:
|
||||
kfree(sp);
|
||||
kfree(gps);
|
||||
kfree(nds);
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
static void drop_space(struct config_group *g, struct config_item *i)
|
||||
@@ -529,21 +522,19 @@ static void release_space(struct config_item *i)
|
||||
kfree(sp);
|
||||
}
|
||||
|
||||
static int make_comm(struct config_group *g, const char *name,
|
||||
struct config_item **new_i)
|
||||
static struct config_item *make_comm(struct config_group *g, const char *name)
|
||||
{
|
||||
struct comm *cm;
|
||||
|
||||
cm = kzalloc(sizeof(struct comm), GFP_KERNEL);
|
||||
if (!cm)
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
config_item_init_type_name(&cm->item, name, &comm_type);
|
||||
cm->nodeid = -1;
|
||||
cm->local = 0;
|
||||
cm->addr_count = 0;
|
||||
*new_i = &cm->item;
|
||||
return 0;
|
||||
return &cm->item;
|
||||
}
|
||||
|
||||
static void drop_comm(struct config_group *g, struct config_item *i)
|
||||
@@ -563,15 +554,14 @@ static void release_comm(struct config_item *i)
|
||||
kfree(cm);
|
||||
}
|
||||
|
||||
static int make_node(struct config_group *g, const char *name,
|
||||
struct config_item **new_i)
|
||||
static struct config_item *make_node(struct config_group *g, const char *name)
|
||||
{
|
||||
struct space *sp = to_space(g->cg_item.ci_parent);
|
||||
struct node *nd;
|
||||
|
||||
nd = kzalloc(sizeof(struct node), GFP_KERNEL);
|
||||
if (!nd)
|
||||
return -ENOMEM;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
config_item_init_type_name(&nd->item, name, &node_type);
|
||||
nd->nodeid = -1;
|
||||
@@ -583,8 +573,7 @@ static int make_node(struct config_group *g, const char *name,
|
||||
sp->members_count++;
|
||||
mutex_unlock(&sp->members_lock);
|
||||
|
||||
*new_i = &nd->item;
|
||||
return 0;
|
||||
return &nd->item;
|
||||
}
|
||||
|
||||
static void drop_node(struct config_group *g, struct config_item *i)
|
||||
|
||||
@@ -1489,31 +1489,22 @@ static struct o2hb_heartbeat_group *to_o2hb_heartbeat_group(struct config_group
|
||||
: NULL;
|
||||
}
|
||||
|
||||
static int o2hb_heartbeat_group_make_item(struct config_group *group,
|
||||
const char *name,
|
||||
struct config_item **new_item)
|
||||
static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *group,
|
||||
const char *name)
|
||||
{
|
||||
struct o2hb_region *reg = NULL;
|
||||
int ret = 0;
|
||||
|
||||
reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL);
|
||||
if (reg == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (reg == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
config_item_init_type_name(®->hr_item, name, &o2hb_region_type);
|
||||
|
||||
*new_item = ®->hr_item;
|
||||
|
||||
spin_lock(&o2hb_live_lock);
|
||||
list_add_tail(®->hr_all_item, &o2hb_all_regions);
|
||||
spin_unlock(&o2hb_live_lock);
|
||||
out:
|
||||
if (ret)
|
||||
kfree(reg);
|
||||
|
||||
return ret;
|
||||
return ®->hr_item;
|
||||
}
|
||||
|
||||
static void o2hb_heartbeat_group_drop_item(struct config_group *group,
|
||||
|
||||
@@ -644,35 +644,23 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int o2nm_node_group_make_item(struct config_group *group,
|
||||
const char *name,
|
||||
struct config_item **new_item)
|
||||
static struct config_item *o2nm_node_group_make_item(struct config_group *group,
|
||||
const char *name)
|
||||
{
|
||||
struct o2nm_node *node = NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (strlen(name) > O2NM_MAX_NAME_LEN) {
|
||||
ret = -ENAMETOOLONG;
|
||||
goto out;
|
||||
}
|
||||
if (strlen(name) > O2NM_MAX_NAME_LEN)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
|
||||
node = kzalloc(sizeof(struct o2nm_node), GFP_KERNEL);
|
||||
if (node == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (node == NULL)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
strcpy(node->nd_name, name); /* use item.ci_namebuf instead? */
|
||||
config_item_init_type_name(&node->nd_item, name, &o2nm_node_type);
|
||||
spin_lock_init(&node->nd_lock);
|
||||
|
||||
*new_item = &node->nd_item;
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
kfree(node);
|
||||
|
||||
return ret;
|
||||
return &node->nd_item;
|
||||
}
|
||||
|
||||
static void o2nm_node_group_drop_item(struct config_group *group,
|
||||
@@ -756,31 +744,25 @@ static struct o2nm_cluster_group *to_o2nm_cluster_group(struct config_group *gro
|
||||
}
|
||||
#endif
|
||||
|
||||
static int o2nm_cluster_group_make_group(struct config_group *group,
|
||||
const char *name,
|
||||
struct config_group **new_group)
|
||||
static struct config_group *o2nm_cluster_group_make_group(struct config_group *group,
|
||||
const char *name)
|
||||
{
|
||||
struct o2nm_cluster *cluster = NULL;
|
||||
struct o2nm_node_group *ns = NULL;
|
||||
struct config_group *o2hb_group = NULL;
|
||||
struct config_group *o2hb_group = NULL, *ret = NULL;
|
||||
void *defs = NULL;
|
||||
int ret = 0;
|
||||
|
||||
/* this runs under the parent dir's i_mutex; there can be only
|
||||
* one caller in here at a time */
|
||||
if (o2nm_single_cluster) {
|
||||
ret = -ENOSPC;
|
||||
goto out;
|
||||
}
|
||||
if (o2nm_single_cluster)
|
||||
return ERR_PTR(-ENOSPC);
|
||||
|
||||
cluster = kzalloc(sizeof(struct o2nm_cluster), GFP_KERNEL);
|
||||
ns = kzalloc(sizeof(struct o2nm_node_group), GFP_KERNEL);
|
||||
defs = kcalloc(3, sizeof(struct config_group *), GFP_KERNEL);
|
||||
o2hb_group = o2hb_alloc_hb_set();
|
||||
if (cluster == NULL || ns == NULL || o2hb_group == NULL || defs == NULL) {
|
||||
ret = -ENOMEM;
|
||||
if (cluster == NULL || ns == NULL || o2hb_group == NULL || defs == NULL)
|
||||
goto out;
|
||||
}
|
||||
|
||||
config_group_init_type_name(&cluster->cl_group, name,
|
||||
&o2nm_cluster_type);
|
||||
@@ -797,15 +779,16 @@ static int o2nm_cluster_group_make_group(struct config_group *group,
|
||||
cluster->cl_idle_timeout_ms = O2NET_IDLE_TIMEOUT_MS_DEFAULT;
|
||||
cluster->cl_keepalive_delay_ms = O2NET_KEEPALIVE_DELAY_MS_DEFAULT;
|
||||
|
||||
*new_group = &cluster->cl_group;
|
||||
ret = &cluster->cl_group;
|
||||
o2nm_single_cluster = cluster;
|
||||
|
||||
out:
|
||||
if (ret) {
|
||||
if (ret == NULL) {
|
||||
kfree(cluster);
|
||||
kfree(ns);
|
||||
o2hb_free_hb_set(o2hb_group);
|
||||
kfree(defs);
|
||||
ret = ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user