diff options
-rw-r--r-- | Documentation/filesystems/configfs/configfs.txt | 10 | ||||
-rw-r--r-- | Documentation/filesystems/configfs/configfs_example.c | 14 | ||||
-rw-r--r-- | drivers/net/netconsole.c | 10 | ||||
-rw-r--r-- | fs/configfs/dir.c | 28 | ||||
-rw-r--r-- | fs/dlm/config.c | 45 | ||||
-rw-r--r-- | fs/ocfs2/cluster/heartbeat.c | 19 | ||||
-rw-r--r-- | fs/ocfs2/cluster/nodemanager.c | 49 | ||||
-rw-r--r-- | include/linux/configfs.h | 7 |
8 files changed, 73 insertions, 109 deletions
diff --git a/Documentation/filesystems/configfs/configfs.txt b/Documentation/filesystems/configfs/configfs.txt index 15838d706ea2..44c97e6accb2 100644 --- a/Documentation/filesystems/configfs/configfs.txt +++ b/Documentation/filesystems/configfs/configfs.txt | |||
@@ -233,12 +233,10 @@ accomplished via the group operations specified on the group's | |||
233 | config_item_type. | 233 | config_item_type. |
234 | 234 | ||
235 | struct configfs_group_operations { | 235 | struct configfs_group_operations { |
236 | int (*make_item)(struct config_group *group, | 236 | struct config_item *(*make_item)(struct config_group *group, |
237 | const char *name, | 237 | const char *name); |
238 | struct config_item **new_item); | 238 | struct config_group *(*make_group)(struct config_group *group, |
239 | int (*make_group)(struct config_group *group, | 239 | const char *name); |
240 | const char *name, | ||
241 | struct config_group **new_group); | ||
242 | int (*commit_item)(struct config_item *item); | 240 | int (*commit_item)(struct config_item *item); |
243 | void (*disconnect_notify)(struct config_group *group, | 241 | void (*disconnect_notify)(struct config_group *group, |
244 | struct config_item *item); | 242 | struct config_item *item); |
diff --git a/Documentation/filesystems/configfs/configfs_example.c b/Documentation/filesystems/configfs/configfs_example.c index 0b422acd470c..039648791701 100644 --- a/Documentation/filesystems/configfs/configfs_example.c +++ b/Documentation/filesystems/configfs/configfs_example.c | |||
@@ -273,13 +273,13 @@ static inline struct simple_children *to_simple_children(struct config_item *ite | |||
273 | return item ? container_of(to_config_group(item), struct simple_children, group) : NULL; | 273 | return item ? container_of(to_config_group(item), struct simple_children, group) : NULL; |
274 | } | 274 | } |
275 | 275 | ||
276 | static int simple_children_make_item(struct config_group *group, const char *name, struct config_item **new_item) | 276 | static struct config_item *simple_children_make_item(struct config_group *group, const char *name) |
277 | { | 277 | { |
278 | struct simple_child *simple_child; | 278 | struct simple_child *simple_child; |
279 | 279 | ||
280 | simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL); | 280 | simple_child = kzalloc(sizeof(struct simple_child), GFP_KERNEL); |
281 | if (!simple_child) | 281 | if (!simple_child) |
282 | return -ENOMEM; | 282 | return ERR_PTR(-ENOMEM); |
283 | 283 | ||
284 | 284 | ||
285 | config_item_init_type_name(&simple_child->item, name, | 285 | 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 | |||
287 | 287 | ||
288 | simple_child->storeme = 0; | 288 | simple_child->storeme = 0; |
289 | 289 | ||
290 | *new_item = &simple_child->item; | 290 | return &simple_child->item; |
291 | return 0; | ||
292 | } | 291 | } |
293 | 292 | ||
294 | static struct configfs_attribute simple_children_attr_description = { | 293 | static struct configfs_attribute simple_children_attr_description = { |
@@ -360,21 +359,20 @@ static struct configfs_subsystem simple_children_subsys = { | |||
360 | * children of its own. | 359 | * children of its own. |
361 | */ | 360 | */ |
362 | 361 | ||
363 | static int group_children_make_group(struct config_group *group, const char *name, struct config_group **new_group) | 362 | static struct config_group *group_children_make_group(struct config_group *group, const char *name) |
364 | { | 363 | { |
365 | struct simple_children *simple_children; | 364 | struct simple_children *simple_children; |
366 | 365 | ||
367 | simple_children = kzalloc(sizeof(struct simple_children), | 366 | simple_children = kzalloc(sizeof(struct simple_children), |
368 | GFP_KERNEL); | 367 | GFP_KERNEL); |
369 | if (!simple_children) | 368 | if (!simple_children) |
370 | return -ENOMEM; | 369 | return ERR_PTR(-ENOMEM); |
371 | 370 | ||
372 | 371 | ||
373 | config_group_init_type_name(&simple_children->group, name, | 372 | config_group_init_type_name(&simple_children->group, name, |
374 | &simple_children_type); | 373 | &simple_children_type); |
375 | 374 | ||
376 | *new_group = &simple_children->group; | 375 | return &simple_children->group; |
377 | return 0; | ||
378 | } | 376 | } |
379 | 377 | ||
380 | static struct configfs_attribute group_children_attr_description = { | 378 | static struct configfs_attribute group_children_attr_description = { |
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 387a13395015..e13966bb5f77 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c | |||
@@ -585,9 +585,8 @@ static struct config_item_type netconsole_target_type = { | |||
585 | * Group operations and type for netconsole_subsys. | 585 | * Group operations and type for netconsole_subsys. |
586 | */ | 586 | */ |
587 | 587 | ||
588 | static int make_netconsole_target(struct config_group *group, | 588 | static struct config_item *make_netconsole_target(struct config_group *group, |
589 | const char *name, | 589 | const char *name) |
590 | struct config_item **new_item) | ||
591 | { | 590 | { |
592 | unsigned long flags; | 591 | unsigned long flags; |
593 | struct netconsole_target *nt; | 592 | struct netconsole_target *nt; |
@@ -599,7 +598,7 @@ static int make_netconsole_target(struct config_group *group, | |||
599 | nt = kzalloc(sizeof(*nt), GFP_KERNEL); | 598 | nt = kzalloc(sizeof(*nt), GFP_KERNEL); |
600 | if (!nt) { | 599 | if (!nt) { |
601 | printk(KERN_ERR "netconsole: failed to allocate memory\n"); | 600 | printk(KERN_ERR "netconsole: failed to allocate memory\n"); |
602 | return -ENOMEM; | 601 | return ERR_PTR(-ENOMEM); |
603 | } | 602 | } |
604 | 603 | ||
605 | nt->np.name = "netconsole"; | 604 | nt->np.name = "netconsole"; |
@@ -616,8 +615,7 @@ static int make_netconsole_target(struct config_group *group, | |||
616 | list_add(&nt->list, &target_list); | 615 | list_add(&nt->list, &target_list); |
617 | spin_unlock_irqrestore(&target_list_lock, flags); | 616 | spin_unlock_irqrestore(&target_list_lock, flags); |
618 | 617 | ||
619 | *new_item = &nt->item; | 618 | return &nt->item; |
620 | return 0; | ||
621 | } | 619 | } |
622 | 620 | ||
623 | static void drop_netconsole_target(struct config_group *group, | 621 | static void drop_netconsole_target(struct config_group *group, |
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c index 0e64312a084c..179589be063a 100644 --- a/fs/configfs/dir.c +++ b/fs/configfs/dir.c | |||
@@ -1027,9 +1027,10 @@ EXPORT_SYMBOL(configfs_undepend_item); | |||
1027 | 1027 | ||
1028 | static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | 1028 | static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) |
1029 | { | 1029 | { |
1030 | int ret, module_got = 0; | 1030 | int ret = 0; |
1031 | struct config_group *group; | 1031 | int module_got = 0; |
1032 | struct config_item *item; | 1032 | struct config_group *group = NULL; |
1033 | struct config_item *item = NULL; | ||
1033 | struct config_item *parent_item; | 1034 | struct config_item *parent_item; |
1034 | struct configfs_subsystem *subsys; | 1035 | struct configfs_subsystem *subsys; |
1035 | struct configfs_dirent *sd; | 1036 | struct configfs_dirent *sd; |
@@ -1070,25 +1071,30 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
1070 | snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name); | 1071 | snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name); |
1071 | 1072 | ||
1072 | mutex_lock(&subsys->su_mutex); | 1073 | mutex_lock(&subsys->su_mutex); |
1073 | group = NULL; | ||
1074 | item = NULL; | ||
1075 | if (type->ct_group_ops->make_group) { | 1074 | if (type->ct_group_ops->make_group) { |
1076 | ret = type->ct_group_ops->make_group(to_config_group(parent_item), name, &group); | 1075 | group = type->ct_group_ops->make_group(to_config_group(parent_item), name); |
1077 | if (!ret) { | 1076 | if (!group) |
1077 | group = ERR_PTR(-ENOMEM); | ||
1078 | if (!IS_ERR(group)) { | ||
1078 | link_group(to_config_group(parent_item), group); | 1079 | link_group(to_config_group(parent_item), group); |
1079 | item = &group->cg_item; | 1080 | item = &group->cg_item; |
1080 | } | 1081 | } else |
1082 | ret = PTR_ERR(group); | ||
1081 | } else { | 1083 | } else { |
1082 | ret = type->ct_group_ops->make_item(to_config_group(parent_item), name, &item); | 1084 | item = type->ct_group_ops->make_item(to_config_group(parent_item), name); |
1083 | if (!ret) | 1085 | if (!item) |
1086 | item = ERR_PTR(-ENOMEM); | ||
1087 | if (!IS_ERR(item)) | ||
1084 | link_obj(parent_item, item); | 1088 | link_obj(parent_item, item); |
1089 | else | ||
1090 | ret = PTR_ERR(item); | ||
1085 | } | 1091 | } |
1086 | mutex_unlock(&subsys->su_mutex); | 1092 | mutex_unlock(&subsys->su_mutex); |
1087 | 1093 | ||
1088 | kfree(name); | 1094 | kfree(name); |
1089 | if (ret) { | 1095 | if (ret) { |
1090 | /* | 1096 | /* |
1091 | * If ret != 0, then link_obj() was never called. | 1097 | * If item == NULL, then link_obj() was never called. |
1092 | * There are no extra references to clean up. | 1098 | * There are no extra references to clean up. |
1093 | */ | 1099 | */ |
1094 | goto out_put; | 1100 | goto out_put; |
diff --git a/fs/dlm/config.c b/fs/dlm/config.c index 492d8caaaf25..c4e7d721bd8d 100644 --- a/fs/dlm/config.c +++ b/fs/dlm/config.c | |||
@@ -41,20 +41,16 @@ struct comm; | |||
41 | struct nodes; | 41 | struct nodes; |
42 | struct node; | 42 | struct node; |
43 | 43 | ||
44 | static int make_cluster(struct config_group *, const char *, | 44 | static struct config_group *make_cluster(struct config_group *, const char *); |
45 | struct config_group **); | ||
46 | static void drop_cluster(struct config_group *, struct config_item *); | 45 | static void drop_cluster(struct config_group *, struct config_item *); |
47 | static void release_cluster(struct config_item *); | 46 | static void release_cluster(struct config_item *); |
48 | static int make_space(struct config_group *, const char *, | 47 | static struct config_group *make_space(struct config_group *, const char *); |
49 | struct config_group **); | ||
50 | static void drop_space(struct config_group *, struct config_item *); | 48 | static void drop_space(struct config_group *, struct config_item *); |
51 | static void release_space(struct config_item *); | 49 | static void release_space(struct config_item *); |
52 | static int make_comm(struct config_group *, const char *, | 50 | static struct config_item *make_comm(struct config_group *, const char *); |
53 | struct config_item **); | ||
54 | static void drop_comm(struct config_group *, struct config_item *); | 51 | static void drop_comm(struct config_group *, struct config_item *); |
55 | static void release_comm(struct config_item *); | 52 | static void release_comm(struct config_item *); |
56 | static int make_node(struct config_group *, const char *, | 53 | static struct config_item *make_node(struct config_group *, const char *); |
57 | struct config_item **); | ||
58 | static void drop_node(struct config_group *, struct config_item *); | 54 | static void drop_node(struct config_group *, struct config_item *); |
59 | static void release_node(struct config_item *); | 55 | static void release_node(struct config_item *); |
60 | 56 | ||
@@ -396,8 +392,8 @@ static struct node *to_node(struct config_item *i) | |||
396 | return i ? container_of(i, struct node, item) : NULL; | 392 | return i ? container_of(i, struct node, item) : NULL; |
397 | } | 393 | } |
398 | 394 | ||
399 | static int make_cluster(struct config_group *g, const char *name, | 395 | static struct config_group *make_cluster(struct config_group *g, |
400 | struct config_group **new_g) | 396 | const char *name) |
401 | { | 397 | { |
402 | struct cluster *cl = NULL; | 398 | struct cluster *cl = NULL; |
403 | struct spaces *sps = NULL; | 399 | struct spaces *sps = NULL; |
@@ -435,15 +431,14 @@ static int make_cluster(struct config_group *g, const char *name, | |||
435 | 431 | ||
436 | space_list = &sps->ss_group; | 432 | space_list = &sps->ss_group; |
437 | comm_list = &cms->cs_group; | 433 | comm_list = &cms->cs_group; |
438 | *new_g = &cl->group; | 434 | return &cl->group; |
439 | return 0; | ||
440 | 435 | ||
441 | fail: | 436 | fail: |
442 | kfree(cl); | 437 | kfree(cl); |
443 | kfree(gps); | 438 | kfree(gps); |
444 | kfree(sps); | 439 | kfree(sps); |
445 | kfree(cms); | 440 | kfree(cms); |
446 | return -ENOMEM; | 441 | return ERR_PTR(-ENOMEM); |
447 | } | 442 | } |
448 | 443 | ||
449 | static void drop_cluster(struct config_group *g, struct config_item *i) | 444 | static void drop_cluster(struct config_group *g, struct config_item *i) |
@@ -471,8 +466,7 @@ static void release_cluster(struct config_item *i) | |||
471 | kfree(cl); | 466 | kfree(cl); |
472 | } | 467 | } |
473 | 468 | ||
474 | static int make_space(struct config_group *g, const char *name, | 469 | static struct config_group *make_space(struct config_group *g, const char *name) |
475 | struct config_group **new_g) | ||
476 | { | 470 | { |
477 | struct space *sp = NULL; | 471 | struct space *sp = NULL; |
478 | struct nodes *nds = NULL; | 472 | struct nodes *nds = NULL; |
@@ -495,14 +489,13 @@ static int make_space(struct config_group *g, const char *name, | |||
495 | INIT_LIST_HEAD(&sp->members); | 489 | INIT_LIST_HEAD(&sp->members); |
496 | mutex_init(&sp->members_lock); | 490 | mutex_init(&sp->members_lock); |
497 | sp->members_count = 0; | 491 | sp->members_count = 0; |
498 | *new_g = &sp->group; | 492 | return &sp->group; |
499 | return 0; | ||
500 | 493 | ||
501 | fail: | 494 | fail: |
502 | kfree(sp); | 495 | kfree(sp); |
503 | kfree(gps); | 496 | kfree(gps); |
504 | kfree(nds); | 497 | kfree(nds); |
505 | return -ENOMEM; | 498 | return ERR_PTR(-ENOMEM); |
506 | } | 499 | } |
507 | 500 | ||
508 | static void drop_space(struct config_group *g, struct config_item *i) | 501 | static void drop_space(struct config_group *g, struct config_item *i) |
@@ -529,21 +522,19 @@ static void release_space(struct config_item *i) | |||
529 | kfree(sp); | 522 | kfree(sp); |
530 | } | 523 | } |
531 | 524 | ||
532 | static int make_comm(struct config_group *g, const char *name, | 525 | static struct config_item *make_comm(struct config_group *g, const char *name) |
533 | struct config_item **new_i) | ||
534 | { | 526 | { |
535 | struct comm *cm; | 527 | struct comm *cm; |
536 | 528 | ||
537 | cm = kzalloc(sizeof(struct comm), GFP_KERNEL); | 529 | cm = kzalloc(sizeof(struct comm), GFP_KERNEL); |
538 | if (!cm) | 530 | if (!cm) |
539 | return -ENOMEM; | 531 | return ERR_PTR(-ENOMEM); |
540 | 532 | ||
541 | config_item_init_type_name(&cm->item, name, &comm_type); | 533 | config_item_init_type_name(&cm->item, name, &comm_type); |
542 | cm->nodeid = -1; | 534 | cm->nodeid = -1; |
543 | cm->local = 0; | 535 | cm->local = 0; |
544 | cm->addr_count = 0; | 536 | cm->addr_count = 0; |
545 | *new_i = &cm->item; | 537 | return &cm->item; |
546 | return 0; | ||
547 | } | 538 | } |
548 | 539 | ||
549 | static void drop_comm(struct config_group *g, struct config_item *i) | 540 | static void drop_comm(struct config_group *g, struct config_item *i) |
@@ -563,15 +554,14 @@ static void release_comm(struct config_item *i) | |||
563 | kfree(cm); | 554 | kfree(cm); |
564 | } | 555 | } |
565 | 556 | ||
566 | static int make_node(struct config_group *g, const char *name, | 557 | static struct config_item *make_node(struct config_group *g, const char *name) |
567 | struct config_item **new_i) | ||
568 | { | 558 | { |
569 | struct space *sp = to_space(g->cg_item.ci_parent); | 559 | struct space *sp = to_space(g->cg_item.ci_parent); |
570 | struct node *nd; | 560 | struct node *nd; |
571 | 561 | ||
572 | nd = kzalloc(sizeof(struct node), GFP_KERNEL); | 562 | nd = kzalloc(sizeof(struct node), GFP_KERNEL); |
573 | if (!nd) | 563 | if (!nd) |
574 | return -ENOMEM; | 564 | return ERR_PTR(-ENOMEM); |
575 | 565 | ||
576 | config_item_init_type_name(&nd->item, name, &node_type); | 566 | config_item_init_type_name(&nd->item, name, &node_type); |
577 | nd->nodeid = -1; | 567 | nd->nodeid = -1; |
@@ -583,8 +573,7 @@ static int make_node(struct config_group *g, const char *name, | |||
583 | sp->members_count++; | 573 | sp->members_count++; |
584 | mutex_unlock(&sp->members_lock); | 574 | mutex_unlock(&sp->members_lock); |
585 | 575 | ||
586 | *new_i = &nd->item; | 576 | return &nd->item; |
587 | return 0; | ||
588 | } | 577 | } |
589 | 578 | ||
590 | static void drop_node(struct config_group *g, struct config_item *i) | 579 | static void drop_node(struct config_group *g, struct config_item *i) |
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 443d108211ab..7dce1612553e 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
@@ -1489,31 +1489,22 @@ static struct o2hb_heartbeat_group *to_o2hb_heartbeat_group(struct config_group | |||
1489 | : NULL; | 1489 | : NULL; |
1490 | } | 1490 | } |
1491 | 1491 | ||
1492 | static int o2hb_heartbeat_group_make_item(struct config_group *group, | 1492 | static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *group, |
1493 | const char *name, | 1493 | const char *name) |
1494 | struct config_item **new_item) | ||
1495 | { | 1494 | { |
1496 | struct o2hb_region *reg = NULL; | 1495 | struct o2hb_region *reg = NULL; |
1497 | int ret = 0; | ||
1498 | 1496 | ||
1499 | reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL); | 1497 | reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL); |
1500 | if (reg == NULL) { | 1498 | if (reg == NULL) |
1501 | ret = -ENOMEM; | 1499 | return ERR_PTR(-ENOMEM); |
1502 | goto out; | ||
1503 | } | ||
1504 | 1500 | ||
1505 | config_item_init_type_name(®->hr_item, name, &o2hb_region_type); | 1501 | config_item_init_type_name(®->hr_item, name, &o2hb_region_type); |
1506 | 1502 | ||
1507 | *new_item = ®->hr_item; | ||
1508 | |||
1509 | spin_lock(&o2hb_live_lock); | 1503 | spin_lock(&o2hb_live_lock); |
1510 | list_add_tail(®->hr_all_item, &o2hb_all_regions); | 1504 | list_add_tail(®->hr_all_item, &o2hb_all_regions); |
1511 | spin_unlock(&o2hb_live_lock); | 1505 | spin_unlock(&o2hb_live_lock); |
1512 | out: | ||
1513 | if (ret) | ||
1514 | kfree(reg); | ||
1515 | 1506 | ||
1516 | return ret; | 1507 | return ®->hr_item; |
1517 | } | 1508 | } |
1518 | 1509 | ||
1519 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, | 1510 | static void o2hb_heartbeat_group_drop_item(struct config_group *group, |
diff --git a/fs/ocfs2/cluster/nodemanager.c b/fs/ocfs2/cluster/nodemanager.c index b364b7052e46..816a3f61330c 100644 --- a/fs/ocfs2/cluster/nodemanager.c +++ b/fs/ocfs2/cluster/nodemanager.c | |||
@@ -644,35 +644,23 @@ out: | |||
644 | return ret; | 644 | return ret; |
645 | } | 645 | } |
646 | 646 | ||
647 | static int o2nm_node_group_make_item(struct config_group *group, | 647 | static struct config_item *o2nm_node_group_make_item(struct config_group *group, |
648 | const char *name, | 648 | const char *name) |
649 | struct config_item **new_item) | ||
650 | { | 649 | { |
651 | struct o2nm_node *node = NULL; | 650 | struct o2nm_node *node = NULL; |
652 | int ret = 0; | ||
653 | 651 | ||
654 | if (strlen(name) > O2NM_MAX_NAME_LEN) { | 652 | if (strlen(name) > O2NM_MAX_NAME_LEN) |
655 | ret = -ENAMETOOLONG; | 653 | return ERR_PTR(-ENAMETOOLONG); |
656 | goto out; | ||
657 | } | ||
658 | 654 | ||
659 | node = kzalloc(sizeof(struct o2nm_node), GFP_KERNEL); | 655 | node = kzalloc(sizeof(struct o2nm_node), GFP_KERNEL); |
660 | if (node == NULL) { | 656 | if (node == NULL) |
661 | ret = -ENOMEM; | 657 | return ERR_PTR(-ENOMEM); |
662 | goto out; | ||
663 | } | ||
664 | 658 | ||
665 | strcpy(node->nd_name, name); /* use item.ci_namebuf instead? */ | 659 | strcpy(node->nd_name, name); /* use item.ci_namebuf instead? */ |
666 | config_item_init_type_name(&node->nd_item, name, &o2nm_node_type); | 660 | config_item_init_type_name(&node->nd_item, name, &o2nm_node_type); |
667 | spin_lock_init(&node->nd_lock); | 661 | spin_lock_init(&node->nd_lock); |
668 | 662 | ||
669 | *new_item = &node->nd_item; | 663 | return &node->nd_item; |
670 | |||
671 | out: | ||
672 | if (ret) | ||
673 | kfree(node); | ||
674 | |||
675 | return ret; | ||
676 | } | 664 | } |
677 | 665 | ||
678 | static void o2nm_node_group_drop_item(struct config_group *group, | 666 | 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 | |||
756 | } | 744 | } |
757 | #endif | 745 | #endif |
758 | 746 | ||
759 | static int o2nm_cluster_group_make_group(struct config_group *group, | 747 | static struct config_group *o2nm_cluster_group_make_group(struct config_group *group, |
760 | const char *name, | 748 | const char *name) |
761 | struct config_group **new_group) | ||
762 | { | 749 | { |
763 | struct o2nm_cluster *cluster = NULL; | 750 | struct o2nm_cluster *cluster = NULL; |
764 | struct o2nm_node_group *ns = NULL; | 751 | struct o2nm_node_group *ns = NULL; |
765 | struct config_group *o2hb_group = NULL; | 752 | struct config_group *o2hb_group = NULL, *ret = NULL; |
766 | void *defs = NULL; | 753 | void *defs = NULL; |
767 | int ret = 0; | ||
768 | 754 | ||
769 | /* this runs under the parent dir's i_mutex; there can be only | 755 | /* this runs under the parent dir's i_mutex; there can be only |
770 | * one caller in here at a time */ | 756 | * one caller in here at a time */ |
771 | if (o2nm_single_cluster) { | 757 | if (o2nm_single_cluster) |
772 | ret = -ENOSPC; | 758 | return ERR_PTR(-ENOSPC); |
773 | goto out; | ||
774 | } | ||
775 | 759 | ||
776 | cluster = kzalloc(sizeof(struct o2nm_cluster), GFP_KERNEL); | 760 | cluster = kzalloc(sizeof(struct o2nm_cluster), GFP_KERNEL); |
777 | ns = kzalloc(sizeof(struct o2nm_node_group), GFP_KERNEL); | 761 | ns = kzalloc(sizeof(struct o2nm_node_group), GFP_KERNEL); |
778 | defs = kcalloc(3, sizeof(struct config_group *), GFP_KERNEL); | 762 | defs = kcalloc(3, sizeof(struct config_group *), GFP_KERNEL); |
779 | o2hb_group = o2hb_alloc_hb_set(); | 763 | o2hb_group = o2hb_alloc_hb_set(); |
780 | if (cluster == NULL || ns == NULL || o2hb_group == NULL || defs == NULL) { | 764 | if (cluster == NULL || ns == NULL || o2hb_group == NULL || defs == NULL) |
781 | ret = -ENOMEM; | ||
782 | goto out; | 765 | goto out; |
783 | } | ||
784 | 766 | ||
785 | config_group_init_type_name(&cluster->cl_group, name, | 767 | config_group_init_type_name(&cluster->cl_group, name, |
786 | &o2nm_cluster_type); | 768 | &o2nm_cluster_type); |
@@ -797,15 +779,16 @@ static int o2nm_cluster_group_make_group(struct config_group *group, | |||
797 | cluster->cl_idle_timeout_ms = O2NET_IDLE_TIMEOUT_MS_DEFAULT; | 779 | cluster->cl_idle_timeout_ms = O2NET_IDLE_TIMEOUT_MS_DEFAULT; |
798 | cluster->cl_keepalive_delay_ms = O2NET_KEEPALIVE_DELAY_MS_DEFAULT; | 780 | cluster->cl_keepalive_delay_ms = O2NET_KEEPALIVE_DELAY_MS_DEFAULT; |
799 | 781 | ||
800 | *new_group = &cluster->cl_group; | 782 | ret = &cluster->cl_group; |
801 | o2nm_single_cluster = cluster; | 783 | o2nm_single_cluster = cluster; |
802 | 784 | ||
803 | out: | 785 | out: |
804 | if (ret) { | 786 | if (ret == NULL) { |
805 | kfree(cluster); | 787 | kfree(cluster); |
806 | kfree(ns); | 788 | kfree(ns); |
807 | o2hb_free_hb_set(o2hb_group); | 789 | o2hb_free_hb_set(o2hb_group); |
808 | kfree(defs); | 790 | kfree(defs); |
791 | ret = ERR_PTR(-ENOMEM); | ||
809 | } | 792 | } |
810 | 793 | ||
811 | return ret; | 794 | return ret; |
diff --git a/include/linux/configfs.h b/include/linux/configfs.h index 0488f937634a..d62c19ff041c 100644 --- a/include/linux/configfs.h +++ b/include/linux/configfs.h | |||
@@ -148,7 +148,8 @@ struct configfs_attribute { | |||
148 | * items. If the item is a group, it may support mkdir(2). | 148 | * items. If the item is a group, it may support mkdir(2). |
149 | * Groups supply one of make_group() and make_item(). If the | 149 | * Groups supply one of make_group() and make_item(). If the |
150 | * group supports make_group(), one can create group children. If it | 150 | * group supports make_group(), one can create group children. If it |
151 | * supports make_item(), one can create config_item children. If it has | 151 | * supports make_item(), one can create config_item children. make_group() |
152 | * and make_item() return ERR_PTR() on errors. If it has | ||
152 | * default_groups on group->default_groups, it has automatically created | 153 | * default_groups on group->default_groups, it has automatically created |
153 | * group children. default_groups may coexist alongsize make_group() or | 154 | * group children. default_groups may coexist alongsize make_group() or |
154 | * make_item(), but if the group wishes to have only default_groups | 155 | * make_item(), but if the group wishes to have only default_groups |
@@ -165,8 +166,8 @@ struct configfs_item_operations { | |||
165 | }; | 166 | }; |
166 | 167 | ||
167 | struct configfs_group_operations { | 168 | struct configfs_group_operations { |
168 | int (*make_item)(struct config_group *group, const char *name, struct config_item **new_item); | 169 | struct config_item *(*make_item)(struct config_group *group, const char *name); |
169 | int (*make_group)(struct config_group *group, const char *name, struct config_group **new_group); | 170 | struct config_group *(*make_group)(struct config_group *group, const char *name); |
170 | int (*commit_item)(struct config_item *item); | 171 | int (*commit_item)(struct config_item *item); |
171 | void (*disconnect_notify)(struct config_group *group, struct config_item *item); | 172 | void (*disconnect_notify)(struct config_group *group, struct config_item *item); |
172 | void (*drop_item)(struct config_group *group, struct config_item *item); | 173 | void (*drop_item)(struct config_group *group, struct config_item *item); |