Skip to content

Commit

Permalink
Merge branch 'configfs-fixup-ptr-error' of git://oss.oracle.com/git/j…
Browse files Browse the repository at this point in the history
…lbec/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."
  • Loading branch information
torvalds committed Jul 21, 2008
2 parents 5e248ac + a6795e9 commit f7df406
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 109 deletions.
10 changes: 4 additions & 6 deletions Documentation/filesystems/configfs/configfs.txt
Original file line number Diff line number Diff line change
Expand Up @@ -233,12 +233,10 @@ accomplished via the group operations specified on the group's
config_item_type.

struct configfs_group_operations {
int (*make_item)(struct config_group *group,
const char *name,
struct config_item **new_item);
int (*make_group)(struct config_group *group,
const char *name,
struct config_group **new_group);
struct config_item *(*make_item)(struct config_group *group,
const char *name);
struct config_group *(*make_group)(struct config_group *group,
const char *name);
int (*commit_item)(struct config_item *item);
void (*disconnect_notify)(struct config_group *group,
struct config_item *item);
Expand Down
14 changes: 6 additions & 8 deletions Documentation/filesystems/configfs/configfs_example.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,22 +273,21 @@ static inline struct simple_children *to_simple_children(struct config_item *ite
return item ? container_of(to_config_group(item), struct simple_children, group) : NULL;
}

static int simple_children_make_item(struct config_group *group, const char *name, struct config_item **new_item)
static struct config_item *simple_children_make_item(struct config_group *group, const char *name)
{
struct simple_child *simple_child;

simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
if (!simple_child)
return -ENOMEM;
return ERR_PTR(-ENOMEM);


config_item_init_type_name(&simple_child->item, name,
&simple_child_type);

simple_child->storeme = 0;

*new_item = &simple_child->item;
return 0;
return &simple_child->item;
}

static struct configfs_attribute simple_children_attr_description = {
Expand Down Expand Up @@ -360,21 +359,20 @@ static struct configfs_subsystem simple_children_subsys = {
* children of its own.
*/

static int group_children_make_group(struct config_group *group, const char *name, struct config_group **new_group)
static struct config_group *group_children_make_group(struct config_group *group, const char *name)
{
struct simple_children *simple_children;

simple_children = kzalloc(sizeof(struct simple_children),
GFP_KERNEL);
if (!simple_children)
return -ENOMEM;
return ERR_PTR(-ENOMEM);


config_group_init_type_name(&simple_children->group, name,
&simple_children_type);

*new_group = &simple_children->group;
return 0;
return &simple_children->group;
}

static struct configfs_attribute group_children_attr_description = {
Expand Down
10 changes: 4 additions & 6 deletions drivers/net/netconsole.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,9 +585,8 @@ static struct config_item_type netconsole_target_type = {
* Group operations and type for netconsole_subsys.
*/

static int make_netconsole_target(struct config_group *group,
const char *name,
struct config_item **new_item)
static struct config_item *make_netconsole_target(struct config_group *group,
const char *name)
{
unsigned long flags;
struct netconsole_target *nt;
Expand All @@ -599,7 +598,7 @@ static int make_netconsole_target(struct config_group *group,
nt = kzalloc(sizeof(*nt), GFP_KERNEL);
if (!nt) {
printk(KERN_ERR "netconsole: failed to allocate memory\n");
return -ENOMEM;
return ERR_PTR(-ENOMEM);
}

nt->np.name = "netconsole";
Expand All @@ -616,8 +615,7 @@ static int make_netconsole_target(struct config_group *group,
list_add(&nt->list, &target_list);
spin_unlock_irqrestore(&target_list_lock, flags);

*new_item = &nt->item;
return 0;
return &nt->item;
}

static void drop_netconsole_target(struct config_group *group,
Expand Down
28 changes: 17 additions & 11 deletions fs/configfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
45 changes: 17 additions & 28 deletions fs/dlm/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 *);

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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;
Expand All @@ -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)
Expand Down
19 changes: 5 additions & 14 deletions fs/ocfs2/cluster/heartbeat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(&reg->hr_item, name, &o2hb_region_type);

*new_item = &reg->hr_item;

spin_lock(&o2hb_live_lock);
list_add_tail(&reg->hr_all_item, &o2hb_all_regions);
spin_unlock(&o2hb_live_lock);
out:
if (ret)
kfree(reg);

return ret;
return &reg->hr_item;
}

static void o2hb_heartbeat_group_drop_item(struct config_group *group,
Expand Down
Loading

0 comments on commit f7df406

Please sign in to comment.