Skip to content

Commit 1ae1602

Browse files
author
Christoph Hellwig
committed
configfs: switch ->default groups to a linked list
Replace the current NULL-terminated array of default groups with a linked list. This gets rid of lots of nasty code to size and/or dynamically allocate the array. While we're at it also provide a conveniant helper to remove the default groups. Signed-off-by: Christoph Hellwig <[email protected]> Acked-by: Felipe Balbi <[email protected]> [drivers/usb/gadget] Acked-by: Joel Becker <[email protected]> Acked-by: Nicholas Bellinger <[email protected]> Reviewed-by: Sagi Grimberg <[email protected]>
1 parent b1f1a29 commit 1ae1602

File tree

17 files changed

+286
-634
lines changed

17 files changed

+286
-634
lines changed

Documentation/filesystems/configfs/configfs.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,8 @@ child item.
250250
struct config_item cg_item;
251251
struct list_head cg_children;
252252
struct configfs_subsystem *cg_subsys;
253-
struct config_group **default_groups;
253+
struct list_head default_groups;
254+
struct list_head group_entry;
254255
};
255256

256257
void config_group_init(struct config_group *group);
@@ -420,15 +421,15 @@ These automatic subgroups, or default groups, do not preclude other
420421
children of the parent group. If ct_group_ops->make_group() exists,
421422
other child groups can be created on the parent group directly.
422423

423-
A configfs subsystem specifies default groups by filling in the
424-
NULL-terminated array default_groups on the config_group structure.
425-
Each group in that array is populated in the configfs tree at the same
424+
A configfs subsystem specifies default groups by adding them using the
425+
configfs_add_default_group() function to the parent config_group
426+
structure. Each added group is populated in the configfs tree at the same
426427
time as the parent group. Similarly, they are removed at the same time
427428
as the parent. No extra notification is provided. When a ->drop_item()
428429
method call notifies the subsystem the parent group is going away, it
429430
also means every default group child associated with that parent group.
430431

431-
As a consequence of this, default_groups cannot be removed directly via
432+
As a consequence of this, default groups cannot be removed directly via
432433
rmdir(2). They also are not considered when rmdir(2) on the parent
433434
group is checking for children.
434435

drivers/infiniband/core/cma_configfs.c

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ struct cma_dev_group {
4949
char name[IB_DEVICE_NAME_MAX];
5050
struct config_group device_group;
5151
struct config_group ports_group;
52-
struct config_group *default_dev_group[2];
53-
struct config_group **default_ports_group;
5452
struct cma_dev_port_group *ports;
5553
};
5654

@@ -158,7 +156,6 @@ static int make_cma_ports(struct cma_dev_group *cma_dev_group,
158156
unsigned int i;
159157
unsigned int ports_num;
160158
struct cma_dev_port_group *ports;
161-
struct config_group **ports_group;
162159
int err;
163160

164161
ibdev = cma_get_ib_dev(cma_dev);
@@ -169,9 +166,8 @@ static int make_cma_ports(struct cma_dev_group *cma_dev_group,
169166
ports_num = ibdev->phys_port_cnt;
170167
ports = kcalloc(ports_num, sizeof(*cma_dev_group->ports),
171168
GFP_KERNEL);
172-
ports_group = kcalloc(ports_num + 1, sizeof(*ports_group), GFP_KERNEL);
173169

174-
if (!ports || !ports_group) {
170+
if (!ports) {
175171
err = -ENOMEM;
176172
goto free;
177173
}
@@ -185,18 +181,16 @@ static int make_cma_ports(struct cma_dev_group *cma_dev_group,
185181
config_group_init_type_name(&ports[i].group,
186182
port_str,
187183
&cma_port_group_type);
188-
ports_group[i] = &ports[i].group;
184+
configfs_add_default_group(&ports[i].group,
185+
&cma_dev_group->ports_group);
186+
189187
}
190-
ports_group[i] = NULL;
191-
cma_dev_group->default_ports_group = ports_group;
192188
cma_dev_group->ports = ports;
193189

194190
return 0;
195191
free:
196192
kfree(ports);
197-
kfree(ports_group);
198193
cma_dev_group->ports = NULL;
199-
cma_dev_group->default_ports_group = NULL;
200194
return err;
201195
}
202196

@@ -220,9 +214,7 @@ static void release_cma_ports_group(struct config_item *item)
220214
ports_group);
221215

222216
kfree(cma_dev_group->ports);
223-
kfree(cma_dev_group->default_ports_group);
224217
cma_dev_group->ports = NULL;
225-
cma_dev_group->default_ports_group = NULL;
226218
};
227219

228220
static struct configfs_item_operations cma_ports_item_ops = {
@@ -263,22 +255,17 @@ static struct config_group *make_cma_dev(struct config_group *group,
263255

264256
strncpy(cma_dev_group->name, name, sizeof(cma_dev_group->name));
265257

266-
err = make_cma_ports(cma_dev_group, cma_dev);
267-
if (err)
268-
goto fail;
269-
270-
cma_dev_group->ports_group.default_groups =
271-
cma_dev_group->default_ports_group;
272258
config_group_init_type_name(&cma_dev_group->ports_group, "ports",
273259
&cma_ports_group_type);
274260

275-
cma_dev_group->device_group.default_groups
276-
= cma_dev_group->default_dev_group;
277-
cma_dev_group->default_dev_group[0] = &cma_dev_group->ports_group;
278-
cma_dev_group->default_dev_group[1] = NULL;
261+
err = make_cma_ports(cma_dev_group, cma_dev);
262+
if (err)
263+
goto fail;
279264

280265
config_group_init_type_name(&cma_dev_group->device_group, name,
281266
&cma_device_group_type);
267+
configfs_add_default_group(&cma_dev_group->ports_group,
268+
&cma_dev_group->device_group);
282269

283270
cma_deref_dev(cma_dev);
284271
return &cma_dev_group->device_group;

drivers/target/iscsi/iscsi_target_configfs.c

Lines changed: 21 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -771,39 +771,20 @@ static int lio_target_init_nodeacl(struct se_node_acl *se_nacl,
771771
{
772772
struct iscsi_node_acl *acl =
773773
container_of(se_nacl, struct iscsi_node_acl, se_node_acl);
774-
struct config_group *stats_cg = &se_nacl->acl_fabric_stat_group;
775-
776-
stats_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2,
777-
GFP_KERNEL);
778-
if (!stats_cg->default_groups) {
779-
pr_err("Unable to allocate memory for"
780-
" stats_cg->default_groups\n");
781-
return -ENOMEM;
782-
}
783774

784-
stats_cg->default_groups[0] = &acl->node_stat_grps.iscsi_sess_stats_group;
785-
stats_cg->default_groups[1] = NULL;
786775
config_group_init_type_name(&acl->node_stat_grps.iscsi_sess_stats_group,
787776
"iscsi_sess_stats", &iscsi_stat_sess_cit);
788-
777+
configfs_add_default_group(&acl->node_stat_grps.iscsi_sess_stats_group,
778+
&se_nacl->acl_fabric_stat_group);
789779
return 0;
790780
}
791781

792782
static void lio_target_cleanup_nodeacl( struct se_node_acl *se_nacl)
793783
{
794784
struct iscsi_node_acl *acl = container_of(se_nacl,
795785
struct iscsi_node_acl, se_node_acl);
796-
struct config_item *df_item;
797-
struct config_group *stats_cg;
798-
int i;
799-
800-
stats_cg = &acl->se_node_acl.acl_fabric_stat_group;
801-
for (i = 0; stats_cg->default_groups[i]; i++) {
802-
df_item = &stats_cg->default_groups[i]->cg_item;
803-
stats_cg->default_groups[i] = NULL;
804-
config_item_put(df_item);
805-
}
806-
kfree(stats_cg->default_groups);
786+
787+
configfs_remove_default_groups(&acl->se_node_acl.acl_fabric_stat_group);
807788
}
808789

809790
/* End items for lio_target_acl_cit */
@@ -1260,42 +1241,37 @@ static struct se_wwn *lio_target_call_coreaddtiqn(
12601241
struct config_group *group,
12611242
const char *name)
12621243
{
1263-
struct config_group *stats_cg;
12641244
struct iscsi_tiqn *tiqn;
12651245

12661246
tiqn = iscsit_add_tiqn((unsigned char *)name);
12671247
if (IS_ERR(tiqn))
12681248
return ERR_CAST(tiqn);
1269-
/*
1270-
* Setup struct iscsi_wwn_stat_grps for se_wwn->fabric_stat_group.
1271-
*/
1272-
stats_cg = &tiqn->tiqn_wwn.fabric_stat_group;
1273-
1274-
stats_cg->default_groups = kmalloc(sizeof(struct config_group *) * 6,
1275-
GFP_KERNEL);
1276-
if (!stats_cg->default_groups) {
1277-
pr_err("Unable to allocate memory for"
1278-
" stats_cg->default_groups\n");
1279-
iscsit_del_tiqn(tiqn);
1280-
return ERR_PTR(-ENOMEM);
1281-
}
12821249

1283-
stats_cg->default_groups[0] = &tiqn->tiqn_stat_grps.iscsi_instance_group;
1284-
stats_cg->default_groups[1] = &tiqn->tiqn_stat_grps.iscsi_sess_err_group;
1285-
stats_cg->default_groups[2] = &tiqn->tiqn_stat_grps.iscsi_tgt_attr_group;
1286-
stats_cg->default_groups[3] = &tiqn->tiqn_stat_grps.iscsi_login_stats_group;
1287-
stats_cg->default_groups[4] = &tiqn->tiqn_stat_grps.iscsi_logout_stats_group;
1288-
stats_cg->default_groups[5] = NULL;
12891250
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group,
12901251
"iscsi_instance", &iscsi_stat_instance_cit);
1252+
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group,
1253+
&tiqn->tiqn_wwn.fabric_stat_group);
1254+
12911255
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
12921256
"iscsi_sess_err", &iscsi_stat_sess_err_cit);
1257+
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_sess_err_group,
1258+
&tiqn->tiqn_wwn.fabric_stat_group);
1259+
12931260
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
12941261
"iscsi_tgt_attr", &iscsi_stat_tgt_attr_cit);
1262+
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group,
1263+
&tiqn->tiqn_wwn.fabric_stat_group);
1264+
12951265
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
12961266
"iscsi_login_stats", &iscsi_stat_login_cit);
1267+
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_login_stats_group,
1268+
&tiqn->tiqn_wwn.fabric_stat_group);
1269+
12971270
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
12981271
"iscsi_logout_stats", &iscsi_stat_logout_cit);
1272+
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
1273+
&tiqn->tiqn_wwn.fabric_stat_group);
1274+
12991275

13001276
pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
13011277
pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
@@ -1307,17 +1283,8 @@ static void lio_target_call_coredeltiqn(
13071283
struct se_wwn *wwn)
13081284
{
13091285
struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
1310-
struct config_item *df_item;
1311-
struct config_group *stats_cg;
1312-
int i;
1313-
1314-
stats_cg = &tiqn->tiqn_wwn.fabric_stat_group;
1315-
for (i = 0; stats_cg->default_groups[i]; i++) {
1316-
df_item = &stats_cg->default_groups[i]->cg_item;
1317-
stats_cg->default_groups[i] = NULL;
1318-
config_item_put(df_item);
1319-
}
1320-
kfree(stats_cg->default_groups);
1286+
1287+
configfs_remove_default_groups(&tiqn->tiqn_wwn.fabric_stat_group);
13211288

13221289
pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n",
13231290
tiqn->tiqn);

0 commit comments

Comments
 (0)