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> 35c53181af838fb9d82eebbb62b7175b0466d5a7a0Paul Gortmaker#include <linux/export.h> 36c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/sock.h> 37c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/tcp.h> 38c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi.h> 39c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi_cmnd.h> 40c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 41c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_base.h> 42c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_backend.h> 43c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_fabric.h> 44c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 45e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig#include "target_core_internal.h" 46e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 47e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverextern struct se_device *g_lun0_dev; 48e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 49e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic DEFINE_SPINLOCK(tpg_lock); 50e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic LIST_HEAD(tpg_list); 51c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 52c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_clear_initiator_node_from_tpg(): 53c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 54c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 55c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 56c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_clear_initiator_node_from_tpg( 57c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *nacl, 58c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 59c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 60c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 61c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 62c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 63c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 64c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 65c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 66f2083241f23722207676025abbb45a301d412e69Jörn Engel deve = nacl->device_list[i]; 67c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 68c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!(deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS)) 69c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 70c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 71c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!deve->se_lun) { 726708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s device entries device pointer is" 73c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " NULL, but Initiator has access.\n", 74e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name()); 75c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 76c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 77c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 78c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = deve->se_lun; 79c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 80c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_update_device_list_for_node(lun, NULL, deve->mapped_lun, 81c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg, 0); 82c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 83c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 84c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 85c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 86c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 87c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 88c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* __core_tpg_get_initiator_node_acl(): 89c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 90c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * spin_lock_bh(&tpg->acl_node_lock); must be held when calling 91c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 92c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *__core_tpg_get_initiator_node_acl( 93c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 94c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname) 95c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 96c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 97c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 98c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(acl, &tpg->acl_node_list, acl_list) { 996708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, initiatorname)) 100c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 101c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 102c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 103c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 104c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 105c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 106c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_get_initiator_node_acl(): 107c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 108c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 109c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 110c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_get_initiator_node_acl( 111c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 112c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 113c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 114c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 115c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 11628638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 117c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(acl, &tpg->acl_node_list, acl_list) { 1186708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, initiatorname) && 1196708bb27bb2703da238f21f516034263348af5beAndy Grover !acl->dynamic_node_acl) { 12028638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 121c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 122c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 123c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 12428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 125c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 126c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 127c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 128c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 129c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_node_to_devs(): 130c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 131c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 132c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 133c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_add_node_to_devs( 134c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 135c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 136c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 137c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i = 0; 138c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = 0; 139c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 140c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_device *dev; 141c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 142c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 143c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 1444a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[i]; 145c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) 146c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 147c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 148c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 149c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 150c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev = lun->lun_se_dev; 151c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 152c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * By default in LIO-Target $FABRIC_MOD, 153c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo_mode_write_protect is ON, or READ_ONLY; 154c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1556708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode_write_protect(tpg)) { 156c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dev->dev_flags & DF_READ_ONLY) 157c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 158c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 159c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 160c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } else { 161c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 162c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Allow only optical drives to issue R/W in default RO 163c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo mode. 164c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 165e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (dev->transport->get_device_type(dev) == TYPE_DISK) 166c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 167c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 168c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 169c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 170c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1716708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]->TPG[%u]_LUN[%u] - Adding %s" 172c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " access for LUN in Demo Mode\n", 173e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 174e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), lun->unpacked_lun, 175c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun_access == TRANSPORT_LUNFLAGS_READ_WRITE) ? 176c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "READ-WRITE" : "READ-ONLY"); 177c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 178c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_update_device_list_for_node(lun, NULL, lun->unpacked_lun, 179c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access, acl, tpg, 1); 180c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 181c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 182c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 183c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 184c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 185c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_set_queue_depth_for_node(): 186c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 187c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 188c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 189c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_set_queue_depth_for_node( 190c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 191c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl) 192c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 193c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!acl->queue_depth) { 1946708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Queue depth for %s Initiator Node: %s is 0," 195e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "defaulting to 1.\n", tpg->se_tpg_tfo->get_fabric_name(), 196c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->initiatorname); 197c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = 1; 198c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 199c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 200c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 201c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 202c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2034a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engelvoid array_free(void *array, int n) 2044a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel{ 2054a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel void **a = array; 2064a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel int i; 2074a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2084a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel for (i = 0; i < n; i++) 2094a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel kfree(a[i]); 2104a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel kfree(a); 2114a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel} 2124a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2134a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engelstatic void *array_zalloc(int n, size_t size, gfp_t flags) 2144a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel{ 2154a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel void **a; 2164a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel int i; 2174a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2184a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel a = kzalloc(n * sizeof(void*), flags); 2194a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel if (!a) 2204a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return NULL; 2214a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel for (i = 0; i < n; i++) { 2224a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel a[i] = kzalloc(size, flags); 2234a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel if (!a[i]) { 2244a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel array_free(a, n); 2254a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return NULL; 2264a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel } 2274a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel } 2284a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return a; 2294a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel} 2304a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 231c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_create_device_list_for_node(): 232c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 233c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 234c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 235c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_create_device_list_for_node(struct se_node_acl *nacl) 236c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 237c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 238c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 239c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 240f2083241f23722207676025abbb45a301d412e69Jörn Engel nacl->device_list = array_zalloc(TRANSPORT_MAX_LUNS_PER_TPG, 241f2083241f23722207676025abbb45a301d412e69Jörn Engel sizeof(struct se_dev_entry), GFP_KERNEL); 2426708bb27bb2703da238f21f516034263348af5beAndy Grover if (!nacl->device_list) { 2436708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate memory for" 244c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " struct se_node_acl->device_list\n"); 245e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return -ENOMEM; 246c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 247c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 248f2083241f23722207676025abbb45a301d412e69Jörn Engel deve = nacl->device_list[i]; 249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->ua_count, 0); 251c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->pr_ref_count, 0); 252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&deve->ua_lock); 253c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->alua_port_list); 254c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->ua_list); 255c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 256c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 257c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 258c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 259c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 260c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_check_initiator_node_acl() 261c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 262c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 263c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 264c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_check_initiator_node_acl( 265c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 266c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 267c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 268c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 269c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 270c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = core_tpg_get_initiator_node_acl(tpg, initiatorname); 2716708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) 272c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 273c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2746708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode(tpg)) 275c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 276c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 277e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl = tpg->se_tpg_tfo->tpg_alloc_fabric_acl(tpg); 2786708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) 279c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 280c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 281c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 282c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 283afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_init(&acl->acl_kref); 28401468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger init_completion(&acl->acl_free_comp); 285c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 286c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 287c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 288e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl->queue_depth = tpg->se_tpg_tfo->tpg_get_default_depth(tpg); 289c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 290c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 291c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 292c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->stats_lock); 293c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 294c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 295e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 296c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 297c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 298e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 299c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 300c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 301c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 302c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 303c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 304e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 305c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 306c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 307052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger /* 308052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger * Here we only create demo-mode MappedLUNs from the active 309052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger * TPG LUNs if the fabric is not explictly asking for 310052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger * tpg_check_demo_mode_login_only() == 1. 311052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger */ 312052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger if ((tpg->se_tpg_tfo->tpg_check_demo_mode_login_only != NULL) && 313052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger (tpg->se_tpg_tfo->tpg_check_demo_mode_login_only(tpg) == 1)) 314052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger do { ; } while (0); 315052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger else 316052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger core_tpg_add_node_to_devs(acl, tpg); 317c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 31828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 319c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 320c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 32128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 322c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3236708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Added DYNAMIC ACL with TCQ Depth: %d for %s" 324e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 325e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 326e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 327c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 328c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 329c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 330c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_check_initiator_node_acl); 331c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 332c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *nacl) 333c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 334c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&nacl->acl_pr_ref_count) != 0) 335c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 336c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 337c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 338c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_clear_object_luns(struct se_portal_group *tpg) 339c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 340281689051a628e5341ce1efcfafde9d60f2f6fbbJörn Engel int i; 341c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 342c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 343c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 344c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 3454a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[i]; 346c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 347c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if ((lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) || 348c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun->lun_se_dev == NULL)) 349c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 350c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 351c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 352281689051a628e5341ce1efcfafde9d60f2f6fbbJörn Engel core_dev_del_lun(tpg, lun->unpacked_lun); 353c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 354c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 355c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 356c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 357c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_clear_object_luns); 358c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 359c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_initiator_node_acl(): 360c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 361c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 362c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 363c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_add_initiator_node_acl( 364c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 365c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl, 366c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname, 367c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth) 368c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 369c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl = NULL; 370c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 37128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 372c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 3736708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) { 374c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 375c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 3766708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Replacing dynamic ACL" 377e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " for %s\n", tpg->se_tpg_tfo->get_fabric_name(), 378e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), initiatorname); 37928638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 380c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 381c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Release the locally allocated struct se_node_acl 382c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * because * core_tpg_add_initiator_node_acl() returned 383c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * a pointer to an existing demo mode node ACL. 384c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 385c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_nacl) 386e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, 387c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl); 388c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger goto done; 389c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 390c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3916708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("ACL entry for %s Initiator" 392c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s already exists for TPG %u, ignoring" 393e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 394e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 39528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 396c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EEXIST); 397c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 39828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 399c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 4006708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_nacl) { 4016708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("struct se_node_acl pointer is NULL\n"); 402c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 403c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 404c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 405c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For v4.x logic the se_node_acl_s is hanging off a fabric 406c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * dependent structure allocated via 407c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * struct target_core_fabric_ops->fabric_make_nodeacl() 408c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 409c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = se_nacl; 410c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 411c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 412c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 413afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_init(&acl->acl_kref); 41401468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger init_completion(&acl->acl_free_comp); 415c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 416c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 417c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 418c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 419c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 420c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 421c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 422c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->stats_lock); 423c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 424e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 425c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 426c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 427e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 428c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENOMEM); 429c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 430c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 431c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 432c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 433e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 434c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 435c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 436c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 43728638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 438c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 439c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 44028638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 441c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 442c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerdone: 4436708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Added ACL with TCQ Depth: %d for %s" 444e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 445e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 446e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 447c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 448c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 449c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 450c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_add_initiator_node_acl); 451c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 452c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_del_initiator_node_acl(): 453c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 454c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 455c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 456c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_del_initiator_node_acl( 457c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 458c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 459c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 460c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 461337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger LIST_HEAD(sess_list); 462c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *sess_tmp; 463140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger unsigned long flags; 464281689051a628e5341ce1efcfafde9d60f2f6fbbJörn Engel int rc; 465c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 46628638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 467c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 468c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 469c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 470c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_del(&acl->acl_list); 471c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls--; 47228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 473c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 474337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger spin_lock_irqsave(&acl->nacl_sess_lock, flags); 475337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger acl->acl_stop = 1; 476337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger 477337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_for_each_entry_safe(sess, sess_tmp, &acl->acl_sess_list, 478337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger sess_acl_list) { 479337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger if (sess->sess_tearing_down != 0) 480c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 481c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 482337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_get_session(sess); 483337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_move(&sess->sess_acl_list, &sess_list); 484337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger } 485337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger spin_unlock_irqrestore(&acl->nacl_sess_lock, flags); 486337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger 487337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_for_each_entry_safe(sess, sess_tmp, &sess_list, sess_acl_list) { 488337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_del(&sess->sess_acl_list); 489c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 490337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger rc = tpg->se_tpg_tfo->shutdown_session(sess); 491337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_session(sess); 492337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger if (!rc) 493337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger continue; 494337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_session(sess); 495c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 496337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_nacl(acl); 497337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger /* 498337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger * Wait for last target_put_nacl() to complete in target_complete_nacl() 499337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger * for active fabric session transport_deregister_session() callbacks. 500337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger */ 501337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger wait_for_completion(&acl->acl_free_comp); 502c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 503c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_wait_for_nacl_pr_ref(acl); 504c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_clear_initiator_node_from_tpg(acl, tpg); 505c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 506c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 5076708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Deleted ACL with TCQ Depth: %d for %s" 508e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 509e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 510e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), acl->initiatorname); 511c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 512c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 513c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 514c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_del_initiator_node_acl); 515c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 516c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_set_initiator_node_queue_depth(): 517c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 518c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 519c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 520c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_set_initiator_node_queue_depth( 521c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 522c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname, 523c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth, 524c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 525c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 526c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *init_sess = NULL; 527c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 528140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger unsigned long flags; 529c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int dynamic_acl = 0; 530c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 53128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 532c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 5336708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) { 5346708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Access Control List entry for %s Initiator" 535c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s does not exists for TPG %hu, ignoring" 536e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 537e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 53828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 539c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENODEV; 540c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 541c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 542c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 543c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dynamic_acl = 1; 544c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 54528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 546c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 547140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_lock_irqsave(&tpg->session_lock, flags); 548c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(sess, &tpg->tpg_sess_list, sess_list) { 549c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (sess->se_node_acl != acl) 550c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 551c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 552c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!force) { 5536708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to change queue depth for %s" 554c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Initiator Node: %s while session is" 555c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " operational. To forcefully change the queue" 556c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " depth and force session reinstatement" 557c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " use the \"force=1\" parameter.\n", 558e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 559140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 560c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 56128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 562c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 563c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 56428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 565c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EEXIST; 566c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 567c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 568c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if the session needs to be closed by our context. 569c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 5706708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->shutdown_session(sess)) 571c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 572c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 573c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_sess = sess; 574c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 575c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 576c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 577c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 578c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * User has requested to change the queue depth for a Initiator Node. 579c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Change the value in the Node's struct se_node_acl, and call 580c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() to add the requested queue depth. 581c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 582e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * Finally call tpg->se_tpg_tfo->close_session() to force session 583c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * reinstatement to occur if there is an active session for the 584c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * $FABRIC_MOD Initiator Node in question. 585c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 586c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 587c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 588c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 589140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 590c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 591c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Force session reinstatement if 592c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() failed, because we assume 593c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the $FABRIC_MOD has already the set session reinstatement 594e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * bit from tpg->se_tpg_tfo->shutdown_session() called above. 595c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 596c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 597e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 598c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 59928638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 600c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 601c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 60228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 603c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EINVAL; 604c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 605140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 606c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 607c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the $FABRIC_MOD session for the Initiator Node ACL exists, 608c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * forcefully shutdown the $FABRIC_MOD session/nexus. 609c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 610c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 611e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 612c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 613bfb9035c98906aafcd3cf22694fba2550997bf53Joe Perches pr_debug("Successfully changed queue depth to: %d for Initiator" 614c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node: %s on %s Target Portal Group: %u\n", queue_depth, 615e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->get_fabric_name(), 616e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 617c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 61828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 619c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 620c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 62128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 622c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 623c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 624c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 625c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_set_initiator_node_queue_depth); 626c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 627c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg) 628c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 629c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* Set in core_dev_setup_virtual_lun0() */ 630e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover struct se_device *dev = g_lun0_dev; 631c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun = &se_tpg->tpg_virt_lun0; 632c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 633c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret; 634c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 635c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = 0; 636c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 637c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 638c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 639c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 640c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_cmd_list); 641c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 642c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_cmd_lock); 643c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 644c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 645c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = core_tpg_post_addlun(se_tpg, lun, lun_access, dev); 646c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret < 0) 647e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return ret; 648c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 649c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 650c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 651c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 652c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_tpg_release_virtual_lun0(struct se_portal_group *se_tpg) 653c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 654c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun = &se_tpg->tpg_virt_lun0; 655c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 656c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_post_dellun(se_tpg, lun); 657c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 658c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 659c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_register( 660c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct target_core_fabric_ops *tfo, 661c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_wwn *se_wwn, 662c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg, 663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *tpg_fabric_ptr, 664c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int se_tpg_type) 665c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 666c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 667c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 i; 668c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6694a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel se_tpg->tpg_lun_list = array_zalloc(TRANSPORT_MAX_LUNS_PER_TPG, 6704a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel sizeof(struct se_lun), GFP_KERNEL); 6716708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_tpg->tpg_lun_list) { 6726708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate struct se_portal_group->" 673c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "tpg_lun_list\n"); 674c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 676c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 677c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 6784a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = se_tpg->tpg_lun_list[i]; 679c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = i; 680c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 681c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 682c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 683c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 684c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_cmd_list); 685c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 686c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_cmd_lock); 687c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 688c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 689c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 690c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_type = se_tpg_type; 691c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = tpg_fabric_ptr; 692c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_tfo = tfo; 693c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_wwn = se_wwn; 694c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&se_tpg->tpg_pr_ref_count, 0); 695c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->acl_node_list); 696e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover INIT_LIST_HEAD(&se_tpg->se_tpg_node); 697c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->tpg_sess_list); 698c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->acl_node_lock); 699c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->session_lock); 700c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->tpg_lun_lock); 701c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 702c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) { 703c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_tpg_setup_virtual_lun0(se_tpg) < 0) { 704c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kfree(se_tpg); 705c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 706c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 707c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 708c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 709e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 710e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_add_tail(&se_tpg->se_tpg_node, &tpg_list); 711e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 712c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 7136708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Allocated %s struct se_portal_group for" 714c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " endpoint: %s, Portal Tag: %u\n", tfo->get_fabric_name(), 715c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 716c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "Normal" : "Discovery", (tfo->tpg_get_wwn(se_tpg) == NULL) ? 717c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "None" : tfo->tpg_get_wwn(se_tpg), tfo->tpg_get_tag(se_tpg)); 718c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 719c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 720c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 721c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_register); 722c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 723c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_deregister(struct se_portal_group *se_tpg) 724c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 725e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger struct se_node_acl *nacl, *nacl_tmp; 726e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 7276708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Deallocating %s struct se_portal_group" 728c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " for endpoint: %s Portal Tag %u\n", 729c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 730e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "Normal" : "Discovery", se_tpg->se_tpg_tfo->get_fabric_name(), 731e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg), 732e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg)); 733c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 734e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 735e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_del(&se_tpg->se_tpg_node); 736e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 737c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 738c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0) 739c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 740e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger /* 741e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * Release any remaining demo-mode generated se_node_acl that have 742e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * not been released because of TFO->tpg_check_demo_mode_cache() == 1 743e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * in transport_deregister_session(). 744e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger */ 74528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&se_tpg->acl_node_lock); 746e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_for_each_entry_safe(nacl, nacl_tmp, &se_tpg->acl_node_list, 747e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger acl_list) { 748e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_del(&nacl->acl_list); 749e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger se_tpg->num_node_acls--; 75028638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&se_tpg->acl_node_lock); 751e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 752e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_tpg_wait_for_nacl_pr_ref(nacl); 753e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_free_device_list_for_node(nacl, se_tpg); 754e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_release_fabric_acl(se_tpg, nacl); 755e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 75628638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&se_tpg->acl_node_lock); 757e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger } 75828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&se_tpg->acl_node_lock); 759c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 760c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) 761c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_release_virtual_lun0(se_tpg); 762c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 763c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = NULL; 7644a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel array_free(se_tpg->tpg_lun_list, TRANSPORT_MAX_LUNS_PER_TPG); 765c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 766c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 767c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_deregister); 768c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 769c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_lun *core_tpg_pre_addlun( 770c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 771c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 unpacked_lun) 772c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 773c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 774c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 775c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (unpacked_lun > (TRANSPORT_MAX_LUNS_PER_TPG-1)) { 7766708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s LUN: %u exceeds TRANSPORT_MAX_LUNS_PER_TPG" 777c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "-1: %u for Target Portal Group: %u\n", 778e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 779c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unpacked_lun, TRANSPORT_MAX_LUNS_PER_TPG-1, 780e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 781c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EOVERFLOW); 782c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 783c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 784c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 7854a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[unpacked_lun]; 786c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status == TRANSPORT_LUN_STATUS_ACTIVE) { 7876708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("TPG Logical Unit Number: %u is already active" 788c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " on %s Target Portal Group: %u, ignoring request.\n", 789e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover unpacked_lun, tpg->se_tpg_tfo->get_fabric_name(), 790e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 791c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 792c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 793c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 794c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 795c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 796c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return lun; 797c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 798c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 799c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_post_addlun( 800c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 801c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun, 802c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access, 803c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *lun_ptr) 804c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 805e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int ret; 806e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 807e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover ret = core_dev_export(lun_ptr, tpg, lun); 808e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (ret < 0) 809e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return ret; 810c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 811c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 812c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_access = lun_access; 813c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE; 814c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 815c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 816c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 817c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 818c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 819c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_tpg_shutdown_lun( 820c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 821c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun) 822c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 823c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_clear_lun_from_tpg(lun, tpg); 824c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_clear_lun_from_sessions(lun); 825c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 826c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 827c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_lun *core_tpg_pre_dellun( 828c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 8298d9efe539cf78f6a90947d47100e4a86d907750fSebastian Andrzej Siewior u32 unpacked_lun) 830c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 831c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 832c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 833c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (unpacked_lun > (TRANSPORT_MAX_LUNS_PER_TPG-1)) { 8346708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s LUN: %u exceeds TRANSPORT_MAX_LUNS_PER_TPG" 835c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "-1: %u for Target Portal Group: %u\n", 836e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), unpacked_lun, 837c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TRANSPORT_MAX_LUNS_PER_TPG-1, 838e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EOVERFLOW); 840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 842c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 8434a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[unpacked_lun]; 844c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) { 8456708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s Logical Unit Number: %u is not active on" 846c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Target Portal Group: %u, ignoring request.\n", 847e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), unpacked_lun, 848e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 849c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 850c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENODEV); 851c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 852c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 853c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 854c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return lun; 855c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 856c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 857c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_post_dellun( 858c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 859c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun) 860c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 861c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_shutdown_lun(tpg, lun); 862c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 863c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_dev_unexport(lun->lun_se_dev, tpg, lun); 864c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 865c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 866c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 867c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 868c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 869c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 870c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 871