Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7df406d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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."
parents 5e248ac9 a6795e9e
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -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);
+6 −8
Original line number Diff line number Diff line
@@ -273,13 +273,13 @@ 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,
@@ -287,8 +287,7 @@ static int simple_children_make_item(struct config_group *group, const char *nam

	simple_child->storeme = 0;

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

static struct configfs_attribute simple_children_attr_description = {
@@ -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 = {
+4 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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";
@@ -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,
+17 −11
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -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)
Loading