diff options
author | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-06-10 05:30:17 -0300 |
---|---|---|
committer | André Fabian Silva Delgado <emulatorman@parabola.nu> | 2016-06-10 05:30:17 -0300 |
commit | d635711daa98be86d4c7fd01499c34f566b54ccb (patch) | |
tree | aa5cc3760a27c3d57146498cb82fa549547de06c /drivers/target/target_core_fabric_configfs.c | |
parent | c91265cd0efb83778f015b4d4b1129bd2cfd075e (diff) |
Linux-libre 4.6.2-gnu
Diffstat (limited to 'drivers/target/target_core_fabric_configfs.c')
-rw-r--r-- | drivers/target/target_core_fabric_configfs.c | 250 |
1 files changed, 76 insertions, 174 deletions
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c index f916d18cc..31a096aa1 100644 --- a/drivers/target/target_core_fabric_configfs.c +++ b/drivers/target/target_core_fabric_configfs.c @@ -78,7 +78,7 @@ static int target_fabric_mappedlun_link( struct se_lun_acl, se_lun_group); struct se_portal_group *se_tpg; struct config_item *nacl_ci, *tpg_ci, *tpg_ci_s, *wwn_ci, *wwn_ci_s; - int lun_access; + bool lun_access_ro; if (lun->lun_link_magic != SE_LUN_LINK_MAGIC) { pr_err("Bad lun->lun_link_magic, not a valid lun_ci pointer:" @@ -115,19 +115,18 @@ static int target_fabric_mappedlun_link( } /* * If this struct se_node_acl was dynamically generated with - * tpg_1/attrib/generate_node_acls=1, use the existing deve->lun_flags, - * which be will write protected (READ-ONLY) when + * tpg_1/attrib/generate_node_acls=1, use the existing + * deve->lun_access_ro value, which will be true when * tpg_1/attrib/demo_mode_write_protect=1 */ rcu_read_lock(); deve = target_nacl_find_deve(lacl->se_lun_nacl, lacl->mapped_lun); if (deve) - lun_access = deve->lun_flags; + lun_access_ro = deve->lun_access_ro; else - lun_access = + lun_access_ro = (se_tpg->se_tpg_tfo->tpg_check_prod_mode_write_protect( - se_tpg)) ? TRANSPORT_LUNFLAGS_READ_ONLY : - TRANSPORT_LUNFLAGS_READ_WRITE; + se_tpg)) ? true : false; rcu_read_unlock(); /* * Determine the actual mapped LUN value user wants.. @@ -135,7 +134,7 @@ static int target_fabric_mappedlun_link( * This value is what the SCSI Initiator actually sees the * $FABRIC/$WWPN/$TPGT/lun/lun_* as on their SCSI Initiator Ports. */ - return core_dev_add_initiator_node_lun_acl(se_tpg, lacl, lun, lun_access); + return core_dev_add_initiator_node_lun_acl(se_tpg, lacl, lun, lun_access_ro); } static int target_fabric_mappedlun_unlink( @@ -167,8 +166,7 @@ static ssize_t target_fabric_mappedlun_write_protect_show( rcu_read_lock(); deve = target_nacl_find_deve(se_nacl, lacl->mapped_lun); if (deve) { - len = sprintf(page, "%d\n", - (deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) ? 1 : 0); + len = sprintf(page, "%d\n", deve->lun_access_ro); } rcu_read_unlock(); @@ -181,25 +179,23 @@ static ssize_t target_fabric_mappedlun_write_protect_store( struct se_lun_acl *lacl = item_to_lun_acl(item); struct se_node_acl *se_nacl = lacl->se_lun_nacl; struct se_portal_group *se_tpg = se_nacl->se_tpg; - unsigned long op; + unsigned long wp; int ret; - ret = kstrtoul(page, 0, &op); + ret = kstrtoul(page, 0, &wp); if (ret) return ret; - if ((op != 1) && (op != 0)) + if ((wp != 1) && (wp != 0)) return -EINVAL; - core_update_device_list_access(lacl->mapped_lun, (op) ? - TRANSPORT_LUNFLAGS_READ_ONLY : - TRANSPORT_LUNFLAGS_READ_WRITE, - lacl->se_lun_nacl); + /* wp=1 means lun_access_ro=true */ + core_update_device_list_access(lacl->mapped_lun, wp, lacl->se_lun_nacl); pr_debug("%s_ConfigFS: Changed Initiator ACL: %s" " Mapped LUN: %llu Write Protect bit to %s\n", se_tpg->se_tpg_tfo->get_fabric_name(), - se_nacl->initiatorname, lacl->mapped_lun, (op) ? "ON" : "OFF"); + se_nacl->initiatorname, lacl->mapped_lun, (wp) ? "ON" : "OFF"); return count; @@ -273,18 +269,10 @@ static struct config_group *target_fabric_make_mappedlun( struct se_portal_group *se_tpg = se_nacl->se_tpg; struct target_fabric_configfs *tf = se_tpg->se_tpg_wwn->wwn_tf; struct se_lun_acl *lacl = NULL; - struct config_item *acl_ci; - struct config_group *lacl_cg = NULL, *ml_stat_grp = NULL; char *buf; unsigned long long mapped_lun; int ret = 0; - acl_ci = &group->cg_item; - if (!acl_ci) { - pr_err("Unable to locatel acl_ci\n"); - return NULL; - } - buf = kzalloc(strlen(name) + 1, GFP_KERNEL); if (!buf) { pr_err("Unable to allocate memory for name buf\n"); @@ -315,37 +303,19 @@ static struct config_group *target_fabric_make_mappedlun( goto out; } - lacl_cg = &lacl->se_lun_group; - lacl_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!lacl_cg->default_groups) { - pr_err("Unable to allocate lacl_cg->default_groups\n"); - ret = -ENOMEM; - goto out; - } - config_group_init_type_name(&lacl->se_lun_group, name, &tf->tf_tpg_mappedlun_cit); + config_group_init_type_name(&lacl->ml_stat_grps.stat_group, "statistics", &tf->tf_tpg_mappedlun_stat_cit); - lacl_cg->default_groups[0] = &lacl->ml_stat_grps.stat_group; - lacl_cg->default_groups[1] = NULL; - - ml_stat_grp = &lacl->ml_stat_grps.stat_group; - ml_stat_grp->default_groups = kmalloc(sizeof(struct config_group *) * 3, - GFP_KERNEL); - if (!ml_stat_grp->default_groups) { - pr_err("Unable to allocate ml_stat_grp->default_groups\n"); - ret = -ENOMEM; - goto out; - } + configfs_add_default_group(&lacl->ml_stat_grps.stat_group, + &lacl->se_lun_group); + target_stat_setup_mappedlun_default_groups(lacl); kfree(buf); return &lacl->se_lun_group; out: - if (lacl_cg) - kfree(lacl_cg->default_groups); kfree(lacl); kfree(buf); return ERR_PTR(ret); @@ -357,25 +327,9 @@ static void target_fabric_drop_mappedlun( { struct se_lun_acl *lacl = container_of(to_config_group(item), struct se_lun_acl, se_lun_group); - struct config_item *df_item; - struct config_group *lacl_cg = NULL, *ml_stat_grp = NULL; - int i; - - ml_stat_grp = &lacl->ml_stat_grps.stat_group; - for (i = 0; ml_stat_grp->default_groups[i]; i++) { - df_item = &ml_stat_grp->default_groups[i]->cg_item; - ml_stat_grp->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(ml_stat_grp->default_groups); - lacl_cg = &lacl->se_lun_group; - for (i = 0; lacl_cg->default_groups[i]; i++) { - df_item = &lacl_cg->default_groups[i]->cg_item; - lacl_cg->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(lacl_cg->default_groups); + configfs_remove_default_groups(&lacl->ml_stat_grps.stat_group); + configfs_remove_default_groups(&lacl->se_lun_group); config_item_put(item); } @@ -384,10 +338,8 @@ static void target_fabric_nacl_base_release(struct config_item *item) { struct se_node_acl *se_nacl = container_of(to_config_group(item), struct se_node_acl, acl_group); - struct target_fabric_configfs *tf = se_nacl->se_tpg->se_tpg_wwn->wwn_tf; - if (tf->tf_ops->fabric_cleanup_nodeacl) - tf->tf_ops->fabric_cleanup_nodeacl(se_nacl); + configfs_remove_default_groups(&se_nacl->acl_fabric_stat_group); core_tpg_del_initiator_node_acl(se_nacl); } @@ -424,38 +376,42 @@ static struct config_group *target_fabric_make_nodeacl( struct se_portal_group, tpg_acl_group); struct target_fabric_configfs *tf = se_tpg->se_tpg_wwn->wwn_tf; struct se_node_acl *se_nacl; - struct config_group *nacl_cg; se_nacl = core_tpg_add_initiator_node_acl(se_tpg, name); if (IS_ERR(se_nacl)) return ERR_CAST(se_nacl); - if (tf->tf_ops->fabric_init_nodeacl) { - int ret = tf->tf_ops->fabric_init_nodeacl(se_nacl, name); - if (ret) { - core_tpg_del_initiator_node_acl(se_nacl); - return ERR_PTR(ret); - } - } - - nacl_cg = &se_nacl->acl_group; - nacl_cg->default_groups = se_nacl->acl_default_groups; - nacl_cg->default_groups[0] = &se_nacl->acl_attrib_group; - nacl_cg->default_groups[1] = &se_nacl->acl_auth_group; - nacl_cg->default_groups[2] = &se_nacl->acl_param_group; - nacl_cg->default_groups[3] = &se_nacl->acl_fabric_stat_group; - nacl_cg->default_groups[4] = NULL; - config_group_init_type_name(&se_nacl->acl_group, name, &tf->tf_tpg_nacl_base_cit); + config_group_init_type_name(&se_nacl->acl_attrib_group, "attrib", &tf->tf_tpg_nacl_attrib_cit); + configfs_add_default_group(&se_nacl->acl_attrib_group, + &se_nacl->acl_group); + config_group_init_type_name(&se_nacl->acl_auth_group, "auth", &tf->tf_tpg_nacl_auth_cit); + configfs_add_default_group(&se_nacl->acl_auth_group, + &se_nacl->acl_group); + config_group_init_type_name(&se_nacl->acl_param_group, "param", &tf->tf_tpg_nacl_param_cit); + configfs_add_default_group(&se_nacl->acl_param_group, + &se_nacl->acl_group); + config_group_init_type_name(&se_nacl->acl_fabric_stat_group, "fabric_statistics", &tf->tf_tpg_nacl_stat_cit); + configfs_add_default_group(&se_nacl->acl_fabric_stat_group, + &se_nacl->acl_group); + + if (tf->tf_ops->fabric_init_nodeacl) { + int ret = tf->tf_ops->fabric_init_nodeacl(se_nacl, name); + if (ret) { + configfs_remove_default_groups(&se_nacl->acl_fabric_stat_group); + core_tpg_del_initiator_node_acl(se_nacl); + return ERR_PTR(ret); + } + } return &se_nacl->acl_group; } @@ -466,16 +422,9 @@ static void target_fabric_drop_nodeacl( { struct se_node_acl *se_nacl = container_of(to_config_group(item), struct se_node_acl, acl_group); - struct config_item *df_item; - struct config_group *nacl_cg; - int i; - - nacl_cg = &se_nacl->acl_group; - for (i = 0; nacl_cg->default_groups[i]; i++) { - df_item = &nacl_cg->default_groups[i]->cg_item; - nacl_cg->default_groups[i] = NULL; - config_item_put(df_item); - } + + configfs_remove_default_groups(&se_nacl->acl_group); + /* * struct se_node_acl free is done in target_fabric_nacl_base_release() */ @@ -795,7 +744,6 @@ static struct config_group *target_fabric_make_lun( struct se_portal_group *se_tpg = container_of(group, struct se_portal_group, tpg_lun_group); struct target_fabric_configfs *tf = se_tpg->se_tpg_wwn->wwn_tf; - struct config_group *lun_cg = NULL, *port_stat_grp = NULL; unsigned long long unpacked_lun; int errno; @@ -812,31 +760,14 @@ static struct config_group *target_fabric_make_lun( if (IS_ERR(lun)) return ERR_CAST(lun); - lun_cg = &lun->lun_group; - lun_cg->default_groups = kmalloc(sizeof(struct config_group *) * 2, - GFP_KERNEL); - if (!lun_cg->default_groups) { - pr_err("Unable to allocate lun_cg->default_groups\n"); - kfree(lun); - return ERR_PTR(-ENOMEM); - } - config_group_init_type_name(&lun->lun_group, name, &tf->tf_tpg_port_cit); + config_group_init_type_name(&lun->port_stat_grps.stat_group, "statistics", &tf->tf_tpg_port_stat_cit); - lun_cg->default_groups[0] = &lun->port_stat_grps.stat_group; - lun_cg->default_groups[1] = NULL; - - port_stat_grp = &lun->port_stat_grps.stat_group; - port_stat_grp->default_groups = kzalloc(sizeof(struct config_group *) * 4, - GFP_KERNEL); - if (!port_stat_grp->default_groups) { - pr_err("Unable to allocate port_stat_grp->default_groups\n"); - kfree(lun_cg->default_groups); - kfree(lun); - return ERR_PTR(-ENOMEM); - } + configfs_add_default_group(&lun->port_stat_grps.stat_group, + &lun->lun_group); + target_stat_setup_port_default_groups(lun); return &lun->lun_group; @@ -848,25 +779,9 @@ static void target_fabric_drop_lun( { struct se_lun *lun = container_of(to_config_group(item), struct se_lun, lun_group); - struct config_item *df_item; - struct config_group *lun_cg, *port_stat_grp; - int i; - - port_stat_grp = &lun->port_stat_grps.stat_group; - for (i = 0; port_stat_grp->default_groups[i]; i++) { - df_item = &port_stat_grp->default_groups[i]->cg_item; - port_stat_grp->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(port_stat_grp->default_groups); - lun_cg = &lun->lun_group; - for (i = 0; lun_cg->default_groups[i]; i++) { - df_item = &lun_cg->default_groups[i]->cg_item; - lun_cg->default_groups[i] = NULL; - config_item_put(df_item); - } - kfree(lun_cg->default_groups); + configfs_remove_default_groups(&lun->port_stat_grps.stat_group); + configfs_remove_default_groups(&lun->lun_group); config_item_put(item); } @@ -922,32 +837,39 @@ static struct config_group *target_fabric_make_tpg( se_tpg = tf->tf_ops->fabric_make_tpg(wwn, group, name); if (!se_tpg || IS_ERR(se_tpg)) return ERR_PTR(-EINVAL); - /* - * Setup default groups from pre-allocated se_tpg->tpg_default_groups - */ - se_tpg->tpg_group.default_groups = se_tpg->tpg_default_groups; - se_tpg->tpg_group.default_groups[0] = &se_tpg->tpg_lun_group; - se_tpg->tpg_group.default_groups[1] = &se_tpg->tpg_np_group; - se_tpg->tpg_group.default_groups[2] = &se_tpg->tpg_acl_group; - se_tpg->tpg_group.default_groups[3] = &se_tpg->tpg_attrib_group; - se_tpg->tpg_group.default_groups[4] = &se_tpg->tpg_auth_group; - se_tpg->tpg_group.default_groups[5] = &se_tpg->tpg_param_group; - se_tpg->tpg_group.default_groups[6] = NULL; config_group_init_type_name(&se_tpg->tpg_group, name, &tf->tf_tpg_base_cit); + config_group_init_type_name(&se_tpg->tpg_lun_group, "lun", &tf->tf_tpg_lun_cit); + configfs_add_default_group(&se_tpg->tpg_lun_group, + &se_tpg->tpg_group); + config_group_init_type_name(&se_tpg->tpg_np_group, "np", &tf->tf_tpg_np_cit); + configfs_add_default_group(&se_tpg->tpg_np_group, + &se_tpg->tpg_group); + config_group_init_type_name(&se_tpg->tpg_acl_group, "acls", &tf->tf_tpg_nacl_cit); + configfs_add_default_group(&se_tpg->tpg_acl_group, + &se_tpg->tpg_group); + config_group_init_type_name(&se_tpg->tpg_attrib_group, "attrib", &tf->tf_tpg_attrib_cit); + configfs_add_default_group(&se_tpg->tpg_attrib_group, + &se_tpg->tpg_group); + config_group_init_type_name(&se_tpg->tpg_auth_group, "auth", &tf->tf_tpg_auth_cit); + configfs_add_default_group(&se_tpg->tpg_auth_group, + &se_tpg->tpg_group); + config_group_init_type_name(&se_tpg->tpg_param_group, "param", &tf->tf_tpg_param_cit); + configfs_add_default_group(&se_tpg->tpg_param_group, + &se_tpg->tpg_group); return &se_tpg->tpg_group; } @@ -958,19 +880,8 @@ static void target_fabric_drop_tpg( { struct se_portal_group *se_tpg = container_of(to_config_group(item), struct se_portal_group, tpg_group); - struct config_group *tpg_cg = &se_tpg->tpg_group; - struct config_item *df_item; - int i; - /* - * Release default groups, but do not release tpg_cg->default_groups - * memory as it is statically allocated at se_tpg->tpg_default_groups. - */ - for (i = 0; tpg_cg->default_groups[i]; i++) { - df_item = &tpg_cg->default_groups[i]->cg_item; - tpg_cg->default_groups[i] = NULL; - config_item_put(df_item); - } + configfs_remove_default_groups(&se_tpg->tpg_group); config_item_put(item); } @@ -980,6 +891,7 @@ static void target_fabric_release_wwn(struct config_item *item) struct se_wwn, wwn_group); struct target_fabric_configfs *tf = wwn->wwn_tf; + configfs_remove_default_groups(&wwn->fabric_stat_group); tf->tf_ops->fabric_drop_wwn(wwn); } @@ -1026,17 +938,15 @@ static struct config_group *target_fabric_make_wwn( return ERR_PTR(-EINVAL); wwn->wwn_tf = tf; - /* - * Setup default groups from pre-allocated wwn->wwn_default_groups - */ - wwn->wwn_group.default_groups = wwn->wwn_default_groups; - wwn->wwn_group.default_groups[0] = &wwn->fabric_stat_group; - wwn->wwn_group.default_groups[1] = NULL; config_group_init_type_name(&wwn->wwn_group, name, &tf->tf_tpg_cit); + config_group_init_type_name(&wwn->fabric_stat_group, "fabric_statistics", &tf->tf_wwn_fabric_stats_cit); + configfs_add_default_group(&wwn->fabric_stat_group, &wwn->wwn_group); + if (tf->tf_ops->add_wwn_groups) + tf->tf_ops->add_wwn_groups(wwn); return &wwn->wwn_group; } @@ -1046,16 +956,8 @@ static void target_fabric_drop_wwn( { struct se_wwn *wwn = container_of(to_config_group(item), struct se_wwn, wwn_group); - struct config_item *df_item; - struct config_group *cg = &wwn->wwn_group; - int i; - - for (i = 0; cg->default_groups[i]; i++) { - df_item = &cg->default_groups[i]->cg_item; - cg->default_groups[i] = NULL; - config_item_put(df_item); - } + configfs_remove_default_groups(&wwn->wwn_group); config_item_put(item); } |