18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/******************************************************************************* 38c2ecf20Sopenharmony_ci * This file contains the configfs implementation for iSCSI Target mode 48c2ecf20Sopenharmony_ci * from the LIO-Target Project. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * (c) Copyright 2007-2013 Datera, Inc. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Author: Nicholas A. Bellinger <nab@linux-iscsi.org> 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci ****************************************************************************/ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/configfs.h> 138c2ecf20Sopenharmony_ci#include <linux/ctype.h> 148c2ecf20Sopenharmony_ci#include <linux/export.h> 158c2ecf20Sopenharmony_ci#include <linux/inet.h> 168c2ecf20Sopenharmony_ci#include <linux/module.h> 178c2ecf20Sopenharmony_ci#include <net/ipv6.h> 188c2ecf20Sopenharmony_ci#include <target/target_core_base.h> 198c2ecf20Sopenharmony_ci#include <target/target_core_fabric.h> 208c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_transport.h> 218c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_target_core.h> 228c2ecf20Sopenharmony_ci#include "iscsi_target_parameters.h" 238c2ecf20Sopenharmony_ci#include "iscsi_target_device.h" 248c2ecf20Sopenharmony_ci#include "iscsi_target_erl0.h" 258c2ecf20Sopenharmony_ci#include "iscsi_target_nodeattrib.h" 268c2ecf20Sopenharmony_ci#include "iscsi_target_tpg.h" 278c2ecf20Sopenharmony_ci#include "iscsi_target_util.h" 288c2ecf20Sopenharmony_ci#include "iscsi_target.h" 298c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_target_stat.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci/* Start items for lio_target_portal_cit */ 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic inline struct iscsi_tpg_np *to_iscsi_tpg_np(struct config_item *item) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci return container_of(to_tpg_np(item), struct iscsi_tpg_np, se_tpg_np); 378c2ecf20Sopenharmony_ci} 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_driver_show(struct config_item *item, char *page, 408c2ecf20Sopenharmony_ci enum iscsit_transport_type type) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item); 438c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np_new; 448c2ecf20Sopenharmony_ci ssize_t rb; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type); 478c2ecf20Sopenharmony_ci if (tpg_np_new) 488c2ecf20Sopenharmony_ci rb = sprintf(page, "1\n"); 498c2ecf20Sopenharmony_ci else 508c2ecf20Sopenharmony_ci rb = sprintf(page, "0\n"); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci return rb; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_driver_store(struct config_item *item, 568c2ecf20Sopenharmony_ci const char *page, size_t count, enum iscsit_transport_type type, 578c2ecf20Sopenharmony_ci const char *mod_name) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np = to_iscsi_tpg_np(item); 608c2ecf20Sopenharmony_ci struct iscsi_np *np; 618c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg; 628c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np_new = NULL; 638c2ecf20Sopenharmony_ci u32 op; 648c2ecf20Sopenharmony_ci int rc; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci rc = kstrtou32(page, 0, &op); 678c2ecf20Sopenharmony_ci if (rc) 688c2ecf20Sopenharmony_ci return rc; 698c2ecf20Sopenharmony_ci if ((op != 1) && (op != 0)) { 708c2ecf20Sopenharmony_ci pr_err("Illegal value for tpg_enable: %u\n", op); 718c2ecf20Sopenharmony_ci return -EINVAL; 728c2ecf20Sopenharmony_ci } 738c2ecf20Sopenharmony_ci np = tpg_np->tpg_np; 748c2ecf20Sopenharmony_ci if (!np) { 758c2ecf20Sopenharmony_ci pr_err("Unable to locate struct iscsi_np from" 768c2ecf20Sopenharmony_ci " struct iscsi_tpg_np\n"); 778c2ecf20Sopenharmony_ci return -EINVAL; 788c2ecf20Sopenharmony_ci } 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci tpg = tpg_np->tpg; 818c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) 828c2ecf20Sopenharmony_ci return -EINVAL; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci if (op) { 858c2ecf20Sopenharmony_ci if (strlen(mod_name)) { 868c2ecf20Sopenharmony_ci rc = request_module(mod_name); 878c2ecf20Sopenharmony_ci if (rc != 0) { 888c2ecf20Sopenharmony_ci pr_warn("Unable to request_module for %s\n", 898c2ecf20Sopenharmony_ci mod_name); 908c2ecf20Sopenharmony_ci rc = 0; 918c2ecf20Sopenharmony_ci } 928c2ecf20Sopenharmony_ci } 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci tpg_np_new = iscsit_tpg_add_network_portal(tpg, 958c2ecf20Sopenharmony_ci &np->np_sockaddr, tpg_np, type); 968c2ecf20Sopenharmony_ci if (IS_ERR(tpg_np_new)) { 978c2ecf20Sopenharmony_ci rc = PTR_ERR(tpg_np_new); 988c2ecf20Sopenharmony_ci goto out; 998c2ecf20Sopenharmony_ci } 1008c2ecf20Sopenharmony_ci } else { 1018c2ecf20Sopenharmony_ci tpg_np_new = iscsit_tpg_locate_child_np(tpg_np, type); 1028c2ecf20Sopenharmony_ci if (tpg_np_new) { 1038c2ecf20Sopenharmony_ci rc = iscsit_tpg_del_network_portal(tpg, tpg_np_new); 1048c2ecf20Sopenharmony_ci if (rc < 0) 1058c2ecf20Sopenharmony_ci goto out; 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci } 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 1108c2ecf20Sopenharmony_ci return count; 1118c2ecf20Sopenharmony_ciout: 1128c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 1138c2ecf20Sopenharmony_ci return rc; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_iser_show(struct config_item *item, char *page) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci return lio_target_np_driver_show(item, page, ISCSI_INFINIBAND); 1198c2ecf20Sopenharmony_ci} 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_iser_store(struct config_item *item, 1228c2ecf20Sopenharmony_ci const char *page, size_t count) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci return lio_target_np_driver_store(item, page, count, 1258c2ecf20Sopenharmony_ci ISCSI_INFINIBAND, "ib_isert"); 1268c2ecf20Sopenharmony_ci} 1278c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_np_, iser); 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_cxgbit_show(struct config_item *item, char *page) 1308c2ecf20Sopenharmony_ci{ 1318c2ecf20Sopenharmony_ci return lio_target_np_driver_show(item, page, ISCSI_CXGBIT); 1328c2ecf20Sopenharmony_ci} 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_cistatic ssize_t lio_target_np_cxgbit_store(struct config_item *item, 1358c2ecf20Sopenharmony_ci const char *page, size_t count) 1368c2ecf20Sopenharmony_ci{ 1378c2ecf20Sopenharmony_ci return lio_target_np_driver_store(item, page, count, 1388c2ecf20Sopenharmony_ci ISCSI_CXGBIT, "cxgbit"); 1398c2ecf20Sopenharmony_ci} 1408c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_np_, cxgbit); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_portal_attrs[] = { 1438c2ecf20Sopenharmony_ci &lio_target_np_attr_iser, 1448c2ecf20Sopenharmony_ci &lio_target_np_attr_cxgbit, 1458c2ecf20Sopenharmony_ci NULL, 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci/* Stop items for lio_target_portal_cit */ 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci/* Start items for lio_target_np_cit */ 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci#define MAX_PORTAL_LEN 256 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_cistatic struct se_tpg_np *lio_target_call_addnptotpg( 1558c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg, 1568c2ecf20Sopenharmony_ci struct config_group *group, 1578c2ecf20Sopenharmony_ci const char *name) 1588c2ecf20Sopenharmony_ci{ 1598c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg; 1608c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np; 1618c2ecf20Sopenharmony_ci char *str, *str2, *ip_str, *port_str; 1628c2ecf20Sopenharmony_ci struct sockaddr_storage sockaddr = { }; 1638c2ecf20Sopenharmony_ci int ret; 1648c2ecf20Sopenharmony_ci char buf[MAX_PORTAL_LEN + 1]; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci if (strlen(name) > MAX_PORTAL_LEN) { 1678c2ecf20Sopenharmony_ci pr_err("strlen(name): %d exceeds MAX_PORTAL_LEN: %d\n", 1688c2ecf20Sopenharmony_ci (int)strlen(name), MAX_PORTAL_LEN); 1698c2ecf20Sopenharmony_ci return ERR_PTR(-EOVERFLOW); 1708c2ecf20Sopenharmony_ci } 1718c2ecf20Sopenharmony_ci memset(buf, 0, MAX_PORTAL_LEN + 1); 1728c2ecf20Sopenharmony_ci snprintf(buf, MAX_PORTAL_LEN + 1, "%s", name); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci str = strstr(buf, "["); 1758c2ecf20Sopenharmony_ci if (str) { 1768c2ecf20Sopenharmony_ci str2 = strstr(str, "]"); 1778c2ecf20Sopenharmony_ci if (!str2) { 1788c2ecf20Sopenharmony_ci pr_err("Unable to locate trailing \"]\"" 1798c2ecf20Sopenharmony_ci " in IPv6 iSCSI network portal address\n"); 1808c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 1818c2ecf20Sopenharmony_ci } 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci ip_str = str + 1; /* Skip over leading "[" */ 1848c2ecf20Sopenharmony_ci *str2 = '\0'; /* Terminate the unbracketed IPv6 address */ 1858c2ecf20Sopenharmony_ci str2++; /* Skip over the \0 */ 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci port_str = strstr(str2, ":"); 1888c2ecf20Sopenharmony_ci if (!port_str) { 1898c2ecf20Sopenharmony_ci pr_err("Unable to locate \":port\"" 1908c2ecf20Sopenharmony_ci " in IPv6 iSCSI network portal address\n"); 1918c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 1928c2ecf20Sopenharmony_ci } 1938c2ecf20Sopenharmony_ci *port_str = '\0'; /* Terminate string for IP */ 1948c2ecf20Sopenharmony_ci port_str++; /* Skip over ":" */ 1958c2ecf20Sopenharmony_ci } else { 1968c2ecf20Sopenharmony_ci ip_str = &buf[0]; 1978c2ecf20Sopenharmony_ci port_str = strstr(ip_str, ":"); 1988c2ecf20Sopenharmony_ci if (!port_str) { 1998c2ecf20Sopenharmony_ci pr_err("Unable to locate \":port\"" 2008c2ecf20Sopenharmony_ci " in IPv4 iSCSI network portal address\n"); 2018c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 2028c2ecf20Sopenharmony_ci } 2038c2ecf20Sopenharmony_ci *port_str = '\0'; /* Terminate string for IP */ 2048c2ecf20Sopenharmony_ci port_str++; /* Skip over ":" */ 2058c2ecf20Sopenharmony_ci } 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci ret = inet_pton_with_scope(&init_net, AF_UNSPEC, ip_str, 2088c2ecf20Sopenharmony_ci port_str, &sockaddr); 2098c2ecf20Sopenharmony_ci if (ret) { 2108c2ecf20Sopenharmony_ci pr_err("malformed ip/port passed: %s\n", name); 2118c2ecf20Sopenharmony_ci return ERR_PTR(ret); 2128c2ecf20Sopenharmony_ci } 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg); 2158c2ecf20Sopenharmony_ci ret = iscsit_get_tpg(tpg); 2168c2ecf20Sopenharmony_ci if (ret < 0) 2178c2ecf20Sopenharmony_ci return ERR_PTR(-EINVAL); 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: REGISTER -> %s TPGT: %hu" 2208c2ecf20Sopenharmony_ci " PORTAL: %s\n", 2218c2ecf20Sopenharmony_ci config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item), 2228c2ecf20Sopenharmony_ci tpg->tpgt, name); 2238c2ecf20Sopenharmony_ci /* 2248c2ecf20Sopenharmony_ci * Assume ISCSI_TCP by default. Other network portals for other 2258c2ecf20Sopenharmony_ci * iSCSI fabrics: 2268c2ecf20Sopenharmony_ci * 2278c2ecf20Sopenharmony_ci * Traditional iSCSI over SCTP (initial support) 2288c2ecf20Sopenharmony_ci * iSER/TCP (TODO, hardware available) 2298c2ecf20Sopenharmony_ci * iSER/SCTP (TODO, software emulation with osc-iwarp) 2308c2ecf20Sopenharmony_ci * iSER/IB (TODO, hardware available) 2318c2ecf20Sopenharmony_ci * 2328c2ecf20Sopenharmony_ci * can be enabled with attributes under 2338c2ecf20Sopenharmony_ci * sys/kernel/config/iscsi/$IQN/$TPG/np/$IP:$PORT/ 2348c2ecf20Sopenharmony_ci * 2358c2ecf20Sopenharmony_ci */ 2368c2ecf20Sopenharmony_ci tpg_np = iscsit_tpg_add_network_portal(tpg, &sockaddr, NULL, 2378c2ecf20Sopenharmony_ci ISCSI_TCP); 2388c2ecf20Sopenharmony_ci if (IS_ERR(tpg_np)) { 2398c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 2408c2ecf20Sopenharmony_ci return ERR_CAST(tpg_np); 2418c2ecf20Sopenharmony_ci } 2428c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: addnptotpg done!\n"); 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 2458c2ecf20Sopenharmony_ci return &tpg_np->se_tpg_np; 2468c2ecf20Sopenharmony_ci} 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistatic void lio_target_call_delnpfromtpg( 2498c2ecf20Sopenharmony_ci struct se_tpg_np *se_tpg_np) 2508c2ecf20Sopenharmony_ci{ 2518c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg; 2528c2ecf20Sopenharmony_ci struct iscsi_tpg_np *tpg_np; 2538c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg; 2548c2ecf20Sopenharmony_ci int ret; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci tpg_np = container_of(se_tpg_np, struct iscsi_tpg_np, se_tpg_np); 2578c2ecf20Sopenharmony_ci tpg = tpg_np->tpg; 2588c2ecf20Sopenharmony_ci ret = iscsit_get_tpg(tpg); 2598c2ecf20Sopenharmony_ci if (ret < 0) 2608c2ecf20Sopenharmony_ci return; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci se_tpg = &tpg->tpg_se_tpg; 2638c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s TPGT: %hu" 2648c2ecf20Sopenharmony_ci " PORTAL: %pISpc\n", config_item_name(&se_tpg->se_tpg_wwn->wwn_group.cg_item), 2658c2ecf20Sopenharmony_ci tpg->tpgt, &tpg_np->tpg_np->np_sockaddr); 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci ret = iscsit_tpg_del_network_portal(tpg, tpg_np); 2688c2ecf20Sopenharmony_ci if (ret < 0) 2698c2ecf20Sopenharmony_ci goto out; 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: delnpfromtpg done!\n"); 2728c2ecf20Sopenharmony_ciout: 2738c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 2748c2ecf20Sopenharmony_ci} 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci/* End items for lio_target_np_cit */ 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_attrib_cit */ 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci#define ISCSI_NACL_ATTR(name) \ 2818c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_attrib_##name##_show(struct config_item *item,\ 2828c2ecf20Sopenharmony_ci char *page) \ 2838c2ecf20Sopenharmony_ci{ \ 2848c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = attrib_to_nacl(item); \ 2858c2ecf20Sopenharmony_ci struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \ 2868c2ecf20Sopenharmony_ci se_node_acl); \ 2878c2ecf20Sopenharmony_ci \ 2888c2ecf20Sopenharmony_ci return sprintf(page, "%u\n", nacl->node_attrib.name); \ 2898c2ecf20Sopenharmony_ci} \ 2908c2ecf20Sopenharmony_ci \ 2918c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_attrib_##name##_store(struct config_item *item,\ 2928c2ecf20Sopenharmony_ci const char *page, size_t count) \ 2938c2ecf20Sopenharmony_ci{ \ 2948c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = attrib_to_nacl(item); \ 2958c2ecf20Sopenharmony_ci struct iscsi_node_acl *nacl = container_of(se_nacl, struct iscsi_node_acl, \ 2968c2ecf20Sopenharmony_ci se_node_acl); \ 2978c2ecf20Sopenharmony_ci u32 val; \ 2988c2ecf20Sopenharmony_ci int ret; \ 2998c2ecf20Sopenharmony_ci \ 3008c2ecf20Sopenharmony_ci ret = kstrtou32(page, 0, &val); \ 3018c2ecf20Sopenharmony_ci if (ret) \ 3028c2ecf20Sopenharmony_ci return ret; \ 3038c2ecf20Sopenharmony_ci ret = iscsit_na_##name(nacl, val); \ 3048c2ecf20Sopenharmony_ci if (ret < 0) \ 3058c2ecf20Sopenharmony_ci return ret; \ 3068c2ecf20Sopenharmony_ci \ 3078c2ecf20Sopenharmony_ci return count; \ 3088c2ecf20Sopenharmony_ci} \ 3098c2ecf20Sopenharmony_ci \ 3108c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_nacl_attrib_, name) 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(dataout_timeout); 3138c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(dataout_timeout_retries); 3148c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(default_erl); 3158c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(nopin_timeout); 3168c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(nopin_response_timeout); 3178c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_datain_pdu_offsets); 3188c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_datain_seq_offsets); 3198c2ecf20Sopenharmony_ciISCSI_NACL_ATTR(random_r2t_offsets); 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_attrib_attrs[] = { 3228c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_dataout_timeout, 3238c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_dataout_timeout_retries, 3248c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_default_erl, 3258c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_nopin_timeout, 3268c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_nopin_response_timeout, 3278c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_random_datain_pdu_offsets, 3288c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_random_datain_seq_offsets, 3298c2ecf20Sopenharmony_ci &iscsi_nacl_attrib_attr_random_r2t_offsets, 3308c2ecf20Sopenharmony_ci NULL, 3318c2ecf20Sopenharmony_ci}; 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_attrib_cit */ 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_auth_cit */ 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci#define __DEF_NACL_AUTH_STR(prefix, name, flags) \ 3388c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show( \ 3398c2ecf20Sopenharmony_ci struct iscsi_node_acl *nacl, \ 3408c2ecf20Sopenharmony_ci char *page) \ 3418c2ecf20Sopenharmony_ci{ \ 3428c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &nacl->node_auth; \ 3438c2ecf20Sopenharmony_ci \ 3448c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 3458c2ecf20Sopenharmony_ci return -EPERM; \ 3468c2ecf20Sopenharmony_ci return snprintf(page, PAGE_SIZE, "%s\n", auth->name); \ 3478c2ecf20Sopenharmony_ci} \ 3488c2ecf20Sopenharmony_ci \ 3498c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_store( \ 3508c2ecf20Sopenharmony_ci struct iscsi_node_acl *nacl, \ 3518c2ecf20Sopenharmony_ci const char *page, \ 3528c2ecf20Sopenharmony_ci size_t count) \ 3538c2ecf20Sopenharmony_ci{ \ 3548c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &nacl->node_auth; \ 3558c2ecf20Sopenharmony_ci \ 3568c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 3578c2ecf20Sopenharmony_ci return -EPERM; \ 3588c2ecf20Sopenharmony_ci if (count >= sizeof(auth->name)) \ 3598c2ecf20Sopenharmony_ci return -EINVAL; \ 3608c2ecf20Sopenharmony_ci snprintf(auth->name, sizeof(auth->name), "%s", page); \ 3618c2ecf20Sopenharmony_ci if (!strncmp("NULL", auth->name, 4)) \ 3628c2ecf20Sopenharmony_ci auth->naf_flags &= ~flags; \ 3638c2ecf20Sopenharmony_ci else \ 3648c2ecf20Sopenharmony_ci auth->naf_flags |= flags; \ 3658c2ecf20Sopenharmony_ci \ 3668c2ecf20Sopenharmony_ci if ((auth->naf_flags & NAF_USERID_IN_SET) && \ 3678c2ecf20Sopenharmony_ci (auth->naf_flags & NAF_PASSWORD_IN_SET)) \ 3688c2ecf20Sopenharmony_ci auth->authenticate_target = 1; \ 3698c2ecf20Sopenharmony_ci else \ 3708c2ecf20Sopenharmony_ci auth->authenticate_target = 0; \ 3718c2ecf20Sopenharmony_ci \ 3728c2ecf20Sopenharmony_ci return count; \ 3738c2ecf20Sopenharmony_ci} 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci#define DEF_NACL_AUTH_STR(name, flags) \ 3768c2ecf20Sopenharmony_ci __DEF_NACL_AUTH_STR(nacl_auth, name, flags) \ 3778c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item, \ 3788c2ecf20Sopenharmony_ci char *page) \ 3798c2ecf20Sopenharmony_ci{ \ 3808c2ecf20Sopenharmony_ci struct se_node_acl *nacl = auth_to_nacl(item); \ 3818c2ecf20Sopenharmony_ci return __iscsi_nacl_auth_##name##_show(container_of(nacl, \ 3828c2ecf20Sopenharmony_ci struct iscsi_node_acl, se_node_acl), page); \ 3838c2ecf20Sopenharmony_ci} \ 3848c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_store(struct config_item *item, \ 3858c2ecf20Sopenharmony_ci const char *page, size_t count) \ 3868c2ecf20Sopenharmony_ci{ \ 3878c2ecf20Sopenharmony_ci struct se_node_acl *nacl = auth_to_nacl(item); \ 3888c2ecf20Sopenharmony_ci return __iscsi_nacl_auth_##name##_store(container_of(nacl, \ 3898c2ecf20Sopenharmony_ci struct iscsi_node_acl, se_node_acl), page, count); \ 3908c2ecf20Sopenharmony_ci} \ 3918c2ecf20Sopenharmony_ci \ 3928c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_nacl_auth_, name) 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci/* 3958c2ecf20Sopenharmony_ci * One-way authentication userid 3968c2ecf20Sopenharmony_ci */ 3978c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(userid, NAF_USERID_SET); 3988c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(password, NAF_PASSWORD_SET); 3998c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(userid_mutual, NAF_USERID_IN_SET); 4008c2ecf20Sopenharmony_ciDEF_NACL_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET); 4018c2ecf20Sopenharmony_ci 4028c2ecf20Sopenharmony_ci#define __DEF_NACL_AUTH_INT(prefix, name) \ 4038c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show( \ 4048c2ecf20Sopenharmony_ci struct iscsi_node_acl *nacl, \ 4058c2ecf20Sopenharmony_ci char *page) \ 4068c2ecf20Sopenharmony_ci{ \ 4078c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &nacl->node_auth; \ 4088c2ecf20Sopenharmony_ci \ 4098c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 4108c2ecf20Sopenharmony_ci return -EPERM; \ 4118c2ecf20Sopenharmony_ci \ 4128c2ecf20Sopenharmony_ci return snprintf(page, PAGE_SIZE, "%d\n", auth->name); \ 4138c2ecf20Sopenharmony_ci} 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci#define DEF_NACL_AUTH_INT(name) \ 4168c2ecf20Sopenharmony_ci __DEF_NACL_AUTH_INT(nacl_auth, name) \ 4178c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_auth_##name##_show(struct config_item *item, \ 4188c2ecf20Sopenharmony_ci char *page) \ 4198c2ecf20Sopenharmony_ci{ \ 4208c2ecf20Sopenharmony_ci struct se_node_acl *nacl = auth_to_nacl(item); \ 4218c2ecf20Sopenharmony_ci return __iscsi_nacl_auth_##name##_show(container_of(nacl, \ 4228c2ecf20Sopenharmony_ci struct iscsi_node_acl, se_node_acl), page); \ 4238c2ecf20Sopenharmony_ci} \ 4248c2ecf20Sopenharmony_ci \ 4258c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_nacl_auth_, name) 4268c2ecf20Sopenharmony_ci 4278c2ecf20Sopenharmony_ciDEF_NACL_AUTH_INT(authenticate_target); 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_auth_attrs[] = { 4308c2ecf20Sopenharmony_ci &iscsi_nacl_auth_attr_userid, 4318c2ecf20Sopenharmony_ci &iscsi_nacl_auth_attr_password, 4328c2ecf20Sopenharmony_ci &iscsi_nacl_auth_attr_authenticate_target, 4338c2ecf20Sopenharmony_ci &iscsi_nacl_auth_attr_userid_mutual, 4348c2ecf20Sopenharmony_ci &iscsi_nacl_auth_attr_password_mutual, 4358c2ecf20Sopenharmony_ci NULL, 4368c2ecf20Sopenharmony_ci}; 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_auth_cit */ 4398c2ecf20Sopenharmony_ci 4408c2ecf20Sopenharmony_ci/* Start items for lio_target_nacl_param_cit */ 4418c2ecf20Sopenharmony_ci 4428c2ecf20Sopenharmony_ci#define ISCSI_NACL_PARAM(name) \ 4438c2ecf20Sopenharmony_cistatic ssize_t iscsi_nacl_param_##name##_show(struct config_item *item, \ 4448c2ecf20Sopenharmony_ci char *page) \ 4458c2ecf20Sopenharmony_ci{ \ 4468c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = param_to_nacl(item); \ 4478c2ecf20Sopenharmony_ci struct iscsi_session *sess; \ 4488c2ecf20Sopenharmony_ci struct se_session *se_sess; \ 4498c2ecf20Sopenharmony_ci ssize_t rb; \ 4508c2ecf20Sopenharmony_ci \ 4518c2ecf20Sopenharmony_ci spin_lock_bh(&se_nacl->nacl_sess_lock); \ 4528c2ecf20Sopenharmony_ci se_sess = se_nacl->nacl_sess; \ 4538c2ecf20Sopenharmony_ci if (!se_sess) { \ 4548c2ecf20Sopenharmony_ci rb = snprintf(page, PAGE_SIZE, \ 4558c2ecf20Sopenharmony_ci "No Active iSCSI Session\n"); \ 4568c2ecf20Sopenharmony_ci } else { \ 4578c2ecf20Sopenharmony_ci sess = se_sess->fabric_sess_ptr; \ 4588c2ecf20Sopenharmony_ci rb = snprintf(page, PAGE_SIZE, "%u\n", \ 4598c2ecf20Sopenharmony_ci (u32)sess->sess_ops->name); \ 4608c2ecf20Sopenharmony_ci } \ 4618c2ecf20Sopenharmony_ci spin_unlock_bh(&se_nacl->nacl_sess_lock); \ 4628c2ecf20Sopenharmony_ci \ 4638c2ecf20Sopenharmony_ci return rb; \ 4648c2ecf20Sopenharmony_ci} \ 4658c2ecf20Sopenharmony_ci \ 4668c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_nacl_param_, name) 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxConnections); 4698c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(InitialR2T); 4708c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(ImmediateData); 4718c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxBurstLength); 4728c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(FirstBurstLength); 4738c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DefaultTime2Wait); 4748c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DefaultTime2Retain); 4758c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(MaxOutstandingR2T); 4768c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DataPDUInOrder); 4778c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(DataSequenceInOrder); 4788c2ecf20Sopenharmony_ciISCSI_NACL_PARAM(ErrorRecoveryLevel); 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_nacl_param_attrs[] = { 4818c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_MaxConnections, 4828c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_InitialR2T, 4838c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_ImmediateData, 4848c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_MaxBurstLength, 4858c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_FirstBurstLength, 4868c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_DefaultTime2Wait, 4878c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_DefaultTime2Retain, 4888c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_MaxOutstandingR2T, 4898c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_DataPDUInOrder, 4908c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_DataSequenceInOrder, 4918c2ecf20Sopenharmony_ci &iscsi_nacl_param_attr_ErrorRecoveryLevel, 4928c2ecf20Sopenharmony_ci NULL, 4938c2ecf20Sopenharmony_ci}; 4948c2ecf20Sopenharmony_ci 4958c2ecf20Sopenharmony_ci/* End items for lio_target_nacl_param_cit */ 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci/* Start items for lio_target_acl_cit */ 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_info_show(struct config_item *item, char *page) 5008c2ecf20Sopenharmony_ci{ 5018c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = acl_to_nacl(item); 5028c2ecf20Sopenharmony_ci struct iscsi_session *sess; 5038c2ecf20Sopenharmony_ci struct iscsi_conn *conn; 5048c2ecf20Sopenharmony_ci struct se_session *se_sess; 5058c2ecf20Sopenharmony_ci ssize_t rb = 0; 5068c2ecf20Sopenharmony_ci u32 max_cmd_sn; 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci spin_lock_bh(&se_nacl->nacl_sess_lock); 5098c2ecf20Sopenharmony_ci se_sess = se_nacl->nacl_sess; 5108c2ecf20Sopenharmony_ci if (!se_sess) { 5118c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "No active iSCSI Session for Initiator" 5128c2ecf20Sopenharmony_ci " Endpoint: %s\n", se_nacl->initiatorname); 5138c2ecf20Sopenharmony_ci } else { 5148c2ecf20Sopenharmony_ci sess = se_sess->fabric_sess_ptr; 5158c2ecf20Sopenharmony_ci 5168c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "InitiatorName: %s\n", 5178c2ecf20Sopenharmony_ci sess->sess_ops->InitiatorName); 5188c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "InitiatorAlias: %s\n", 5198c2ecf20Sopenharmony_ci sess->sess_ops->InitiatorAlias); 5208c2ecf20Sopenharmony_ci 5218c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5228c2ecf20Sopenharmony_ci "LIO Session ID: %u ISID: 0x%6ph TSIH: %hu ", 5238c2ecf20Sopenharmony_ci sess->sid, sess->isid, sess->tsih); 5248c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "SessionType: %s\n", 5258c2ecf20Sopenharmony_ci (sess->sess_ops->SessionType) ? 5268c2ecf20Sopenharmony_ci "Discovery" : "Normal"); 5278c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "Session State: "); 5288c2ecf20Sopenharmony_ci switch (sess->session_state) { 5298c2ecf20Sopenharmony_ci case TARG_SESS_STATE_FREE: 5308c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "TARG_SESS_FREE\n"); 5318c2ecf20Sopenharmony_ci break; 5328c2ecf20Sopenharmony_ci case TARG_SESS_STATE_ACTIVE: 5338c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_ACTIVE\n"); 5348c2ecf20Sopenharmony_ci break; 5358c2ecf20Sopenharmony_ci case TARG_SESS_STATE_LOGGED_IN: 5368c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_LOGGED_IN\n"); 5378c2ecf20Sopenharmony_ci break; 5388c2ecf20Sopenharmony_ci case TARG_SESS_STATE_FAILED: 5398c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_FAILED\n"); 5408c2ecf20Sopenharmony_ci break; 5418c2ecf20Sopenharmony_ci case TARG_SESS_STATE_IN_CONTINUE: 5428c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "TARG_SESS_STATE_IN_CONTINUE\n"); 5438c2ecf20Sopenharmony_ci break; 5448c2ecf20Sopenharmony_ci default: 5458c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "ERROR: Unknown Session" 5468c2ecf20Sopenharmony_ci " State!\n"); 5478c2ecf20Sopenharmony_ci break; 5488c2ecf20Sopenharmony_ci } 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "---------------------[iSCSI Session" 5518c2ecf20Sopenharmony_ci " Values]-----------------------\n"); 5528c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, " CmdSN/WR : CmdSN/WC : ExpCmdSN" 5538c2ecf20Sopenharmony_ci " : MaxCmdSN : ITT : TTT\n"); 5548c2ecf20Sopenharmony_ci max_cmd_sn = (u32) atomic_read(&sess->max_cmd_sn); 5558c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, " 0x%08x 0x%08x 0x%08x 0x%08x" 5568c2ecf20Sopenharmony_ci " 0x%08x 0x%08x\n", 5578c2ecf20Sopenharmony_ci sess->cmdsn_window, 5588c2ecf20Sopenharmony_ci (max_cmd_sn - sess->exp_cmd_sn) + 1, 5598c2ecf20Sopenharmony_ci sess->exp_cmd_sn, max_cmd_sn, 5608c2ecf20Sopenharmony_ci sess->init_task_tag, sess->targ_xfer_tag); 5618c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "----------------------[iSCSI" 5628c2ecf20Sopenharmony_ci " Connections]-------------------------\n"); 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci spin_lock(&sess->conn_lock); 5658c2ecf20Sopenharmony_ci list_for_each_entry(conn, &sess->sess_conn_list, conn_list) { 5668c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, "CID: %hu Connection" 5678c2ecf20Sopenharmony_ci " State: ", conn->cid); 5688c2ecf20Sopenharmony_ci switch (conn->conn_state) { 5698c2ecf20Sopenharmony_ci case TARG_CONN_STATE_FREE: 5708c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5718c2ecf20Sopenharmony_ci "TARG_CONN_STATE_FREE\n"); 5728c2ecf20Sopenharmony_ci break; 5738c2ecf20Sopenharmony_ci case TARG_CONN_STATE_XPT_UP: 5748c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5758c2ecf20Sopenharmony_ci "TARG_CONN_STATE_XPT_UP\n"); 5768c2ecf20Sopenharmony_ci break; 5778c2ecf20Sopenharmony_ci case TARG_CONN_STATE_IN_LOGIN: 5788c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5798c2ecf20Sopenharmony_ci "TARG_CONN_STATE_IN_LOGIN\n"); 5808c2ecf20Sopenharmony_ci break; 5818c2ecf20Sopenharmony_ci case TARG_CONN_STATE_LOGGED_IN: 5828c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5838c2ecf20Sopenharmony_ci "TARG_CONN_STATE_LOGGED_IN\n"); 5848c2ecf20Sopenharmony_ci break; 5858c2ecf20Sopenharmony_ci case TARG_CONN_STATE_IN_LOGOUT: 5868c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5878c2ecf20Sopenharmony_ci "TARG_CONN_STATE_IN_LOGOUT\n"); 5888c2ecf20Sopenharmony_ci break; 5898c2ecf20Sopenharmony_ci case TARG_CONN_STATE_LOGOUT_REQUESTED: 5908c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5918c2ecf20Sopenharmony_ci "TARG_CONN_STATE_LOGOUT_REQUESTED\n"); 5928c2ecf20Sopenharmony_ci break; 5938c2ecf20Sopenharmony_ci case TARG_CONN_STATE_CLEANUP_WAIT: 5948c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5958c2ecf20Sopenharmony_ci "TARG_CONN_STATE_CLEANUP_WAIT\n"); 5968c2ecf20Sopenharmony_ci break; 5978c2ecf20Sopenharmony_ci default: 5988c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, 5998c2ecf20Sopenharmony_ci "ERROR: Unknown Connection State!\n"); 6008c2ecf20Sopenharmony_ci break; 6018c2ecf20Sopenharmony_ci } 6028c2ecf20Sopenharmony_ci 6038c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, " Address %pISc %s", &conn->login_sockaddr, 6048c2ecf20Sopenharmony_ci (conn->network_transport == ISCSI_TCP) ? 6058c2ecf20Sopenharmony_ci "TCP" : "SCTP"); 6068c2ecf20Sopenharmony_ci rb += sysfs_emit_at(page, rb, " StatSN: 0x%08x\n", 6078c2ecf20Sopenharmony_ci conn->stat_sn); 6088c2ecf20Sopenharmony_ci } 6098c2ecf20Sopenharmony_ci spin_unlock(&sess->conn_lock); 6108c2ecf20Sopenharmony_ci } 6118c2ecf20Sopenharmony_ci spin_unlock_bh(&se_nacl->nacl_sess_lock); 6128c2ecf20Sopenharmony_ci 6138c2ecf20Sopenharmony_ci return rb; 6148c2ecf20Sopenharmony_ci} 6158c2ecf20Sopenharmony_ci 6168c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_cmdsn_depth_show(struct config_item *item, 6178c2ecf20Sopenharmony_ci char *page) 6188c2ecf20Sopenharmony_ci{ 6198c2ecf20Sopenharmony_ci return sprintf(page, "%u\n", acl_to_nacl(item)->queue_depth); 6208c2ecf20Sopenharmony_ci} 6218c2ecf20Sopenharmony_ci 6228c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_cmdsn_depth_store(struct config_item *item, 6238c2ecf20Sopenharmony_ci const char *page, size_t count) 6248c2ecf20Sopenharmony_ci{ 6258c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = acl_to_nacl(item); 6268c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = se_nacl->se_tpg; 6278c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, 6288c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); 6298c2ecf20Sopenharmony_ci struct config_item *acl_ci, *tpg_ci, *wwn_ci; 6308c2ecf20Sopenharmony_ci u32 cmdsn_depth = 0; 6318c2ecf20Sopenharmony_ci int ret; 6328c2ecf20Sopenharmony_ci 6338c2ecf20Sopenharmony_ci ret = kstrtou32(page, 0, &cmdsn_depth); 6348c2ecf20Sopenharmony_ci if (ret) 6358c2ecf20Sopenharmony_ci return ret; 6368c2ecf20Sopenharmony_ci if (cmdsn_depth > TA_DEFAULT_CMDSN_DEPTH_MAX) { 6378c2ecf20Sopenharmony_ci pr_err("Passed cmdsn_depth: %u exceeds" 6388c2ecf20Sopenharmony_ci " TA_DEFAULT_CMDSN_DEPTH_MAX: %u\n", cmdsn_depth, 6398c2ecf20Sopenharmony_ci TA_DEFAULT_CMDSN_DEPTH_MAX); 6408c2ecf20Sopenharmony_ci return -EINVAL; 6418c2ecf20Sopenharmony_ci } 6428c2ecf20Sopenharmony_ci acl_ci = &se_nacl->acl_group.cg_item; 6438c2ecf20Sopenharmony_ci if (!acl_ci) { 6448c2ecf20Sopenharmony_ci pr_err("Unable to locatel acl_ci\n"); 6458c2ecf20Sopenharmony_ci return -EINVAL; 6468c2ecf20Sopenharmony_ci } 6478c2ecf20Sopenharmony_ci tpg_ci = &acl_ci->ci_parent->ci_group->cg_item; 6488c2ecf20Sopenharmony_ci if (!tpg_ci) { 6498c2ecf20Sopenharmony_ci pr_err("Unable to locate tpg_ci\n"); 6508c2ecf20Sopenharmony_ci return -EINVAL; 6518c2ecf20Sopenharmony_ci } 6528c2ecf20Sopenharmony_ci wwn_ci = &tpg_ci->ci_group->cg_item; 6538c2ecf20Sopenharmony_ci if (!wwn_ci) { 6548c2ecf20Sopenharmony_ci pr_err("Unable to locate config_item wwn_ci\n"); 6558c2ecf20Sopenharmony_ci return -EINVAL; 6568c2ecf20Sopenharmony_ci } 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) 6598c2ecf20Sopenharmony_ci return -EINVAL; 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci ret = core_tpg_set_initiator_node_queue_depth(se_nacl, cmdsn_depth); 6628c2ecf20Sopenharmony_ci 6638c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: %s/%s Set CmdSN Window: %u for" 6648c2ecf20Sopenharmony_ci "InitiatorName: %s\n", config_item_name(wwn_ci), 6658c2ecf20Sopenharmony_ci config_item_name(tpg_ci), cmdsn_depth, 6668c2ecf20Sopenharmony_ci config_item_name(acl_ci)); 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 6698c2ecf20Sopenharmony_ci return (!ret) ? count : (ssize_t)ret; 6708c2ecf20Sopenharmony_ci} 6718c2ecf20Sopenharmony_ci 6728c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_tag_show(struct config_item *item, char *page) 6738c2ecf20Sopenharmony_ci{ 6748c2ecf20Sopenharmony_ci return snprintf(page, PAGE_SIZE, "%s", acl_to_nacl(item)->acl_tag); 6758c2ecf20Sopenharmony_ci} 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_cistatic ssize_t lio_target_nacl_tag_store(struct config_item *item, 6788c2ecf20Sopenharmony_ci const char *page, size_t count) 6798c2ecf20Sopenharmony_ci{ 6808c2ecf20Sopenharmony_ci struct se_node_acl *se_nacl = acl_to_nacl(item); 6818c2ecf20Sopenharmony_ci int ret; 6828c2ecf20Sopenharmony_ci 6838c2ecf20Sopenharmony_ci ret = core_tpg_set_initiator_node_tag(se_nacl->se_tpg, se_nacl, page); 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci if (ret < 0) 6868c2ecf20Sopenharmony_ci return ret; 6878c2ecf20Sopenharmony_ci return count; 6888c2ecf20Sopenharmony_ci} 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_nacl_, info); 6918c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_nacl_, cmdsn_depth); 6928c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_nacl_, tag); 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_initiator_attrs[] = { 6958c2ecf20Sopenharmony_ci &lio_target_nacl_attr_info, 6968c2ecf20Sopenharmony_ci &lio_target_nacl_attr_cmdsn_depth, 6978c2ecf20Sopenharmony_ci &lio_target_nacl_attr_tag, 6988c2ecf20Sopenharmony_ci NULL, 6998c2ecf20Sopenharmony_ci}; 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_cistatic int lio_target_init_nodeacl(struct se_node_acl *se_nacl, 7028c2ecf20Sopenharmony_ci const char *name) 7038c2ecf20Sopenharmony_ci{ 7048c2ecf20Sopenharmony_ci struct iscsi_node_acl *acl = 7058c2ecf20Sopenharmony_ci container_of(se_nacl, struct iscsi_node_acl, se_node_acl); 7068c2ecf20Sopenharmony_ci 7078c2ecf20Sopenharmony_ci config_group_init_type_name(&acl->node_stat_grps.iscsi_sess_stats_group, 7088c2ecf20Sopenharmony_ci "iscsi_sess_stats", &iscsi_stat_sess_cit); 7098c2ecf20Sopenharmony_ci configfs_add_default_group(&acl->node_stat_grps.iscsi_sess_stats_group, 7108c2ecf20Sopenharmony_ci &se_nacl->acl_fabric_stat_group); 7118c2ecf20Sopenharmony_ci return 0; 7128c2ecf20Sopenharmony_ci} 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci/* End items for lio_target_acl_cit */ 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_attrib_cit */ 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci#define DEF_TPG_ATTRIB(name) \ 7198c2ecf20Sopenharmony_ci \ 7208c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_attrib_##name##_show(struct config_item *item, \ 7218c2ecf20Sopenharmony_ci char *page) \ 7228c2ecf20Sopenharmony_ci{ \ 7238c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = attrib_to_tpg(item); \ 7248c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 7258c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 7268c2ecf20Sopenharmony_ci ssize_t rb; \ 7278c2ecf20Sopenharmony_ci \ 7288c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) \ 7298c2ecf20Sopenharmony_ci return -EINVAL; \ 7308c2ecf20Sopenharmony_ci \ 7318c2ecf20Sopenharmony_ci rb = sprintf(page, "%u\n", tpg->tpg_attrib.name); \ 7328c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 7338c2ecf20Sopenharmony_ci return rb; \ 7348c2ecf20Sopenharmony_ci} \ 7358c2ecf20Sopenharmony_ci \ 7368c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_attrib_##name##_store(struct config_item *item,\ 7378c2ecf20Sopenharmony_ci const char *page, size_t count) \ 7388c2ecf20Sopenharmony_ci{ \ 7398c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = attrib_to_tpg(item); \ 7408c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 7418c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 7428c2ecf20Sopenharmony_ci u32 val; \ 7438c2ecf20Sopenharmony_ci int ret; \ 7448c2ecf20Sopenharmony_ci \ 7458c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) \ 7468c2ecf20Sopenharmony_ci return -EINVAL; \ 7478c2ecf20Sopenharmony_ci \ 7488c2ecf20Sopenharmony_ci ret = kstrtou32(page, 0, &val); \ 7498c2ecf20Sopenharmony_ci if (ret) \ 7508c2ecf20Sopenharmony_ci goto out; \ 7518c2ecf20Sopenharmony_ci ret = iscsit_ta_##name(tpg, val); \ 7528c2ecf20Sopenharmony_ci if (ret < 0) \ 7538c2ecf20Sopenharmony_ci goto out; \ 7548c2ecf20Sopenharmony_ci \ 7558c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 7568c2ecf20Sopenharmony_ci return count; \ 7578c2ecf20Sopenharmony_ciout: \ 7588c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 7598c2ecf20Sopenharmony_ci return ret; \ 7608c2ecf20Sopenharmony_ci} \ 7618c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_attrib_, name) 7628c2ecf20Sopenharmony_ci 7638c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(authentication); 7648c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(login_timeout); 7658c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(netif_timeout); 7668c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(generate_node_acls); 7678c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(default_cmdsn_depth); 7688c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(cache_dynamic_acls); 7698c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(demo_mode_write_protect); 7708c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(prod_mode_write_protect); 7718c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(demo_mode_discovery); 7728c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(default_erl); 7738c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(t10_pi); 7748c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(fabric_prot_type); 7758c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(tpg_enabled_sendtargets); 7768c2ecf20Sopenharmony_ciDEF_TPG_ATTRIB(login_keys_workaround); 7778c2ecf20Sopenharmony_ci 7788c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_attrib_attrs[] = { 7798c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_authentication, 7808c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_login_timeout, 7818c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_netif_timeout, 7828c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_generate_node_acls, 7838c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_default_cmdsn_depth, 7848c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_cache_dynamic_acls, 7858c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_demo_mode_write_protect, 7868c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_prod_mode_write_protect, 7878c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_demo_mode_discovery, 7888c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_default_erl, 7898c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_t10_pi, 7908c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_fabric_prot_type, 7918c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_tpg_enabled_sendtargets, 7928c2ecf20Sopenharmony_ci &iscsi_tpg_attrib_attr_login_keys_workaround, 7938c2ecf20Sopenharmony_ci NULL, 7948c2ecf20Sopenharmony_ci}; 7958c2ecf20Sopenharmony_ci 7968c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_attrib_cit */ 7978c2ecf20Sopenharmony_ci 7988c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_auth_cit */ 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_ci#define __DEF_TPG_AUTH_STR(prefix, name, flags) \ 8018c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg, \ 8028c2ecf20Sopenharmony_ci char *page) \ 8038c2ecf20Sopenharmony_ci{ \ 8048c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 8058c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 8068c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &tpg->tpg_demo_auth; \ 8078c2ecf20Sopenharmony_ci \ 8088c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 8098c2ecf20Sopenharmony_ci return -EPERM; \ 8108c2ecf20Sopenharmony_ci \ 8118c2ecf20Sopenharmony_ci return snprintf(page, PAGE_SIZE, "%s\n", auth->name); \ 8128c2ecf20Sopenharmony_ci} \ 8138c2ecf20Sopenharmony_ci \ 8148c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_store(struct se_portal_group *se_tpg,\ 8158c2ecf20Sopenharmony_ci const char *page, size_t count) \ 8168c2ecf20Sopenharmony_ci{ \ 8178c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 8188c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 8198c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &tpg->tpg_demo_auth; \ 8208c2ecf20Sopenharmony_ci \ 8218c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 8228c2ecf20Sopenharmony_ci return -EPERM; \ 8238c2ecf20Sopenharmony_ci \ 8248c2ecf20Sopenharmony_ci snprintf(auth->name, sizeof(auth->name), "%s", page); \ 8258c2ecf20Sopenharmony_ci if (!(strncmp("NULL", auth->name, 4))) \ 8268c2ecf20Sopenharmony_ci auth->naf_flags &= ~flags; \ 8278c2ecf20Sopenharmony_ci else \ 8288c2ecf20Sopenharmony_ci auth->naf_flags |= flags; \ 8298c2ecf20Sopenharmony_ci \ 8308c2ecf20Sopenharmony_ci if ((auth->naf_flags & NAF_USERID_IN_SET) && \ 8318c2ecf20Sopenharmony_ci (auth->naf_flags & NAF_PASSWORD_IN_SET)) \ 8328c2ecf20Sopenharmony_ci auth->authenticate_target = 1; \ 8338c2ecf20Sopenharmony_ci else \ 8348c2ecf20Sopenharmony_ci auth->authenticate_target = 0; \ 8358c2ecf20Sopenharmony_ci \ 8368c2ecf20Sopenharmony_ci return count; \ 8378c2ecf20Sopenharmony_ci} 8388c2ecf20Sopenharmony_ci 8398c2ecf20Sopenharmony_ci#define DEF_TPG_AUTH_STR(name, flags) \ 8408c2ecf20Sopenharmony_ci __DEF_TPG_AUTH_STR(tpg_auth, name, flags) \ 8418c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item, \ 8428c2ecf20Sopenharmony_ci char *page) \ 8438c2ecf20Sopenharmony_ci{ \ 8448c2ecf20Sopenharmony_ci return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page); \ 8458c2ecf20Sopenharmony_ci} \ 8468c2ecf20Sopenharmony_ci \ 8478c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_store(struct config_item *item, \ 8488c2ecf20Sopenharmony_ci const char *page, size_t count) \ 8498c2ecf20Sopenharmony_ci{ \ 8508c2ecf20Sopenharmony_ci return __iscsi_tpg_auth_##name##_store(auth_to_tpg(item), page, count); \ 8518c2ecf20Sopenharmony_ci} \ 8528c2ecf20Sopenharmony_ci \ 8538c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_auth_, name); 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(userid, NAF_USERID_SET); 8578c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(password, NAF_PASSWORD_SET); 8588c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(userid_mutual, NAF_USERID_IN_SET); 8598c2ecf20Sopenharmony_ciDEF_TPG_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET); 8608c2ecf20Sopenharmony_ci 8618c2ecf20Sopenharmony_ci#define __DEF_TPG_AUTH_INT(prefix, name) \ 8628c2ecf20Sopenharmony_cistatic ssize_t __iscsi_##prefix##_##name##_show(struct se_portal_group *se_tpg, \ 8638c2ecf20Sopenharmony_ci char *page) \ 8648c2ecf20Sopenharmony_ci{ \ 8658c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 8668c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 8678c2ecf20Sopenharmony_ci struct iscsi_node_auth *auth = &tpg->tpg_demo_auth; \ 8688c2ecf20Sopenharmony_ci \ 8698c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_ADMIN)) \ 8708c2ecf20Sopenharmony_ci return -EPERM; \ 8718c2ecf20Sopenharmony_ci \ 8728c2ecf20Sopenharmony_ci return snprintf(page, PAGE_SIZE, "%d\n", auth->name); \ 8738c2ecf20Sopenharmony_ci} 8748c2ecf20Sopenharmony_ci 8758c2ecf20Sopenharmony_ci#define DEF_TPG_AUTH_INT(name) \ 8768c2ecf20Sopenharmony_ci __DEF_TPG_AUTH_INT(tpg_auth, name) \ 8778c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_auth_##name##_show(struct config_item *item, \ 8788c2ecf20Sopenharmony_ci char *page) \ 8798c2ecf20Sopenharmony_ci{ \ 8808c2ecf20Sopenharmony_ci return __iscsi_tpg_auth_##name##_show(auth_to_tpg(item), page); \ 8818c2ecf20Sopenharmony_ci} \ 8828c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_tpg_auth_, name); 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_ciDEF_TPG_AUTH_INT(authenticate_target); 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_auth_attrs[] = { 8878c2ecf20Sopenharmony_ci &iscsi_tpg_auth_attr_userid, 8888c2ecf20Sopenharmony_ci &iscsi_tpg_auth_attr_password, 8898c2ecf20Sopenharmony_ci &iscsi_tpg_auth_attr_authenticate_target, 8908c2ecf20Sopenharmony_ci &iscsi_tpg_auth_attr_userid_mutual, 8918c2ecf20Sopenharmony_ci &iscsi_tpg_auth_attr_password_mutual, 8928c2ecf20Sopenharmony_ci NULL, 8938c2ecf20Sopenharmony_ci}; 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_auth_cit */ 8968c2ecf20Sopenharmony_ci 8978c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_param_cit */ 8988c2ecf20Sopenharmony_ci 8998c2ecf20Sopenharmony_ci#define DEF_TPG_PARAM(name) \ 9008c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_param_##name##_show(struct config_item *item, \ 9018c2ecf20Sopenharmony_ci char *page) \ 9028c2ecf20Sopenharmony_ci{ \ 9038c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = param_to_tpg(item); \ 9048c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 9058c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 9068c2ecf20Sopenharmony_ci struct iscsi_param *param; \ 9078c2ecf20Sopenharmony_ci ssize_t rb; \ 9088c2ecf20Sopenharmony_ci \ 9098c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) \ 9108c2ecf20Sopenharmony_ci return -EINVAL; \ 9118c2ecf20Sopenharmony_ci \ 9128c2ecf20Sopenharmony_ci param = iscsi_find_param_from_key(__stringify(name), \ 9138c2ecf20Sopenharmony_ci tpg->param_list); \ 9148c2ecf20Sopenharmony_ci if (!param) { \ 9158c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 9168c2ecf20Sopenharmony_ci return -EINVAL; \ 9178c2ecf20Sopenharmony_ci } \ 9188c2ecf20Sopenharmony_ci rb = snprintf(page, PAGE_SIZE, "%s\n", param->value); \ 9198c2ecf20Sopenharmony_ci \ 9208c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 9218c2ecf20Sopenharmony_ci return rb; \ 9228c2ecf20Sopenharmony_ci} \ 9238c2ecf20Sopenharmony_cistatic ssize_t iscsi_tpg_param_##name##_store(struct config_item *item, \ 9248c2ecf20Sopenharmony_ci const char *page, size_t count) \ 9258c2ecf20Sopenharmony_ci{ \ 9268c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = param_to_tpg(item); \ 9278c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, \ 9288c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); \ 9298c2ecf20Sopenharmony_ci char *buf; \ 9308c2ecf20Sopenharmony_ci int ret, len; \ 9318c2ecf20Sopenharmony_ci \ 9328c2ecf20Sopenharmony_ci buf = kzalloc(PAGE_SIZE, GFP_KERNEL); \ 9338c2ecf20Sopenharmony_ci if (!buf) \ 9348c2ecf20Sopenharmony_ci return -ENOMEM; \ 9358c2ecf20Sopenharmony_ci len = snprintf(buf, PAGE_SIZE, "%s=%s", __stringify(name), page); \ 9368c2ecf20Sopenharmony_ci if (isspace(buf[len-1])) \ 9378c2ecf20Sopenharmony_ci buf[len-1] = '\0'; /* Kill newline */ \ 9388c2ecf20Sopenharmony_ci \ 9398c2ecf20Sopenharmony_ci if (iscsit_get_tpg(tpg) < 0) { \ 9408c2ecf20Sopenharmony_ci kfree(buf); \ 9418c2ecf20Sopenharmony_ci return -EINVAL; \ 9428c2ecf20Sopenharmony_ci } \ 9438c2ecf20Sopenharmony_ci \ 9448c2ecf20Sopenharmony_ci ret = iscsi_change_param_value(buf, tpg->param_list, 1); \ 9458c2ecf20Sopenharmony_ci if (ret < 0) \ 9468c2ecf20Sopenharmony_ci goto out; \ 9478c2ecf20Sopenharmony_ci \ 9488c2ecf20Sopenharmony_ci kfree(buf); \ 9498c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 9508c2ecf20Sopenharmony_ci return count; \ 9518c2ecf20Sopenharmony_ciout: \ 9528c2ecf20Sopenharmony_ci kfree(buf); \ 9538c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); \ 9548c2ecf20Sopenharmony_ci return -EINVAL; \ 9558c2ecf20Sopenharmony_ci} \ 9568c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_tpg_param_, name) 9578c2ecf20Sopenharmony_ci 9588c2ecf20Sopenharmony_ciDEF_TPG_PARAM(AuthMethod); 9598c2ecf20Sopenharmony_ciDEF_TPG_PARAM(HeaderDigest); 9608c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataDigest); 9618c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxConnections); 9628c2ecf20Sopenharmony_ciDEF_TPG_PARAM(TargetAlias); 9638c2ecf20Sopenharmony_ciDEF_TPG_PARAM(InitialR2T); 9648c2ecf20Sopenharmony_ciDEF_TPG_PARAM(ImmediateData); 9658c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxRecvDataSegmentLength); 9668c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxXmitDataSegmentLength); 9678c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxBurstLength); 9688c2ecf20Sopenharmony_ciDEF_TPG_PARAM(FirstBurstLength); 9698c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DefaultTime2Wait); 9708c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DefaultTime2Retain); 9718c2ecf20Sopenharmony_ciDEF_TPG_PARAM(MaxOutstandingR2T); 9728c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataPDUInOrder); 9738c2ecf20Sopenharmony_ciDEF_TPG_PARAM(DataSequenceInOrder); 9748c2ecf20Sopenharmony_ciDEF_TPG_PARAM(ErrorRecoveryLevel); 9758c2ecf20Sopenharmony_ciDEF_TPG_PARAM(IFMarker); 9768c2ecf20Sopenharmony_ciDEF_TPG_PARAM(OFMarker); 9778c2ecf20Sopenharmony_ciDEF_TPG_PARAM(IFMarkInt); 9788c2ecf20Sopenharmony_ciDEF_TPG_PARAM(OFMarkInt); 9798c2ecf20Sopenharmony_ci 9808c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_param_attrs[] = { 9818c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_AuthMethod, 9828c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_HeaderDigest, 9838c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_DataDigest, 9848c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_MaxConnections, 9858c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_TargetAlias, 9868c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_InitialR2T, 9878c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_ImmediateData, 9888c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_MaxRecvDataSegmentLength, 9898c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_MaxXmitDataSegmentLength, 9908c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_MaxBurstLength, 9918c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_FirstBurstLength, 9928c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_DefaultTime2Wait, 9938c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_DefaultTime2Retain, 9948c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_MaxOutstandingR2T, 9958c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_DataPDUInOrder, 9968c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_DataSequenceInOrder, 9978c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_ErrorRecoveryLevel, 9988c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_IFMarker, 9998c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_OFMarker, 10008c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_IFMarkInt, 10018c2ecf20Sopenharmony_ci &iscsi_tpg_param_attr_OFMarkInt, 10028c2ecf20Sopenharmony_ci NULL, 10038c2ecf20Sopenharmony_ci}; 10048c2ecf20Sopenharmony_ci 10058c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_param_cit */ 10068c2ecf20Sopenharmony_ci 10078c2ecf20Sopenharmony_ci/* Start items for lio_target_tpg_cit */ 10088c2ecf20Sopenharmony_ci 10098c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_enable_show(struct config_item *item, char *page) 10108c2ecf20Sopenharmony_ci{ 10118c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = to_tpg(item); 10128c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, 10138c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); 10148c2ecf20Sopenharmony_ci ssize_t len; 10158c2ecf20Sopenharmony_ci 10168c2ecf20Sopenharmony_ci spin_lock(&tpg->tpg_state_lock); 10178c2ecf20Sopenharmony_ci len = sprintf(page, "%d\n", 10188c2ecf20Sopenharmony_ci (tpg->tpg_state == TPG_STATE_ACTIVE) ? 1 : 0); 10198c2ecf20Sopenharmony_ci spin_unlock(&tpg->tpg_state_lock); 10208c2ecf20Sopenharmony_ci 10218c2ecf20Sopenharmony_ci return len; 10228c2ecf20Sopenharmony_ci} 10238c2ecf20Sopenharmony_ci 10248c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_enable_store(struct config_item *item, 10258c2ecf20Sopenharmony_ci const char *page, size_t count) 10268c2ecf20Sopenharmony_ci{ 10278c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = to_tpg(item); 10288c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, 10298c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); 10308c2ecf20Sopenharmony_ci u32 op; 10318c2ecf20Sopenharmony_ci int ret; 10328c2ecf20Sopenharmony_ci 10338c2ecf20Sopenharmony_ci ret = kstrtou32(page, 0, &op); 10348c2ecf20Sopenharmony_ci if (ret) 10358c2ecf20Sopenharmony_ci return ret; 10368c2ecf20Sopenharmony_ci if ((op != 1) && (op != 0)) { 10378c2ecf20Sopenharmony_ci pr_err("Illegal value for tpg_enable: %u\n", op); 10388c2ecf20Sopenharmony_ci return -EINVAL; 10398c2ecf20Sopenharmony_ci } 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci ret = iscsit_get_tpg(tpg); 10428c2ecf20Sopenharmony_ci if (ret < 0) 10438c2ecf20Sopenharmony_ci return -EINVAL; 10448c2ecf20Sopenharmony_ci 10458c2ecf20Sopenharmony_ci if (op) { 10468c2ecf20Sopenharmony_ci ret = iscsit_tpg_enable_portal_group(tpg); 10478c2ecf20Sopenharmony_ci if (ret < 0) 10488c2ecf20Sopenharmony_ci goto out; 10498c2ecf20Sopenharmony_ci } else { 10508c2ecf20Sopenharmony_ci /* 10518c2ecf20Sopenharmony_ci * iscsit_tpg_disable_portal_group() assumes force=1 10528c2ecf20Sopenharmony_ci */ 10538c2ecf20Sopenharmony_ci ret = iscsit_tpg_disable_portal_group(tpg, 1); 10548c2ecf20Sopenharmony_ci if (ret < 0) 10558c2ecf20Sopenharmony_ci goto out; 10568c2ecf20Sopenharmony_ci } 10578c2ecf20Sopenharmony_ci 10588c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 10598c2ecf20Sopenharmony_ci return count; 10608c2ecf20Sopenharmony_ciout: 10618c2ecf20Sopenharmony_ci iscsit_put_tpg(tpg); 10628c2ecf20Sopenharmony_ci return -EINVAL; 10638c2ecf20Sopenharmony_ci} 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci 10668c2ecf20Sopenharmony_cistatic ssize_t lio_target_tpg_dynamic_sessions_show(struct config_item *item, 10678c2ecf20Sopenharmony_ci char *page) 10688c2ecf20Sopenharmony_ci{ 10698c2ecf20Sopenharmony_ci return target_show_dynamic_sessions(to_tpg(item), page); 10708c2ecf20Sopenharmony_ci} 10718c2ecf20Sopenharmony_ci 10728c2ecf20Sopenharmony_ciCONFIGFS_ATTR(lio_target_tpg_, enable); 10738c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_tpg_, dynamic_sessions); 10748c2ecf20Sopenharmony_ci 10758c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_tpg_attrs[] = { 10768c2ecf20Sopenharmony_ci &lio_target_tpg_attr_enable, 10778c2ecf20Sopenharmony_ci &lio_target_tpg_attr_dynamic_sessions, 10788c2ecf20Sopenharmony_ci NULL, 10798c2ecf20Sopenharmony_ci}; 10808c2ecf20Sopenharmony_ci 10818c2ecf20Sopenharmony_ci/* End items for lio_target_tpg_cit */ 10828c2ecf20Sopenharmony_ci 10838c2ecf20Sopenharmony_ci/* Start items for lio_target_tiqn_cit */ 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_cistatic struct se_portal_group *lio_target_tiqn_addtpg(struct se_wwn *wwn, 10868c2ecf20Sopenharmony_ci const char *name) 10878c2ecf20Sopenharmony_ci{ 10888c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg; 10898c2ecf20Sopenharmony_ci struct iscsi_tiqn *tiqn; 10908c2ecf20Sopenharmony_ci char *tpgt_str; 10918c2ecf20Sopenharmony_ci int ret; 10928c2ecf20Sopenharmony_ci u16 tpgt; 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn); 10958c2ecf20Sopenharmony_ci /* 10968c2ecf20Sopenharmony_ci * Only tpgt_# directory groups can be created below 10978c2ecf20Sopenharmony_ci * target/iscsi/iqn.superturodiskarry/ 10988c2ecf20Sopenharmony_ci */ 10998c2ecf20Sopenharmony_ci tpgt_str = strstr(name, "tpgt_"); 11008c2ecf20Sopenharmony_ci if (!tpgt_str) { 11018c2ecf20Sopenharmony_ci pr_err("Unable to locate \"tpgt_#\" directory" 11028c2ecf20Sopenharmony_ci " group\n"); 11038c2ecf20Sopenharmony_ci return NULL; 11048c2ecf20Sopenharmony_ci } 11058c2ecf20Sopenharmony_ci tpgt_str += 5; /* Skip ahead of "tpgt_" */ 11068c2ecf20Sopenharmony_ci ret = kstrtou16(tpgt_str, 0, &tpgt); 11078c2ecf20Sopenharmony_ci if (ret) 11088c2ecf20Sopenharmony_ci return NULL; 11098c2ecf20Sopenharmony_ci 11108c2ecf20Sopenharmony_ci tpg = iscsit_alloc_portal_group(tiqn, tpgt); 11118c2ecf20Sopenharmony_ci if (!tpg) 11128c2ecf20Sopenharmony_ci return NULL; 11138c2ecf20Sopenharmony_ci 11148c2ecf20Sopenharmony_ci ret = core_tpg_register(wwn, &tpg->tpg_se_tpg, SCSI_PROTOCOL_ISCSI); 11158c2ecf20Sopenharmony_ci if (ret < 0) 11168c2ecf20Sopenharmony_ci goto free_out; 11178c2ecf20Sopenharmony_ci 11188c2ecf20Sopenharmony_ci ret = iscsit_tpg_add_portal_group(tiqn, tpg); 11198c2ecf20Sopenharmony_ci if (ret != 0) 11208c2ecf20Sopenharmony_ci goto out; 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn); 11238c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated TPG: %s\n", 11248c2ecf20Sopenharmony_ci name); 11258c2ecf20Sopenharmony_ci return &tpg->tpg_se_tpg; 11268c2ecf20Sopenharmony_ciout: 11278c2ecf20Sopenharmony_ci core_tpg_deregister(&tpg->tpg_se_tpg); 11288c2ecf20Sopenharmony_cifree_out: 11298c2ecf20Sopenharmony_ci kfree(tpg); 11308c2ecf20Sopenharmony_ci return NULL; 11318c2ecf20Sopenharmony_ci} 11328c2ecf20Sopenharmony_ci 11338c2ecf20Sopenharmony_cistatic void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg) 11348c2ecf20Sopenharmony_ci{ 11358c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg; 11368c2ecf20Sopenharmony_ci struct iscsi_tiqn *tiqn; 11378c2ecf20Sopenharmony_ci 11388c2ecf20Sopenharmony_ci tpg = container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg); 11398c2ecf20Sopenharmony_ci tiqn = tpg->tpg_tiqn; 11408c2ecf20Sopenharmony_ci /* 11418c2ecf20Sopenharmony_ci * iscsit_tpg_del_portal_group() assumes force=1 11428c2ecf20Sopenharmony_ci */ 11438c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: DEREGISTER -> Releasing TPG\n"); 11448c2ecf20Sopenharmony_ci iscsit_tpg_del_portal_group(tiqn, tpg, 1); 11458c2ecf20Sopenharmony_ci} 11468c2ecf20Sopenharmony_ci 11478c2ecf20Sopenharmony_ci/* End items for lio_target_tiqn_cit */ 11488c2ecf20Sopenharmony_ci 11498c2ecf20Sopenharmony_ci/* Start LIO-Target TIQN struct contig_item lio_target_cit */ 11508c2ecf20Sopenharmony_ci 11518c2ecf20Sopenharmony_cistatic ssize_t lio_target_wwn_lio_version_show(struct config_item *item, 11528c2ecf20Sopenharmony_ci char *page) 11538c2ecf20Sopenharmony_ci{ 11548c2ecf20Sopenharmony_ci return sprintf(page, "Datera Inc. iSCSI Target "ISCSIT_VERSION"\n"); 11558c2ecf20Sopenharmony_ci} 11568c2ecf20Sopenharmony_ci 11578c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(lio_target_wwn_, lio_version); 11588c2ecf20Sopenharmony_ci 11598c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_wwn_attrs[] = { 11608c2ecf20Sopenharmony_ci &lio_target_wwn_attr_lio_version, 11618c2ecf20Sopenharmony_ci NULL, 11628c2ecf20Sopenharmony_ci}; 11638c2ecf20Sopenharmony_ci 11648c2ecf20Sopenharmony_cistatic struct se_wwn *lio_target_call_coreaddtiqn( 11658c2ecf20Sopenharmony_ci struct target_fabric_configfs *tf, 11668c2ecf20Sopenharmony_ci struct config_group *group, 11678c2ecf20Sopenharmony_ci const char *name) 11688c2ecf20Sopenharmony_ci{ 11698c2ecf20Sopenharmony_ci struct iscsi_tiqn *tiqn; 11708c2ecf20Sopenharmony_ci 11718c2ecf20Sopenharmony_ci tiqn = iscsit_add_tiqn((unsigned char *)name); 11728c2ecf20Sopenharmony_ci if (IS_ERR(tiqn)) 11738c2ecf20Sopenharmony_ci return ERR_CAST(tiqn); 11748c2ecf20Sopenharmony_ci 11758c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn); 11768c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:" 11778c2ecf20Sopenharmony_ci " %s\n", name); 11788c2ecf20Sopenharmony_ci return &tiqn->tiqn_wwn; 11798c2ecf20Sopenharmony_ci} 11808c2ecf20Sopenharmony_ci 11818c2ecf20Sopenharmony_cistatic void lio_target_add_wwn_groups(struct se_wwn *wwn) 11828c2ecf20Sopenharmony_ci{ 11838c2ecf20Sopenharmony_ci struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn); 11848c2ecf20Sopenharmony_ci 11858c2ecf20Sopenharmony_ci config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group, 11868c2ecf20Sopenharmony_ci "iscsi_instance", &iscsi_stat_instance_cit); 11878c2ecf20Sopenharmony_ci configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group, 11888c2ecf20Sopenharmony_ci &tiqn->tiqn_wwn.fabric_stat_group); 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_sess_err_group, 11918c2ecf20Sopenharmony_ci "iscsi_sess_err", &iscsi_stat_sess_err_cit); 11928c2ecf20Sopenharmony_ci configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_sess_err_group, 11938c2ecf20Sopenharmony_ci &tiqn->tiqn_wwn.fabric_stat_group); 11948c2ecf20Sopenharmony_ci 11958c2ecf20Sopenharmony_ci config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group, 11968c2ecf20Sopenharmony_ci "iscsi_tgt_attr", &iscsi_stat_tgt_attr_cit); 11978c2ecf20Sopenharmony_ci configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_tgt_attr_group, 11988c2ecf20Sopenharmony_ci &tiqn->tiqn_wwn.fabric_stat_group); 11998c2ecf20Sopenharmony_ci 12008c2ecf20Sopenharmony_ci config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_login_stats_group, 12018c2ecf20Sopenharmony_ci "iscsi_login_stats", &iscsi_stat_login_cit); 12028c2ecf20Sopenharmony_ci configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_login_stats_group, 12038c2ecf20Sopenharmony_ci &tiqn->tiqn_wwn.fabric_stat_group); 12048c2ecf20Sopenharmony_ci 12058c2ecf20Sopenharmony_ci config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group, 12068c2ecf20Sopenharmony_ci "iscsi_logout_stats", &iscsi_stat_logout_cit); 12078c2ecf20Sopenharmony_ci configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group, 12088c2ecf20Sopenharmony_ci &tiqn->tiqn_wwn.fabric_stat_group); 12098c2ecf20Sopenharmony_ci} 12108c2ecf20Sopenharmony_ci 12118c2ecf20Sopenharmony_cistatic void lio_target_call_coredeltiqn( 12128c2ecf20Sopenharmony_ci struct se_wwn *wwn) 12138c2ecf20Sopenharmony_ci{ 12148c2ecf20Sopenharmony_ci struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn); 12158c2ecf20Sopenharmony_ci 12168c2ecf20Sopenharmony_ci pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n", 12178c2ecf20Sopenharmony_ci tiqn->tiqn); 12188c2ecf20Sopenharmony_ci iscsit_del_tiqn(tiqn); 12198c2ecf20Sopenharmony_ci} 12208c2ecf20Sopenharmony_ci 12218c2ecf20Sopenharmony_ci/* End LIO-Target TIQN struct contig_lio_target_cit */ 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci/* Start lio_target_discovery_auth_cit */ 12248c2ecf20Sopenharmony_ci 12258c2ecf20Sopenharmony_ci#define DEF_DISC_AUTH_STR(name, flags) \ 12268c2ecf20Sopenharmony_ci __DEF_NACL_AUTH_STR(disc, name, flags) \ 12278c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \ 12288c2ecf20Sopenharmony_ci{ \ 12298c2ecf20Sopenharmony_ci return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl,\ 12308c2ecf20Sopenharmony_ci page); \ 12318c2ecf20Sopenharmony_ci} \ 12328c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_store(struct config_item *item, \ 12338c2ecf20Sopenharmony_ci const char *page, size_t count) \ 12348c2ecf20Sopenharmony_ci{ \ 12358c2ecf20Sopenharmony_ci return __iscsi_disc_##name##_store(&iscsit_global->discovery_acl, \ 12368c2ecf20Sopenharmony_ci page, count); \ 12378c2ecf20Sopenharmony_ci \ 12388c2ecf20Sopenharmony_ci} \ 12398c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_disc_, name) 12408c2ecf20Sopenharmony_ci 12418c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(userid, NAF_USERID_SET); 12428c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(password, NAF_PASSWORD_SET); 12438c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(userid_mutual, NAF_USERID_IN_SET); 12448c2ecf20Sopenharmony_ciDEF_DISC_AUTH_STR(password_mutual, NAF_PASSWORD_IN_SET); 12458c2ecf20Sopenharmony_ci 12468c2ecf20Sopenharmony_ci#define DEF_DISC_AUTH_INT(name) \ 12478c2ecf20Sopenharmony_ci __DEF_NACL_AUTH_INT(disc, name) \ 12488c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_##name##_show(struct config_item *item, char *page) \ 12498c2ecf20Sopenharmony_ci{ \ 12508c2ecf20Sopenharmony_ci return __iscsi_disc_##name##_show(&iscsit_global->discovery_acl, \ 12518c2ecf20Sopenharmony_ci page); \ 12528c2ecf20Sopenharmony_ci} \ 12538c2ecf20Sopenharmony_ciCONFIGFS_ATTR_RO(iscsi_disc_, name) 12548c2ecf20Sopenharmony_ci 12558c2ecf20Sopenharmony_ciDEF_DISC_AUTH_INT(authenticate_target); 12568c2ecf20Sopenharmony_ci 12578c2ecf20Sopenharmony_ci 12588c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_enforce_discovery_auth_show(struct config_item *item, 12598c2ecf20Sopenharmony_ci char *page) 12608c2ecf20Sopenharmony_ci{ 12618c2ecf20Sopenharmony_ci struct iscsi_node_auth *discovery_auth = &iscsit_global->discovery_acl.node_auth; 12628c2ecf20Sopenharmony_ci 12638c2ecf20Sopenharmony_ci return sprintf(page, "%d\n", discovery_auth->enforce_discovery_auth); 12648c2ecf20Sopenharmony_ci} 12658c2ecf20Sopenharmony_ci 12668c2ecf20Sopenharmony_cistatic ssize_t iscsi_disc_enforce_discovery_auth_store(struct config_item *item, 12678c2ecf20Sopenharmony_ci const char *page, size_t count) 12688c2ecf20Sopenharmony_ci{ 12698c2ecf20Sopenharmony_ci struct iscsi_param *param; 12708c2ecf20Sopenharmony_ci struct iscsi_portal_group *discovery_tpg = iscsit_global->discovery_tpg; 12718c2ecf20Sopenharmony_ci u32 op; 12728c2ecf20Sopenharmony_ci int err; 12738c2ecf20Sopenharmony_ci 12748c2ecf20Sopenharmony_ci err = kstrtou32(page, 0, &op); 12758c2ecf20Sopenharmony_ci if (err) 12768c2ecf20Sopenharmony_ci return -EINVAL; 12778c2ecf20Sopenharmony_ci if ((op != 1) && (op != 0)) { 12788c2ecf20Sopenharmony_ci pr_err("Illegal value for enforce_discovery_auth:" 12798c2ecf20Sopenharmony_ci " %u\n", op); 12808c2ecf20Sopenharmony_ci return -EINVAL; 12818c2ecf20Sopenharmony_ci } 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_ci if (!discovery_tpg) { 12848c2ecf20Sopenharmony_ci pr_err("iscsit_global->discovery_tpg is NULL\n"); 12858c2ecf20Sopenharmony_ci return -EINVAL; 12868c2ecf20Sopenharmony_ci } 12878c2ecf20Sopenharmony_ci 12888c2ecf20Sopenharmony_ci param = iscsi_find_param_from_key(AUTHMETHOD, 12898c2ecf20Sopenharmony_ci discovery_tpg->param_list); 12908c2ecf20Sopenharmony_ci if (!param) 12918c2ecf20Sopenharmony_ci return -EINVAL; 12928c2ecf20Sopenharmony_ci 12938c2ecf20Sopenharmony_ci if (op) { 12948c2ecf20Sopenharmony_ci /* 12958c2ecf20Sopenharmony_ci * Reset the AuthMethod key to CHAP. 12968c2ecf20Sopenharmony_ci */ 12978c2ecf20Sopenharmony_ci if (iscsi_update_param_value(param, CHAP) < 0) 12988c2ecf20Sopenharmony_ci return -EINVAL; 12998c2ecf20Sopenharmony_ci 13008c2ecf20Sopenharmony_ci discovery_tpg->tpg_attrib.authentication = 1; 13018c2ecf20Sopenharmony_ci iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 1; 13028c2ecf20Sopenharmony_ci pr_debug("LIO-CORE[0] Successfully enabled" 13038c2ecf20Sopenharmony_ci " authentication enforcement for iSCSI" 13048c2ecf20Sopenharmony_ci " Discovery TPG\n"); 13058c2ecf20Sopenharmony_ci } else { 13068c2ecf20Sopenharmony_ci /* 13078c2ecf20Sopenharmony_ci * Reset the AuthMethod key to CHAP,None 13088c2ecf20Sopenharmony_ci */ 13098c2ecf20Sopenharmony_ci if (iscsi_update_param_value(param, "CHAP,None") < 0) 13108c2ecf20Sopenharmony_ci return -EINVAL; 13118c2ecf20Sopenharmony_ci 13128c2ecf20Sopenharmony_ci discovery_tpg->tpg_attrib.authentication = 0; 13138c2ecf20Sopenharmony_ci iscsit_global->discovery_acl.node_auth.enforce_discovery_auth = 0; 13148c2ecf20Sopenharmony_ci pr_debug("LIO-CORE[0] Successfully disabled" 13158c2ecf20Sopenharmony_ci " authentication enforcement for iSCSI" 13168c2ecf20Sopenharmony_ci " Discovery TPG\n"); 13178c2ecf20Sopenharmony_ci } 13188c2ecf20Sopenharmony_ci 13198c2ecf20Sopenharmony_ci return count; 13208c2ecf20Sopenharmony_ci} 13218c2ecf20Sopenharmony_ci 13228c2ecf20Sopenharmony_ciCONFIGFS_ATTR(iscsi_disc_, enforce_discovery_auth); 13238c2ecf20Sopenharmony_ci 13248c2ecf20Sopenharmony_cistatic struct configfs_attribute *lio_target_discovery_auth_attrs[] = { 13258c2ecf20Sopenharmony_ci &iscsi_disc_attr_userid, 13268c2ecf20Sopenharmony_ci &iscsi_disc_attr_password, 13278c2ecf20Sopenharmony_ci &iscsi_disc_attr_authenticate_target, 13288c2ecf20Sopenharmony_ci &iscsi_disc_attr_userid_mutual, 13298c2ecf20Sopenharmony_ci &iscsi_disc_attr_password_mutual, 13308c2ecf20Sopenharmony_ci &iscsi_disc_attr_enforce_discovery_auth, 13318c2ecf20Sopenharmony_ci NULL, 13328c2ecf20Sopenharmony_ci}; 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci/* End lio_target_discovery_auth_cit */ 13358c2ecf20Sopenharmony_ci 13368c2ecf20Sopenharmony_ci/* Start functions for target_core_fabric_ops */ 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_cistatic int iscsi_get_cmd_state(struct se_cmd *se_cmd) 13398c2ecf20Sopenharmony_ci{ 13408c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 13418c2ecf20Sopenharmony_ci 13428c2ecf20Sopenharmony_ci return cmd->i_state; 13438c2ecf20Sopenharmony_ci} 13448c2ecf20Sopenharmony_ci 13458c2ecf20Sopenharmony_cistatic u32 lio_sess_get_index(struct se_session *se_sess) 13468c2ecf20Sopenharmony_ci{ 13478c2ecf20Sopenharmony_ci struct iscsi_session *sess = se_sess->fabric_sess_ptr; 13488c2ecf20Sopenharmony_ci 13498c2ecf20Sopenharmony_ci return sess->session_index; 13508c2ecf20Sopenharmony_ci} 13518c2ecf20Sopenharmony_ci 13528c2ecf20Sopenharmony_cistatic u32 lio_sess_get_initiator_sid( 13538c2ecf20Sopenharmony_ci struct se_session *se_sess, 13548c2ecf20Sopenharmony_ci unsigned char *buf, 13558c2ecf20Sopenharmony_ci u32 size) 13568c2ecf20Sopenharmony_ci{ 13578c2ecf20Sopenharmony_ci struct iscsi_session *sess = se_sess->fabric_sess_ptr; 13588c2ecf20Sopenharmony_ci /* 13598c2ecf20Sopenharmony_ci * iSCSI Initiator Session Identifier from RFC-3720. 13608c2ecf20Sopenharmony_ci */ 13618c2ecf20Sopenharmony_ci return snprintf(buf, size, "%6phN", sess->isid); 13628c2ecf20Sopenharmony_ci} 13638c2ecf20Sopenharmony_ci 13648c2ecf20Sopenharmony_cistatic int lio_queue_data_in(struct se_cmd *se_cmd) 13658c2ecf20Sopenharmony_ci{ 13668c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 13678c2ecf20Sopenharmony_ci struct iscsi_conn *conn = cmd->conn; 13688c2ecf20Sopenharmony_ci 13698c2ecf20Sopenharmony_ci cmd->i_state = ISTATE_SEND_DATAIN; 13708c2ecf20Sopenharmony_ci return conn->conn_transport->iscsit_queue_data_in(conn, cmd); 13718c2ecf20Sopenharmony_ci} 13728c2ecf20Sopenharmony_ci 13738c2ecf20Sopenharmony_cistatic int lio_write_pending(struct se_cmd *se_cmd) 13748c2ecf20Sopenharmony_ci{ 13758c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 13768c2ecf20Sopenharmony_ci struct iscsi_conn *conn = cmd->conn; 13778c2ecf20Sopenharmony_ci 13788c2ecf20Sopenharmony_ci if (!cmd->immediate_data && !cmd->unsolicited_data) 13798c2ecf20Sopenharmony_ci return conn->conn_transport->iscsit_get_dataout(conn, cmd, false); 13808c2ecf20Sopenharmony_ci 13818c2ecf20Sopenharmony_ci return 0; 13828c2ecf20Sopenharmony_ci} 13838c2ecf20Sopenharmony_ci 13848c2ecf20Sopenharmony_cistatic int lio_queue_status(struct se_cmd *se_cmd) 13858c2ecf20Sopenharmony_ci{ 13868c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 13878c2ecf20Sopenharmony_ci struct iscsi_conn *conn = cmd->conn; 13888c2ecf20Sopenharmony_ci 13898c2ecf20Sopenharmony_ci cmd->i_state = ISTATE_SEND_STATUS; 13908c2ecf20Sopenharmony_ci 13918c2ecf20Sopenharmony_ci if (cmd->se_cmd.scsi_status || cmd->sense_reason) { 13928c2ecf20Sopenharmony_ci return iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); 13938c2ecf20Sopenharmony_ci } 13948c2ecf20Sopenharmony_ci return conn->conn_transport->iscsit_queue_status(conn, cmd); 13958c2ecf20Sopenharmony_ci} 13968c2ecf20Sopenharmony_ci 13978c2ecf20Sopenharmony_cistatic void lio_queue_tm_rsp(struct se_cmd *se_cmd) 13988c2ecf20Sopenharmony_ci{ 13998c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 14008c2ecf20Sopenharmony_ci 14018c2ecf20Sopenharmony_ci cmd->i_state = ISTATE_SEND_TASKMGTRSP; 14028c2ecf20Sopenharmony_ci iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); 14038c2ecf20Sopenharmony_ci} 14048c2ecf20Sopenharmony_ci 14058c2ecf20Sopenharmony_cistatic void lio_aborted_task(struct se_cmd *se_cmd) 14068c2ecf20Sopenharmony_ci{ 14078c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 14088c2ecf20Sopenharmony_ci 14098c2ecf20Sopenharmony_ci cmd->conn->conn_transport->iscsit_aborted_task(cmd->conn, cmd); 14108c2ecf20Sopenharmony_ci} 14118c2ecf20Sopenharmony_ci 14128c2ecf20Sopenharmony_cistatic inline struct iscsi_portal_group *iscsi_tpg(struct se_portal_group *se_tpg) 14138c2ecf20Sopenharmony_ci{ 14148c2ecf20Sopenharmony_ci return container_of(se_tpg, struct iscsi_portal_group, tpg_se_tpg); 14158c2ecf20Sopenharmony_ci} 14168c2ecf20Sopenharmony_ci 14178c2ecf20Sopenharmony_cistatic char *lio_tpg_get_endpoint_wwn(struct se_portal_group *se_tpg) 14188c2ecf20Sopenharmony_ci{ 14198c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_tiqn->tiqn; 14208c2ecf20Sopenharmony_ci} 14218c2ecf20Sopenharmony_ci 14228c2ecf20Sopenharmony_cistatic u16 lio_tpg_get_tag(struct se_portal_group *se_tpg) 14238c2ecf20Sopenharmony_ci{ 14248c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpgt; 14258c2ecf20Sopenharmony_ci} 14268c2ecf20Sopenharmony_ci 14278c2ecf20Sopenharmony_cistatic u32 lio_tpg_get_default_depth(struct se_portal_group *se_tpg) 14288c2ecf20Sopenharmony_ci{ 14298c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.default_cmdsn_depth; 14308c2ecf20Sopenharmony_ci} 14318c2ecf20Sopenharmony_ci 14328c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode(struct se_portal_group *se_tpg) 14338c2ecf20Sopenharmony_ci{ 14348c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.generate_node_acls; 14358c2ecf20Sopenharmony_ci} 14368c2ecf20Sopenharmony_ci 14378c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode_cache(struct se_portal_group *se_tpg) 14388c2ecf20Sopenharmony_ci{ 14398c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.cache_dynamic_acls; 14408c2ecf20Sopenharmony_ci} 14418c2ecf20Sopenharmony_ci 14428c2ecf20Sopenharmony_cistatic int lio_tpg_check_demo_mode_write_protect( 14438c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg) 14448c2ecf20Sopenharmony_ci{ 14458c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.demo_mode_write_protect; 14468c2ecf20Sopenharmony_ci} 14478c2ecf20Sopenharmony_ci 14488c2ecf20Sopenharmony_cistatic int lio_tpg_check_prod_mode_write_protect( 14498c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg) 14508c2ecf20Sopenharmony_ci{ 14518c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.prod_mode_write_protect; 14528c2ecf20Sopenharmony_ci} 14538c2ecf20Sopenharmony_ci 14548c2ecf20Sopenharmony_cistatic int lio_tpg_check_prot_fabric_only( 14558c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg) 14568c2ecf20Sopenharmony_ci{ 14578c2ecf20Sopenharmony_ci /* 14588c2ecf20Sopenharmony_ci * Only report fabric_prot_type if t10_pi has also been enabled 14598c2ecf20Sopenharmony_ci * for incoming ib_isert sessions. 14608c2ecf20Sopenharmony_ci */ 14618c2ecf20Sopenharmony_ci if (!iscsi_tpg(se_tpg)->tpg_attrib.t10_pi) 14628c2ecf20Sopenharmony_ci return 0; 14638c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_attrib.fabric_prot_type; 14648c2ecf20Sopenharmony_ci} 14658c2ecf20Sopenharmony_ci 14668c2ecf20Sopenharmony_ci/* 14678c2ecf20Sopenharmony_ci * This function calls iscsit_inc_session_usage_count() on the 14688c2ecf20Sopenharmony_ci * struct iscsi_session in question. 14698c2ecf20Sopenharmony_ci */ 14708c2ecf20Sopenharmony_cistatic void lio_tpg_close_session(struct se_session *se_sess) 14718c2ecf20Sopenharmony_ci{ 14728c2ecf20Sopenharmony_ci struct iscsi_session *sess = se_sess->fabric_sess_ptr; 14738c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = &sess->tpg->tpg_se_tpg; 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci spin_lock_bh(&se_tpg->session_lock); 14768c2ecf20Sopenharmony_ci spin_lock(&sess->conn_lock); 14778c2ecf20Sopenharmony_ci if (atomic_read(&sess->session_fall_back_to_erl0) || 14788c2ecf20Sopenharmony_ci atomic_read(&sess->session_logout) || 14798c2ecf20Sopenharmony_ci atomic_read(&sess->session_close) || 14808c2ecf20Sopenharmony_ci (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)) { 14818c2ecf20Sopenharmony_ci spin_unlock(&sess->conn_lock); 14828c2ecf20Sopenharmony_ci spin_unlock_bh(&se_tpg->session_lock); 14838c2ecf20Sopenharmony_ci return; 14848c2ecf20Sopenharmony_ci } 14858c2ecf20Sopenharmony_ci iscsit_inc_session_usage_count(sess); 14868c2ecf20Sopenharmony_ci atomic_set(&sess->session_reinstatement, 1); 14878c2ecf20Sopenharmony_ci atomic_set(&sess->session_fall_back_to_erl0, 1); 14888c2ecf20Sopenharmony_ci atomic_set(&sess->session_close, 1); 14898c2ecf20Sopenharmony_ci spin_unlock(&sess->conn_lock); 14908c2ecf20Sopenharmony_ci 14918c2ecf20Sopenharmony_ci iscsit_stop_time2retain_timer(sess); 14928c2ecf20Sopenharmony_ci spin_unlock_bh(&se_tpg->session_lock); 14938c2ecf20Sopenharmony_ci 14948c2ecf20Sopenharmony_ci iscsit_stop_session(sess, 1, 1); 14958c2ecf20Sopenharmony_ci iscsit_dec_session_usage_count(sess); 14968c2ecf20Sopenharmony_ci} 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_cistatic u32 lio_tpg_get_inst_index(struct se_portal_group *se_tpg) 14998c2ecf20Sopenharmony_ci{ 15008c2ecf20Sopenharmony_ci return iscsi_tpg(se_tpg)->tpg_tiqn->tiqn_index; 15018c2ecf20Sopenharmony_ci} 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_cistatic void lio_set_default_node_attributes(struct se_node_acl *se_acl) 15048c2ecf20Sopenharmony_ci{ 15058c2ecf20Sopenharmony_ci struct iscsi_node_acl *acl = container_of(se_acl, struct iscsi_node_acl, 15068c2ecf20Sopenharmony_ci se_node_acl); 15078c2ecf20Sopenharmony_ci struct se_portal_group *se_tpg = se_acl->se_tpg; 15088c2ecf20Sopenharmony_ci struct iscsi_portal_group *tpg = container_of(se_tpg, 15098c2ecf20Sopenharmony_ci struct iscsi_portal_group, tpg_se_tpg); 15108c2ecf20Sopenharmony_ci 15118c2ecf20Sopenharmony_ci acl->node_attrib.nacl = acl; 15128c2ecf20Sopenharmony_ci iscsit_set_default_node_attribues(acl, tpg); 15138c2ecf20Sopenharmony_ci} 15148c2ecf20Sopenharmony_ci 15158c2ecf20Sopenharmony_cistatic int lio_check_stop_free(struct se_cmd *se_cmd) 15168c2ecf20Sopenharmony_ci{ 15178c2ecf20Sopenharmony_ci return target_put_sess_cmd(se_cmd); 15188c2ecf20Sopenharmony_ci} 15198c2ecf20Sopenharmony_ci 15208c2ecf20Sopenharmony_cistatic void lio_release_cmd(struct se_cmd *se_cmd) 15218c2ecf20Sopenharmony_ci{ 15228c2ecf20Sopenharmony_ci struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); 15238c2ecf20Sopenharmony_ci 15248c2ecf20Sopenharmony_ci pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd); 15258c2ecf20Sopenharmony_ci iscsit_release_cmd(cmd); 15268c2ecf20Sopenharmony_ci} 15278c2ecf20Sopenharmony_ci 15288c2ecf20Sopenharmony_ciconst struct target_core_fabric_ops iscsi_ops = { 15298c2ecf20Sopenharmony_ci .module = THIS_MODULE, 15308c2ecf20Sopenharmony_ci .fabric_alias = "iscsi", 15318c2ecf20Sopenharmony_ci .fabric_name = "iSCSI", 15328c2ecf20Sopenharmony_ci .node_acl_size = sizeof(struct iscsi_node_acl), 15338c2ecf20Sopenharmony_ci .tpg_get_wwn = lio_tpg_get_endpoint_wwn, 15348c2ecf20Sopenharmony_ci .tpg_get_tag = lio_tpg_get_tag, 15358c2ecf20Sopenharmony_ci .tpg_get_default_depth = lio_tpg_get_default_depth, 15368c2ecf20Sopenharmony_ci .tpg_check_demo_mode = lio_tpg_check_demo_mode, 15378c2ecf20Sopenharmony_ci .tpg_check_demo_mode_cache = lio_tpg_check_demo_mode_cache, 15388c2ecf20Sopenharmony_ci .tpg_check_demo_mode_write_protect = 15398c2ecf20Sopenharmony_ci lio_tpg_check_demo_mode_write_protect, 15408c2ecf20Sopenharmony_ci .tpg_check_prod_mode_write_protect = 15418c2ecf20Sopenharmony_ci lio_tpg_check_prod_mode_write_protect, 15428c2ecf20Sopenharmony_ci .tpg_check_prot_fabric_only = &lio_tpg_check_prot_fabric_only, 15438c2ecf20Sopenharmony_ci .tpg_get_inst_index = lio_tpg_get_inst_index, 15448c2ecf20Sopenharmony_ci .check_stop_free = lio_check_stop_free, 15458c2ecf20Sopenharmony_ci .release_cmd = lio_release_cmd, 15468c2ecf20Sopenharmony_ci .close_session = lio_tpg_close_session, 15478c2ecf20Sopenharmony_ci .sess_get_index = lio_sess_get_index, 15488c2ecf20Sopenharmony_ci .sess_get_initiator_sid = lio_sess_get_initiator_sid, 15498c2ecf20Sopenharmony_ci .write_pending = lio_write_pending, 15508c2ecf20Sopenharmony_ci .set_default_node_attributes = lio_set_default_node_attributes, 15518c2ecf20Sopenharmony_ci .get_cmd_state = iscsi_get_cmd_state, 15528c2ecf20Sopenharmony_ci .queue_data_in = lio_queue_data_in, 15538c2ecf20Sopenharmony_ci .queue_status = lio_queue_status, 15548c2ecf20Sopenharmony_ci .queue_tm_rsp = lio_queue_tm_rsp, 15558c2ecf20Sopenharmony_ci .aborted_task = lio_aborted_task, 15568c2ecf20Sopenharmony_ci .fabric_make_wwn = lio_target_call_coreaddtiqn, 15578c2ecf20Sopenharmony_ci .fabric_drop_wwn = lio_target_call_coredeltiqn, 15588c2ecf20Sopenharmony_ci .add_wwn_groups = lio_target_add_wwn_groups, 15598c2ecf20Sopenharmony_ci .fabric_make_tpg = lio_target_tiqn_addtpg, 15608c2ecf20Sopenharmony_ci .fabric_drop_tpg = lio_target_tiqn_deltpg, 15618c2ecf20Sopenharmony_ci .fabric_make_np = lio_target_call_addnptotpg, 15628c2ecf20Sopenharmony_ci .fabric_drop_np = lio_target_call_delnpfromtpg, 15638c2ecf20Sopenharmony_ci .fabric_init_nodeacl = lio_target_init_nodeacl, 15648c2ecf20Sopenharmony_ci 15658c2ecf20Sopenharmony_ci .tfc_discovery_attrs = lio_target_discovery_auth_attrs, 15668c2ecf20Sopenharmony_ci .tfc_wwn_attrs = lio_target_wwn_attrs, 15678c2ecf20Sopenharmony_ci .tfc_tpg_base_attrs = lio_target_tpg_attrs, 15688c2ecf20Sopenharmony_ci .tfc_tpg_attrib_attrs = lio_target_tpg_attrib_attrs, 15698c2ecf20Sopenharmony_ci .tfc_tpg_auth_attrs = lio_target_tpg_auth_attrs, 15708c2ecf20Sopenharmony_ci .tfc_tpg_param_attrs = lio_target_tpg_param_attrs, 15718c2ecf20Sopenharmony_ci .tfc_tpg_np_base_attrs = lio_target_portal_attrs, 15728c2ecf20Sopenharmony_ci .tfc_tpg_nacl_base_attrs = lio_target_initiator_attrs, 15738c2ecf20Sopenharmony_ci .tfc_tpg_nacl_attrib_attrs = lio_target_nacl_attrib_attrs, 15748c2ecf20Sopenharmony_ci .tfc_tpg_nacl_auth_attrs = lio_target_nacl_auth_attrs, 15758c2ecf20Sopenharmony_ci .tfc_tpg_nacl_param_attrs = lio_target_nacl_param_attrs, 15768c2ecf20Sopenharmony_ci 15778c2ecf20Sopenharmony_ci .write_pending_must_be_called = true, 15788c2ecf20Sopenharmony_ci}; 1579