diff options
author | Christoph Hellwig <hch@lst.de> | 2016-02-26 13:02:14 +0300 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2016-03-06 18:11:24 +0300 |
commit | 1ae1602de028acaa42a0f6ff18d19756f8e825c6 (patch) | |
tree | 3370e5c29945370f62b9c72adeec587ed102d048 /drivers/target/target_core_configfs.c | |
parent | b1f1a29d8fb5eeaeec2cafe4c62f276d950c015b (diff) | |
download | linux-1ae1602de028acaa42a0f6ff18d19756f8e825c6.tar.xz |
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 <hch@lst.de>
Acked-by: Felipe Balbi <balbi@kernel.org> [drivers/usb/gadget]
Acked-by: Joel Becker <jlbec@evilplan.org>
Acked-by: Nicholas Bellinger <nab@linux-iscsi.org>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Diffstat (limited to 'drivers/target/target_core_configfs.c')
-rw-r--r-- | drivers/target/target_core_configfs.c | 203 |
1 files changed, 40 insertions, 163 deletions
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c index 713c63d9681b..d498533f09ee 100644 --- a/drivers/target/target_core_configfs.c +++ b/drivers/target/target_core_configfs.c @@ -194,13 +194,11 @@ static struct config_group *target_core_register_fabric( pr_debug("Target_Core_ConfigFS: REGISTER tfc_wwn_cit -> %p\n", &tf->tf_wwn_cit); - tf->tf_group.default_groups = tf->tf_default_groups; - tf->tf_group.default_groups[0] = &tf->tf_disc_group; - tf->tf_group.default_groups[1] = NULL; - config_group_init_type_name(&tf->tf_group, name, &tf->tf_wwn_cit); + config_group_init_type_name(&tf->tf_disc_group, "discovery_auth", &tf->tf_discovery_cit); + configfs_add_default_group(&tf->tf_disc_group, &tf->tf_group); pr_debug("Target_Core_ConfigFS: REGISTER -> Allocated Fabric:" " %s\n", tf->tf_group.cg_item.ci_name); @@ -216,9 +214,6 @@ static void target_core_deregister_fabric( { struct target_fabric_configfs *tf = container_of( to_config_group(item), struct target_fabric_configfs, tf_group); - struct config_group *tf_group; - struct config_item *df_item; - int i; pr_debug("Target_Core_ConfigFS: DEREGISTER -> Looking up %s in" " tf list\n", config_item_name(item)); @@ -230,12 +225,7 @@ static void target_core_deregister_fabric( pr_debug("Target_Core_ConfigFS: DEREGISTER -> Releasing ci" " %s\n", config_item_name(item)); - tf_group = &tf->tf_group; - for (i = 0; tf_group->default_groups[i]; i++) { - df_item = &tf_group->default_groups[i]->cg_item; - tf_group->default_groups[i] = NULL; - config_item_put(df_item); - } + configfs_remove_default_groups(&tf->tf_group); config_item_put(item); } @@ -2151,7 +2141,6 @@ static void target_core_dev_release(struct config_item *item) struct se_device *dev = container_of(dev_cg, struct se_device, dev_group); - kfree(dev_cg->default_groups); target_free_device(dev); } @@ -2819,8 +2808,6 @@ static struct config_group *target_core_make_subdev( struct se_hba *hba = item_to_hba(hba_ci); struct target_backend *tb = hba->backend; struct se_device *dev; - struct config_group *dev_cg = NULL, *tg_pt_gp_cg = NULL; - struct config_group *dev_stat_grp = NULL; int errno = -ENOMEM, ret; ret = mutex_lock_interruptible(&hba->hba_access_mutex); @@ -2831,73 +2818,52 @@ static struct config_group *target_core_make_subdev( if (!dev) goto out_unlock; - dev_cg = &dev->dev_group; - - dev_cg->default_groups = kmalloc(sizeof(struct config_group *) * 6, - GFP_KERNEL); - if (!dev_cg->default_groups) - goto out_free_device; + config_group_init_type_name(&dev->dev_group, name, &tb->tb_dev_cit); - config_group_init_type_name(dev_cg, name, &tb->tb_dev_cit); config_group_init_type_name(&dev->dev_attrib.da_group, "attrib", &tb->tb_dev_attrib_cit); + configfs_add_default_group(&dev->dev_attrib.da_group, &dev->dev_group); + config_group_init_type_name(&dev->dev_pr_group, "pr", &tb->tb_dev_pr_cit); + configfs_add_default_group(&dev->dev_pr_group, &dev->dev_group); + config_group_init_type_name(&dev->t10_wwn.t10_wwn_group, "wwn", &tb->tb_dev_wwn_cit); + configfs_add_default_group(&dev->t10_wwn.t10_wwn_group, + &dev->dev_group); + config_group_init_type_name(&dev->t10_alua.alua_tg_pt_gps_group, "alua", &tb->tb_dev_alua_tg_pt_gps_cit); + configfs_add_default_group(&dev->t10_alua.alua_tg_pt_gps_group, + &dev->dev_group); + config_group_init_type_name(&dev->dev_stat_grps.stat_group, "statistics", &tb->tb_dev_stat_cit); + configfs_add_default_group(&dev->dev_stat_grps.stat_group, + &dev->dev_group); - dev_cg->default_groups[0] = &dev->dev_attrib.da_group; - dev_cg->default_groups[1] = &dev->dev_pr_group; - dev_cg->default_groups[2] = &dev->t10_wwn.t10_wwn_group; - dev_cg->default_groups[3] = &dev->t10_alua.alua_tg_pt_gps_group; - dev_cg->default_groups[4] = &dev->dev_stat_grps.stat_group; - dev_cg->default_groups[5] = NULL; /* * Add core/$HBA/$DEV/alua/default_tg_pt_gp */ tg_pt_gp = core_alua_allocate_tg_pt_gp(dev, "default_tg_pt_gp", 1); if (!tg_pt_gp) - goto out_free_dev_cg_default_groups; + goto out_free_device; dev->t10_alua.default_tg_pt_gp = tg_pt_gp; - tg_pt_gp_cg = &dev->t10_alua.alua_tg_pt_gps_group; - tg_pt_gp_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!tg_pt_gp_cg->default_groups) { - pr_err("Unable to allocate tg_pt_gp_cg->" - "default_groups\n"); - goto out_free_tg_pt_gp; - } - config_group_init_type_name(&tg_pt_gp->tg_pt_gp_group, "default_tg_pt_gp", &target_core_alua_tg_pt_gp_cit); - tg_pt_gp_cg->default_groups[0] = &tg_pt_gp->tg_pt_gp_group; - tg_pt_gp_cg->default_groups[1] = NULL; + configfs_add_default_group(&tg_pt_gp->tg_pt_gp_group, + &dev->t10_alua.alua_tg_pt_gps_group); + /* * Add core/$HBA/$DEV/statistics/ default groups */ - dev_stat_grp = &dev->dev_stat_grps.stat_group; - dev_stat_grp->default_groups = kmalloc(sizeof(struct config_group *) * 4, - GFP_KERNEL); - if (!dev_stat_grp->default_groups) { - pr_err("Unable to allocate dev_stat_grp->default_groups\n"); - goto out_free_tg_pt_gp_cg_default_groups; - } target_stat_setup_dev_default_groups(dev); mutex_unlock(&hba->hba_access_mutex); - return dev_cg; + return &dev->dev_group; -out_free_tg_pt_gp_cg_default_groups: - kfree(tg_pt_gp_cg->default_groups); -out_free_tg_pt_gp: - core_alua_free_tg_pt_gp(tg_pt_gp); -out_free_dev_cg_default_groups: - kfree(dev_cg->default_groups); out_free_device: target_free_device(dev); out_unlock: @@ -2913,40 +2879,22 @@ static void target_core_drop_subdev( struct se_device *dev = container_of(dev_cg, struct se_device, dev_group); struct se_hba *hba; - struct config_item *df_item; - struct config_group *tg_pt_gp_cg, *dev_stat_grp; - int i; hba = item_to_hba(&dev->se_hba->hba_group.cg_item); mutex_lock(&hba->hba_access_mutex); - dev_stat_grp = &dev->dev_stat_grps.stat_group; - for (i = 0; dev_stat_grp->default_groups[i]; i++) { - df_item = &dev_stat_grp->default_groups[i]->cg_item; - dev_stat_grp->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(dev_stat_grp->default_groups); + configfs_remove_default_groups(&dev->dev_stat_grps.stat_group); + configfs_remove_default_groups(&dev->t10_alua.alua_tg_pt_gps_group); - tg_pt_gp_cg = &dev->t10_alua.alua_tg_pt_gps_group; - for (i = 0; tg_pt_gp_cg->default_groups[i]; i++) { - df_item = &tg_pt_gp_cg->default_groups[i]->cg_item; - tg_pt_gp_cg->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(tg_pt_gp_cg->default_groups); /* * core_alua_free_tg_pt_gp() is called from ->default_tg_pt_gp * directly from target_core_alua_tg_pt_gp_release(). */ dev->t10_alua.default_tg_pt_gp = NULL; - for (i = 0; dev_cg->default_groups[i]; i++) { - df_item = &dev_cg->default_groups[i]->cg_item; - dev_cg->default_groups[i] = NULL; - config_item_put(df_item); - } + configfs_remove_default_groups(dev_cg); + /* * se_dev is released from target_core_dev_item_ops->release() */ @@ -3141,8 +3089,6 @@ void target_setup_backend_cits(struct target_backend *tb) static int __init target_core_init_configfs(void) { - struct config_group *target_cg, *hba_cg = NULL, *alua_cg = NULL; - struct config_group *lu_gp_cg = NULL; struct configfs_subsystem *subsys = &target_core_fabrics; struct t10_alua_lu_gp *lu_gp; int ret; @@ -3161,51 +3107,24 @@ static int __init target_core_init_configfs(void) * Create $CONFIGFS/target/core default group for HBA <-> Storage Object * and ALUA Logical Unit Group and Target Port Group infrastructure. */ - target_cg = &subsys->su_group; - target_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!target_cg->default_groups) { - pr_err("Unable to allocate target_cg->default_groups\n"); - ret = -ENOMEM; - goto out_global; - } + config_group_init_type_name(&target_core_hbagroup, "core", + &target_core_cit); + configfs_add_default_group(&target_core_hbagroup, &subsys->su_group); - config_group_init_type_name(&target_core_hbagroup, - "core", &target_core_cit); - target_cg->default_groups[0] = &target_core_hbagroup; - target_cg->default_groups[1] = NULL; /* * Create ALUA infrastructure under /sys/kernel/config/target/core/alua/ */ - hba_cg = &target_core_hbagroup; - hba_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!hba_cg->default_groups) { - pr_err("Unable to allocate hba_cg->default_groups\n"); - ret = -ENOMEM; - goto out_global; - } - config_group_init_type_name(&alua_group, - "alua", &target_core_alua_cit); - hba_cg->default_groups[0] = &alua_group; - hba_cg->default_groups[1] = NULL; + config_group_init_type_name(&alua_group, "alua", &target_core_alua_cit); + configfs_add_default_group(&alua_group, &target_core_hbagroup); + /* * Add ALUA Logical Unit Group and Target Port Group ConfigFS * groups under /sys/kernel/config/target/core/alua/ */ - alua_cg = &alua_group; - alua_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!alua_cg->default_groups) { - pr_err("Unable to allocate alua_cg->default_groups\n"); - ret = -ENOMEM; - goto out_global; - } + config_group_init_type_name(&alua_lu_gps_group, "lu_gps", + &target_core_alua_lu_gps_cit); + configfs_add_default_group(&alua_lu_gps_group, &alua_group); - config_group_init_type_name(&alua_lu_gps_group, - "lu_gps", &target_core_alua_lu_gps_cit); - alua_cg->default_groups[0] = &alua_lu_gps_group; - alua_cg->default_groups[1] = NULL; /* * Add core/alua/lu_gps/default_lu_gp */ @@ -3215,20 +3134,12 @@ static int __init target_core_init_configfs(void) goto out_global; } - lu_gp_cg = &alua_lu_gps_group; - lu_gp_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!lu_gp_cg->default_groups) { - pr_err("Unable to allocate lu_gp_cg->default_groups\n"); - ret = -ENOMEM; - goto out_global; - } - config_group_init_type_name(&lu_gp->lu_gp_group, "default_lu_gp", &target_core_alua_lu_gp_cit); - lu_gp_cg->default_groups[0] = &lu_gp->lu_gp_group; - lu_gp_cg->default_groups[1] = NULL; + configfs_add_default_group(&lu_gp->lu_gp_group, &alua_lu_gps_group); + default_lu_gp = lu_gp; + /* * Register the target_core_mod subsystem with configfs. */ @@ -3267,55 +3178,21 @@ out_global: core_alua_free_lu_gp(default_lu_gp); default_lu_gp = NULL; } - if (lu_gp_cg) - kfree(lu_gp_cg->default_groups); - if (alua_cg) - kfree(alua_cg->default_groups); - if (hba_cg) - kfree(hba_cg->default_groups); - kfree(target_cg->default_groups); release_se_kmem_caches(); return ret; } static void __exit target_core_exit_configfs(void) { - struct config_group *hba_cg, *alua_cg, *lu_gp_cg; - struct config_item *item; - int i; + configfs_remove_default_groups(&alua_lu_gps_group); + configfs_remove_default_groups(&alua_group); + configfs_remove_default_groups(&target_core_hbagroup); - lu_gp_cg = &alua_lu_gps_group; - for (i = 0; lu_gp_cg->default_groups[i]; i++) { - item = &lu_gp_cg->default_groups[i]->cg_item; - lu_gp_cg->default_groups[i] = NULL; - config_item_put(item); - } - kfree(lu_gp_cg->default_groups); - lu_gp_cg->default_groups = NULL; - - alua_cg = &alua_group; - for (i = 0; alua_cg->default_groups[i]; i++) { - item = &alua_cg->default_groups[i]->cg_item; - alua_cg->default_groups[i] = NULL; - config_item_put(item); - } - kfree(alua_cg->default_groups); - alua_cg->default_groups = NULL; - - hba_cg = &target_core_hbagroup; - for (i = 0; hba_cg->default_groups[i]; i++) { - item = &hba_cg->default_groups[i]->cg_item; - hba_cg->default_groups[i] = NULL; - config_item_put(item); - } - kfree(hba_cg->default_groups); - hba_cg->default_groups = NULL; /* * We expect subsys->su_group.default_groups to be released * by configfs subsystem provider logic.. */ configfs_unregister_subsystem(&target_core_fabrics); - kfree(target_core_fabrics.su_group.default_groups); core_alua_free_lu_gp(default_lu_gp); default_lu_gp = NULL; |