Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[pandora-kernel.git] / Documentation / filesystems / configfs / configfs_example.c
index 3d4713a..0b422ac 100644 (file)
@@ -264,22 +264,31 @@ static struct config_item_type simple_child_type = {
 };
 
 
-static struct config_item *simple_children_make_item(struct config_group *group, const char *name)
+struct simple_children {
+       struct config_group group;
+};
+
+static inline struct simple_children *to_simple_children(struct config_item *item)
+{
+       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)
 {
        struct simple_child *simple_child;
 
-       simple_child = kmalloc(sizeof(struct simple_child), GFP_KERNEL);
+       simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL);
        if (!simple_child)
-               return NULL;
+               return -ENOMEM;
 
-       memset(simple_child, 0, sizeof(struct simple_child));
 
        config_item_init_type_name(&simple_child->item, name,
                                   &simple_child_type);
 
        simple_child->storeme = 0;
 
-       return &simple_child->item;
+       *new_item = &simple_child->item;
+       return 0;
 }
 
 static struct configfs_attribute simple_children_attr_description = {
@@ -304,7 +313,13 @@ static ssize_t simple_children_attr_show(struct config_item *item,
 "items have only one attribute that is readable and writeable.\n");
 }
 
+static void simple_children_release(struct config_item *item)
+{
+       kfree(to_simple_children(item));
+}
+
 static struct configfs_item_operations simple_children_item_ops = {
+       .release        = simple_children_release,
        .show_attribute = simple_children_attr_show,
 };
 
@@ -345,25 +360,21 @@ static struct configfs_subsystem simple_children_subsys = {
  * children of its own.
  */
 
-struct simple_children {
-       struct config_group group;
-};
-
-static struct config_group *group_children_make_group(struct config_group *group, const char *name)
+static int group_children_make_group(struct config_group *group, const char *name, struct config_group **new_group)
 {
        struct simple_children *simple_children;
 
-       simple_children = kmalloc(sizeof(struct simple_children),
+       simple_children = kzalloc(sizeof(struct simple_children),
                                  GFP_KERNEL);
        if (!simple_children)
-               return NULL;
+               return -ENOMEM;
 
-       memset(simple_children, 0, sizeof(struct simple_children));
 
        config_group_init_type_name(&simple_children->group, name,
                                    &simple_children_type);
 
-       return &simple_children->group;
+       *new_group = &simple_children->group;
+       return 0;
 }
 
 static struct configfs_attribute group_children_attr_description = {
@@ -442,7 +453,7 @@ static int __init configfs_example_init(void)
                subsys = example_subsys[i];
 
                config_group_init(&subsys->su_group);
-               init_MUTEX(&subsys->su_sem);
+               mutex_init(&subsys->su_mutex);
                ret = configfs_register_subsystem(subsys);
                if (ret) {
                        printk(KERN_ERR "Error %d while registering subsystem %s\n",