target_core_tpg.c revision 6708bb27bb2703da238f21f516034263348af5be
1c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/******************************************************************************* 2c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Filename: target_core_tpg.c 3c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 4c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This file contains generic Target Portal Group related functions. 5c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 6c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Copyright (c) 2002, 2003, 2004, 2005 PyX Technologies, Inc. 7c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Copyright (c) 2005, 2006, 2007 SBE, Inc. 8c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Copyright (c) 2007-2010 Rising Tide Systems 9c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Copyright (c) 2008-2010 Linux-iSCSI.org 10c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 11c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Nicholas A. Bellinger <nab@kernel.org> 12c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 13c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This program is free software; you can redistribute it and/or modify 14c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * it under the terms of the GNU General Public License as published by 15c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the Free Software Foundation; either version 2 of the License, or 16c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * (at your option) any later version. 17c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 18c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This program is distributed in the hope that it will be useful, 19c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * but WITHOUT ANY WARRANTY; without even the implied warranty of 20c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * GNU General Public License for more details. 22c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 23c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * You should have received a copy of the GNU General Public License 24c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * along with this program; if not, write to the Free Software 25c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 26c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 27c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ******************************************************************************/ 28c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 29c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/net.h> 30c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/string.h> 31c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/timer.h> 32c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/slab.h> 33c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/spinlock.h> 34c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/in.h> 35c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/sock.h> 36c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/tcp.h> 37c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi.h> 38c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi_cmnd.h> 39c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 40c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_base.h> 41c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_device.h> 42c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_tpg.h> 43c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_transport.h> 44c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_fabric_ops.h> 45c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 46c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include "target_core_hba.h" 47e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover#include "target_core_stat.h" 48e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 49e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverextern struct se_device *g_lun0_dev; 50e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 51e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic DEFINE_SPINLOCK(tpg_lock); 52e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic LIST_HEAD(tpg_list); 53c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 54c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_clear_initiator_node_from_tpg(): 55c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 56c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 57c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 58c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_clear_initiator_node_from_tpg( 59c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *nacl, 60c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 61c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 62c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 63c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 64c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 65c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun_acl *acl, *acl_tmp; 66c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 67c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 68c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 69c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger deve = &nacl->device_list[i]; 70c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 71c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!(deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS)) 72c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 73c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 74c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!deve->se_lun) { 756708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s device entries device pointer is" 76c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " NULL, but Initiator has access.\n", 77e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name()); 78c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 79c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 80c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 81c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = deve->se_lun; 82c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 83c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_update_device_list_for_node(lun, NULL, deve->mapped_lun, 84c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); 85c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 86c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&lun->lun_acl_lock); 87c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry_safe(acl, acl_tmp, 88c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &lun->lun_acl_list, lacl_list) { 896708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, nacl->initiatorname) && 906708bb27bb2703da238f21f516034263348af5beAndy Grover (acl->mapped_lun == deve->mapped_lun)) 91c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 92c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 93c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 94c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!acl) { 956708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to locate struct se_lun_acl for %s," 96c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " mapped_lun: %u\n", nacl->initiatorname, 97c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger deve->mapped_lun); 98c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&lun->lun_acl_lock); 99c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 100c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 101c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 102c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 103c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_del(&acl->lacl_list); 104c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&lun->lun_acl_lock); 105c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 106c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 107c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kfree(acl); 108c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 109c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 110c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 111c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 112c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* __core_tpg_get_initiator_node_acl(): 113c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 114c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * spin_lock_bh(&tpg->acl_node_lock); must be held when calling 115c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 116c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *__core_tpg_get_initiator_node_acl( 117c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 118c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname) 119c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 120c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 121c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 122c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(acl, &tpg->acl_node_list, acl_list) { 1236708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, initiatorname)) 124c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 125c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 126c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 127c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 128c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 129c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 130c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_get_initiator_node_acl(): 131c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 132c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 133c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 134c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_get_initiator_node_acl( 135c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 136c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 137c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 138c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 139c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 140c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 141c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(acl, &tpg->acl_node_list, acl_list) { 1426708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, initiatorname) && 1436708bb27bb2703da238f21f516034263348af5beAndy Grover !acl->dynamic_node_acl) { 144c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 145c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 146c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 147c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 148c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 149c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 150c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 151c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 152c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 153c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_node_to_devs(): 154c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 155c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 156c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 157c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_add_node_to_devs( 158c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 159c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 160c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 161c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i = 0; 162c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = 0; 163c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 164c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_device *dev; 165c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 166c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 167c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 168c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = &tpg->tpg_lun_list[i]; 169c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) 170c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 171c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 172c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 173c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 174c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev = lun->lun_se_dev; 175c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 176c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * By default in LIO-Target $FABRIC_MOD, 177c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo_mode_write_protect is ON, or READ_ONLY; 178c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1796708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode_write_protect(tpg)) { 180c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dev->dev_flags & DF_READ_ONLY) 181c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 182c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 183c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 184c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } else { 185c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 186c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Allow only optical drives to issue R/W in default RO 187c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo mode. 188c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 189e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (dev->transport->get_device_type(dev) == TYPE_DISK) 190c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 191c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 192c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 193c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 194c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1956708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]->TPG[%u]_LUN[%u] - Adding %s" 196c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " access for LUN in Demo Mode\n", 197e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 198e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), lun->unpacked_lun, 199c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun_access == TRANSPORT_LUNFLAGS_READ_WRITE) ? 200c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "READ-WRITE" : "READ-ONLY"); 201c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 202c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_update_device_list_for_node(lun, NULL, lun->unpacked_lun, 203c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access, acl, tpg, 1); 204c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 205c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 206c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 207c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 208c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 209c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_set_queue_depth_for_node(): 210c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 211c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 212c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 213c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_set_queue_depth_for_node( 214c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 215c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl) 216c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 217c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!acl->queue_depth) { 2186708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Queue depth for %s Initiator Node: %s is 0," 219e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "defaulting to 1.\n", tpg->se_tpg_tfo->get_fabric_name(), 220c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->initiatorname); 221c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = 1; 222c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 223c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 224c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 225c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 226c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 227c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_create_device_list_for_node(): 228c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 229c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 230c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 231c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_create_device_list_for_node(struct se_node_acl *nacl) 232c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 233c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 234c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 235c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 236c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger nacl->device_list = kzalloc(sizeof(struct se_dev_entry) * 237c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_MAX_LUNS_PER_TPG, GFP_KERNEL); 2386708bb27bb2703da238f21f516034263348af5beAndy Grover if (!nacl->device_list) { 2396708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate memory for" 240c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " struct se_node_acl->device_list\n"); 241e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return -ENOMEM; 242c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 243c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 244c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger deve = &nacl->device_list[i]; 245c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 246c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->ua_count, 0); 247c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->pr_ref_count, 0); 248c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&deve->ua_lock); 249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->alua_port_list); 250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->ua_list); 251c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 253c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 254c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 255c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 256c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_check_initiator_node_acl() 257c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 258c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 259c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 260c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_check_initiator_node_acl( 261c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 262c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 263c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 264c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 265c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 266c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = core_tpg_get_initiator_node_acl(tpg, initiatorname); 2676708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) 268c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 269c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2706708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode(tpg)) 271c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 272c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 273e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl = tpg->se_tpg_tfo->tpg_alloc_fabric_acl(tpg); 2746708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) 275c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 276c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 277c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 278c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 279c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 280c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 281c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 282e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl->queue_depth = tpg->se_tpg_tfo->tpg_get_default_depth(tpg); 283c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 284c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 285c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 286c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->stats_lock); 287c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 288c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 289e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 290c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 291c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 292e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 293c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 294c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 295c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 296c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 297c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 298e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 299c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 300c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 301c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 302c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_add_node_to_devs(acl, tpg); 303c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 304c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 305c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 306c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 307c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 308c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3096708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Added DYNAMIC ACL with TCQ Depth: %d for %s" 310e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 311e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 312e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 313c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 314c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 315c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 316c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_check_initiator_node_acl); 317c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 318c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *nacl) 319c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 320c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&nacl->acl_pr_ref_count) != 0) 321c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 322c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 323c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 324c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_clear_object_luns(struct se_portal_group *tpg) 325c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 326c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i, ret; 327c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 328c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 329c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 330c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 331c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = &tpg->tpg_lun_list[i]; 332c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 333c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if ((lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) || 334c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun->lun_se_dev == NULL)) 335c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 336c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 337c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 338c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = core_dev_del_lun(tpg, lun->unpacked_lun); 339c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 340c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 341c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 342c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 343c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_clear_object_luns); 344c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 345c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_initiator_node_acl(): 346c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 347c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 348c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 349c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_add_initiator_node_acl( 350c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 351c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl, 352c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname, 353c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth) 354c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 355c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl = NULL; 356c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 357c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 358c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 3596708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) { 360c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 361c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 3626708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Replacing dynamic ACL" 363e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " for %s\n", tpg->se_tpg_tfo->get_fabric_name(), 364e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), initiatorname); 365c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 366c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 367c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Release the locally allocated struct se_node_acl 368c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * because * core_tpg_add_initiator_node_acl() returned 369c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * a pointer to an existing demo mode node ACL. 370c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 371c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_nacl) 372e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, 373c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl); 374c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger goto done; 375c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 376c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3776708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("ACL entry for %s Initiator" 378c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s already exists for TPG %u, ignoring" 379e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 380e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 381c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 382c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EEXIST); 383c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 384c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 385c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3866708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_nacl) { 3876708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("struct se_node_acl pointer is NULL\n"); 388c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 389c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 390c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 391c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For v4.x logic the se_node_acl_s is hanging off a fabric 392c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * dependent structure allocated via 393c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * struct target_core_fabric_ops->fabric_make_nodeacl() 394c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 395c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = se_nacl; 396c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 397c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 398c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 399c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 400c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 401c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 402c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 403c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 404c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 405c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 406c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->stats_lock); 407c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 408e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 409c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 410c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 411e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 412c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENOMEM); 413c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 414c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 415c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 416c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 417e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 418c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 419c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 420c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 421c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 422c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 423c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 424c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 425c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 426c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerdone: 4276708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Added ACL with TCQ Depth: %d for %s" 428e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 429e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 430e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 431c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 432c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 433c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 434c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_add_initiator_node_acl); 435c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 436c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_del_initiator_node_acl(): 437c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 438c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 439c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 440c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_del_initiator_node_acl( 441c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 442c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 443c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 444c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 445c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *sess_tmp; 446c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int dynamic_acl = 0; 447c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 448c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 449c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 450c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 451c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dynamic_acl = 1; 452c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 453c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_del(&acl->acl_list); 454c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls--; 455c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 456c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 457c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->session_lock); 458c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry_safe(sess, sess_tmp, 459c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &tpg->tpg_sess_list, sess_list) { 460c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (sess->se_node_acl != acl) 461c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 462c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 463c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if the session needs to be closed by our context. 464c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 4656708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->shutdown_session(sess)) 466c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 467c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 468c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->session_lock); 469c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 470c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the $FABRIC_MOD session for the Initiator Node ACL exists, 471c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * forcefully shutdown the $FABRIC_MOD session/nexus. 472c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 473e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(sess); 474c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 475c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->session_lock); 476c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 477c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->session_lock); 478c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 479c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_wait_for_nacl_pr_ref(acl); 480c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_clear_initiator_node_from_tpg(acl, tpg); 481c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 482c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 4836708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Deleted ACL with TCQ Depth: %d for %s" 484e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 485e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 486e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), acl->initiatorname); 487c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 488c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 489c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 490c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_del_initiator_node_acl); 491c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 492c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_set_initiator_node_queue_depth(): 493c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 494c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 495c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 496c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_set_initiator_node_queue_depth( 497c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 498c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname, 499c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth, 500c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 501c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 502c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *init_sess = NULL; 503c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 504c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int dynamic_acl = 0; 505c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 506c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 507c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 5086708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) { 5096708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Access Control List entry for %s Initiator" 510c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s does not exists for TPG %hu, ignoring" 511e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 512e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 513c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 514c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENODEV; 515c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 516c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 517c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 518c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dynamic_acl = 1; 519c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 520c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 521c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 522c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->session_lock); 523c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(sess, &tpg->tpg_sess_list, sess_list) { 524c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (sess->se_node_acl != acl) 525c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 526c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 527c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!force) { 5286708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to change queue depth for %s" 529c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Initiator Node: %s while session is" 530c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " operational. To forcefully change the queue" 531c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " depth and force session reinstatement" 532c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " use the \"force=1\" parameter.\n", 533e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 534c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->session_lock); 535c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 536c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 537c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 538c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 539c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 540c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EEXIST; 541c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 542c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 543c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if the session needs to be closed by our context. 544c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 5456708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->shutdown_session(sess)) 546c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 547c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 548c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_sess = sess; 549c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 550c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 551c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 552c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 553c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * User has requested to change the queue depth for a Initiator Node. 554c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Change the value in the Node's struct se_node_acl, and call 555c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() to add the requested queue depth. 556c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 557e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * Finally call tpg->se_tpg_tfo->close_session() to force session 558c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * reinstatement to occur if there is an active session for the 559c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * $FABRIC_MOD Initiator Node in question. 560c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 561c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 562c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 563c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 564c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->session_lock); 565c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 566c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Force session reinstatement if 567c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() failed, because we assume 568c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the $FABRIC_MOD has already the set session reinstatement 569e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * bit from tpg->se_tpg_tfo->shutdown_session() called above. 570c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 571c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 572e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 573c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 574c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 575c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 576c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 577c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 578c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EINVAL; 579c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 580c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->session_lock); 581c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 582c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the $FABRIC_MOD session for the Initiator Node ACL exists, 583c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * forcefully shutdown the $FABRIC_MOD session/nexus. 584c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 585c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 586e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 587c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 5886708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Successfuly changed queue depth to: %d for Initiator" 589c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node: %s on %s Target Portal Group: %u\n", queue_depth, 590e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->get_fabric_name(), 591e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 592c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 593c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_bh(&tpg->acl_node_lock); 594c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 595c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 596c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_bh(&tpg->acl_node_lock); 597c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 598c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 599c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 600c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_set_initiator_node_queue_depth); 601c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 602c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg) 603c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 604c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* Set in core_dev_setup_virtual_lun0() */ 605e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover struct se_device *dev = g_lun0_dev; 606c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun = &se_tpg->tpg_virt_lun0; 607c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 608c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret; 609c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 610c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = 0; 611c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 612c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 613c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 614c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 615c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_cmd_list); 616c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 617c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_cmd_lock); 618c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 619c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 620c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = core_tpg_post_addlun(se_tpg, lun, lun_access, dev); 621c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret < 0) 622e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return ret; 623c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 624c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 625c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 626c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 627c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_tpg_release_virtual_lun0(struct se_portal_group *se_tpg) 628c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 629c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun = &se_tpg->tpg_virt_lun0; 630c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 631c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_post_dellun(se_tpg, lun); 632c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 633c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 634c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_register( 635c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct target_core_fabric_ops *tfo, 636c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_wwn *se_wwn, 637c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg, 638c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *tpg_fabric_ptr, 639c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int se_tpg_type) 640c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 641c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 642c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 i; 643c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 644c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->tpg_lun_list = kzalloc((sizeof(struct se_lun) * 645c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_MAX_LUNS_PER_TPG), GFP_KERNEL); 6466708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_tpg->tpg_lun_list) { 6476708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate struct se_portal_group->" 648c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "tpg_lun_list\n"); 649c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 650c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 651c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 652c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 653c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = &se_tpg->tpg_lun_list[i]; 654c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = i; 655c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 656c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 657c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 658c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 659c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_cmd_list); 660c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 661c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_cmd_lock); 662c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 664c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 665c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_type = se_tpg_type; 666c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = tpg_fabric_ptr; 667c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_tfo = tfo; 668c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_wwn = se_wwn; 669c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&se_tpg->tpg_pr_ref_count, 0); 670c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->acl_node_list); 671e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover INIT_LIST_HEAD(&se_tpg->se_tpg_node); 672c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->tpg_sess_list); 673c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->acl_node_lock); 674c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->session_lock); 675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->tpg_lun_lock); 676c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 677c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) { 678c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_tpg_setup_virtual_lun0(se_tpg) < 0) { 679c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kfree(se_tpg); 680c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 681c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 682c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 683c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 684e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 685e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_add_tail(&se_tpg->se_tpg_node, &tpg_list); 686e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 687c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6886708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Allocated %s struct se_portal_group for" 689c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " endpoint: %s, Portal Tag: %u\n", tfo->get_fabric_name(), 690c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 691c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "Normal" : "Discovery", (tfo->tpg_get_wwn(se_tpg) == NULL) ? 692c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "None" : tfo->tpg_get_wwn(se_tpg), tfo->tpg_get_tag(se_tpg)); 693c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 694c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 695c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 696c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_register); 697c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 698c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_deregister(struct se_portal_group *se_tpg) 699c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 700e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger struct se_node_acl *nacl, *nacl_tmp; 701e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 7026708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Deallocating %s struct se_portal_group" 703c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " for endpoint: %s Portal Tag %u\n", 704c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 705e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "Normal" : "Discovery", se_tpg->se_tpg_tfo->get_fabric_name(), 706e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg), 707e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg)); 708c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 709e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 710e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_del(&se_tpg->se_tpg_node); 711e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 712c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 713c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0) 714c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 715e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger /* 716e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * Release any remaining demo-mode generated se_node_acl that have 717e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * not been released because of TFO->tpg_check_demo_mode_cache() == 1 718e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * in transport_deregister_session(). 719e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger */ 720e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger spin_lock_bh(&se_tpg->acl_node_lock); 721e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_for_each_entry_safe(nacl, nacl_tmp, &se_tpg->acl_node_list, 722e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger acl_list) { 723e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_del(&nacl->acl_list); 724e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger se_tpg->num_node_acls--; 725e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger spin_unlock_bh(&se_tpg->acl_node_lock); 726e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 727e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_tpg_wait_for_nacl_pr_ref(nacl); 728e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_free_device_list_for_node(nacl, se_tpg); 729e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_release_fabric_acl(se_tpg, nacl); 730e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 731e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger spin_lock_bh(&se_tpg->acl_node_lock); 732e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger } 733e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger spin_unlock_bh(&se_tpg->acl_node_lock); 734c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 735c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) 736c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_release_virtual_lun0(se_tpg); 737c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 738c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = NULL; 739c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kfree(se_tpg->tpg_lun_list); 740c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 741c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 742c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_deregister); 743c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 744c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_lun *core_tpg_pre_addlun( 745c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 746c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 unpacked_lun) 747c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 748c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 749c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 750c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (unpacked_lun > (TRANSPORT_MAX_LUNS_PER_TPG-1)) { 7516708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s LUN: %u exceeds TRANSPORT_MAX_LUNS_PER_TPG" 752c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "-1: %u for Target Portal Group: %u\n", 753e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 754c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unpacked_lun, TRANSPORT_MAX_LUNS_PER_TPG-1, 755e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 756c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EOVERFLOW); 757c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 758c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 759c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 760c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = &tpg->tpg_lun_list[unpacked_lun]; 761c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status == TRANSPORT_LUN_STATUS_ACTIVE) { 7626708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("TPG Logical Unit Number: %u is already active" 763c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " on %s Target Portal Group: %u, ignoring request.\n", 764e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover unpacked_lun, tpg->se_tpg_tfo->get_fabric_name(), 765e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 766c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 767c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 768c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 769c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 770c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 771c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return lun; 772c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 773c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 774c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_post_addlun( 775c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 776c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun, 777c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access, 778c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *lun_ptr) 779c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 780e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int ret; 781e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 782e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover ret = core_dev_export(lun_ptr, tpg, lun); 783e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (ret < 0) 784e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return ret; 785c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 786c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 787c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_access = lun_access; 788c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE; 789c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 790c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 791c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 792c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 793c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 794c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_tpg_shutdown_lun( 795c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 796c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun) 797c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 798c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_clear_lun_from_tpg(lun, tpg); 799c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_clear_lun_from_sessions(lun); 800c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 801c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 802c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_lun *core_tpg_pre_dellun( 803c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 804c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 unpacked_lun, 805c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int *ret) 806c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 807c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 808c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 809c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (unpacked_lun > (TRANSPORT_MAX_LUNS_PER_TPG-1)) { 8106708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s LUN: %u exceeds TRANSPORT_MAX_LUNS_PER_TPG" 811c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "-1: %u for Target Portal Group: %u\n", 812e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), unpacked_lun, 813c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_MAX_LUNS_PER_TPG-1, 814e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 815c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EOVERFLOW); 816c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 817c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 818c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 819c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = &tpg->tpg_lun_list[unpacked_lun]; 820c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) { 8216708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s Logical Unit Number: %u is not active on" 822c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Target Portal Group: %u, ignoring request.\n", 823e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), unpacked_lun, 824e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 825c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 826c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENODEV); 827c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 828c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 829c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 830c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return lun; 831c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 832c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 833c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_post_dellun( 834c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 835c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun) 836c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 837c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_shutdown_lun(tpg, lun); 838c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_dev_unexport(lun->lun_se_dev, tpg, lun); 840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 842c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 843c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 844c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 845c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 846c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 847