1c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/******************************************************************************* 2c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Filename: target_core_tpg.c 3c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 4c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This file contains generic Target Portal Group related functions. 5c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 64c76251e8e8f704ed7eace603a8041458a1ed16fNicholas Bellinger * (c) Copyright 2002-2013 Datera, Inc. 7c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 8c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Nicholas A. Bellinger <nab@kernel.org> 9c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 10c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This program is free software; you can redistribute it and/or modify 11c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * it under the terms of the GNU General Public License as published by 12c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the Free Software Foundation; either version 2 of the License, or 13c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * (at your option) any later version. 14c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 15c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This program is distributed in the hope that it will be useful, 16c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * but WITHOUT ANY WARRANTY; without even the implied warranty of 17c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * GNU General Public License for more details. 19c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 20c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * You should have received a copy of the GNU General Public License 21c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * along with this program; if not, write to the Free Software 22c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 24c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ******************************************************************************/ 25c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 26c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/net.h> 27c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/string.h> 28c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/timer.h> 29c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/slab.h> 30c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/spinlock.h> 31c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/in.h> 32c53181af838fb9d82eebbb62b7175b0466d5a7a0Paul Gortmaker#include <linux/export.h> 33c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/sock.h> 34c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/tcp.h> 35c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi.h> 36c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi_cmnd.h> 37c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 38c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_base.h> 39c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_backend.h> 40c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_fabric.h> 41c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 42e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig#include "target_core_internal.h" 43e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger#include "target_core_pr.h" 44e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 45e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverextern struct se_device *g_lun0_dev; 46e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 47e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic DEFINE_SPINLOCK(tpg_lock); 48e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic LIST_HEAD(tpg_list); 49c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 50c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_clear_initiator_node_from_tpg(): 51c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 52c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 53c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 54c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void core_clear_initiator_node_from_tpg( 55c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *nacl, 56c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 57c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 58c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 59c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 60c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 61c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 62c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 63c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 64f2083241f23722207676025abbb45a301d412e69Jörn Engel deve = nacl->device_list[i]; 65c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 66c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!(deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS)) 67c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 68c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 69c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!deve->se_lun) { 706708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s device entries device pointer is" 71c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " NULL, but Initiator has access.\n", 72e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name()); 73c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 74c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 75c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 76c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun = deve->se_lun; 77c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 78e80ac6c4cc073d54daef8ba4ced88347d130d314Andy Grover core_disable_device_list_for_node(lun, NULL, deve->mapped_lun, 79e80ac6c4cc073d54daef8ba4ced88347d130d314Andy Grover TRANSPORT_LUNFLAGS_NO_ACCESS, nacl, tpg); 80c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 81c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&nacl->device_list_lock); 82c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 83c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&nacl->device_list_lock); 84c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 85c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 86c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* __core_tpg_get_initiator_node_acl(): 87c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 88c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * spin_lock_bh(&tpg->acl_node_lock); must be held when calling 89c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 90c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *__core_tpg_get_initiator_node_acl( 91c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 92c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname) 93c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 94c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 95c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 96c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(acl, &tpg->acl_node_list, acl_list) { 976708bb27bb2703da238f21f516034263348af5beAndy Grover if (!strcmp(acl->initiatorname, initiatorname)) 98c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 99c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 100c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 101c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 102c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 103c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 104c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_get_initiator_node_acl(): 105c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 106c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 107c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 108c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_get_initiator_node_acl( 109c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 110c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 111c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 112c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 113c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 11428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 115fcf29481fb8e106daad6688f2e898226ee928992Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 11628638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 117c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 118fcf29481fb8e106daad6688f2e898226ee928992Nicholas Bellinger return acl; 119c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 120b3fde035714b83ef7ddbbd5a520a2150d990349bThomas GlanzmannEXPORT_SYMBOL(core_tpg_get_initiator_node_acl); 121c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 122c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_node_to_devs(): 123c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 124c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 125c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 126c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_add_node_to_devs( 127c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 128c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg) 129c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 130c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i = 0; 131c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = 0; 132c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 133c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_device *dev; 134c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 135c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 136c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 1374a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[i]; 138c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) 139c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 140c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 141c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 142c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 143c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev = lun->lun_se_dev; 144c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 145c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * By default in LIO-Target $FABRIC_MOD, 146c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo_mode_write_protect is ON, or READ_ONLY; 147c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1486708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode_write_protect(tpg)) { 14958d926187758f76647d68e2f51ce44e6ace81873Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 150c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } else { 151c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 152c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Allow only optical drives to issue R/W in default RO 153c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * demo mode. 154c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 155e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (dev->transport->get_device_type(dev) == TYPE_DISK) 156c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 157c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 158c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun_access = TRANSPORT_LUNFLAGS_READ_WRITE; 159c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 160c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1616708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]->TPG[%u]_LUN[%u] - Adding %s" 162c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " access for LUN in Demo Mode\n", 163e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 164e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), lun->unpacked_lun, 165c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun_access == TRANSPORT_LUNFLAGS_READ_WRITE) ? 166c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "READ-WRITE" : "READ-ONLY"); 167c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 168e80ac6c4cc073d54daef8ba4ced88347d130d314Andy Grover core_enable_device_list_for_node(lun, NULL, lun->unpacked_lun, 169e80ac6c4cc073d54daef8ba4ced88347d130d314Andy Grover lun_access, acl, tpg); 170e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger /* 171e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger * Check to see if there are any existing persistent reservation 172e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger * APTPL pre-registrations that need to be enabled for this dynamic 173e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger * LUN ACL now.. 174e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger */ 175e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger core_scsi3_check_aptpl_registration(dev, tpg, lun, acl, 176e24805637d2d270d7975502e9024d473de86afdbNicholas Bellinger lun->unpacked_lun); 177c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 178c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 179c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 180c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 181c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 182c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_set_queue_depth_for_node(): 183c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 184c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 185c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 186c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_set_queue_depth_for_node( 187c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 188c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl) 189c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 190c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!acl->queue_depth) { 1916708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Queue depth for %s Initiator Node: %s is 0," 192e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "defaulting to 1.\n", tpg->se_tpg_tfo->get_fabric_name(), 193c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->initiatorname); 194c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = 1; 195c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 196c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 197c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 198c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 199c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2004a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engelvoid array_free(void *array, int n) 2014a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel{ 2024a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel void **a = array; 2034a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel int i; 2044a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2054a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel for (i = 0; i < n; i++) 2064a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel kfree(a[i]); 2074a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel kfree(a); 2084a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel} 2094a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2104a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engelstatic void *array_zalloc(int n, size_t size, gfp_t flags) 2114a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel{ 2124a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel void **a; 2134a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel int i; 2144a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 2154a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel a = kzalloc(n * sizeof(void*), flags); 2164a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel if (!a) 2174a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return NULL; 2184a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel for (i = 0; i < n; i++) { 2194a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel a[i] = kzalloc(size, flags); 2204a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel if (!a[i]) { 2214a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel array_free(a, n); 2224a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return NULL; 2234a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel } 2244a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel } 2254a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel return a; 2264a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel} 2274a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel 228c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_create_device_list_for_node(): 229c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 230c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 231c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 232c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_create_device_list_for_node(struct se_node_acl *nacl) 233c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 234c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_dev_entry *deve; 235c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int i; 236c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 237f2083241f23722207676025abbb45a301d412e69Jörn Engel nacl->device_list = array_zalloc(TRANSPORT_MAX_LUNS_PER_TPG, 238f2083241f23722207676025abbb45a301d412e69Jörn Engel sizeof(struct se_dev_entry), GFP_KERNEL); 2396708bb27bb2703da238f21f516034263348af5beAndy Grover if (!nacl->device_list) { 2406708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate memory for" 241c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " struct se_node_acl->device_list\n"); 242e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return -ENOMEM; 243c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 244c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 245f2083241f23722207676025abbb45a301d412e69Jörn Engel deve = nacl->device_list[i]; 246c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 247c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->ua_count, 0); 248c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&deve->pr_ref_count, 0); 249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&deve->ua_lock); 250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->alua_port_list); 251c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&deve->ua_list); 252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 253c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 254c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 255c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 256c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 257c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_check_initiator_node_acl() 258c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 259c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 260c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 261c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_check_initiator_node_acl( 262c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 263c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname) 264c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 265c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 266c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 267c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = core_tpg_get_initiator_node_acl(tpg, initiatorname); 2686708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) 269c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 270c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2716708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->tpg_check_demo_mode(tpg)) 272c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 273c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 274e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl = tpg->se_tpg_tfo->tpg_alloc_fabric_acl(tpg); 2756708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) 276c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 277c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 278c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 279c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 280afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_init(&acl->acl_kref); 28101468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger init_completion(&acl->acl_free_comp); 282c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 283c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 284c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 285e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover acl->queue_depth = tpg->se_tpg_tfo->tpg_get_default_depth(tpg); 286c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 287c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 288c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 289c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 290c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 291e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 292c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 293c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 294e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 295c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 296c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 297c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 298c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 299c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 300e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 301c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return NULL; 302c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 303052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger /* 304052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger * Here we only create demo-mode MappedLUNs from the active 30535d1efe80500a55f9aa01b305a6714ec78c33764Masanari Iida * TPG LUNs if the fabric is not explicitly asking for 306052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger * tpg_check_demo_mode_login_only() == 1. 307052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger */ 308cdf88a2fe3825458c584cd751aa843ab3af6a42cAndy Grover if ((tpg->se_tpg_tfo->tpg_check_demo_mode_login_only == NULL) || 309cdf88a2fe3825458c584cd751aa843ab3af6a42cAndy Grover (tpg->se_tpg_tfo->tpg_check_demo_mode_login_only(tpg) != 1)) 310052605c6caa3e1edf8eee8fe5fe6d53f5721f39aNicholas Bellinger core_tpg_add_node_to_devs(acl, tpg); 311c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 31228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 313c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 314c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 31528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 316c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3176708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Added DYNAMIC ACL with TCQ Depth: %d for %s" 318e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 319e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 320e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 321c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 322c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 323c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 324c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_check_initiator_node_acl); 325c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 326c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_wait_for_nacl_pr_ref(struct se_node_acl *nacl) 327c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 328c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&nacl->acl_pr_ref_count) != 0) 329c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 330c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 331c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 332c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid core_tpg_clear_object_luns(struct se_portal_group *tpg) 333c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 334281689051a628e5341ce1efcfafde9d60f2f6fbbJörn Engel int i; 335c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 336c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 337c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 338c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 3394a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[i]; 340c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 341c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if ((lun->lun_status != TRANSPORT_LUN_STATUS_ACTIVE) || 342c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (lun->lun_se_dev == NULL)) 343c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 344c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 345c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 346cd9d7cbaec8b622eee4edcd8bf481c4047f74915Andy Grover core_dev_del_lun(tpg, lun); 347c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 348c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 349c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 350c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 351c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_clear_object_luns); 352c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 353c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_add_initiator_node_acl(): 354c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 355c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 356c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 357c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct se_node_acl *core_tpg_add_initiator_node_acl( 358c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 359c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl, 360c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger const char *initiatorname, 361c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth) 362c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 363c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl = NULL; 364c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 36528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 366c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 3676708bb27bb2703da238f21f516034263348af5beAndy Grover if (acl) { 368c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 369c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 3706708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%u] - Replacing dynamic ACL" 371e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " for %s\n", tpg->se_tpg_tfo->get_fabric_name(), 372e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), initiatorname); 37328638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 374c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 375c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Release the locally allocated struct se_node_acl 376c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * because * core_tpg_add_initiator_node_acl() returned 377c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * a pointer to an existing demo mode node ACL. 378c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 379c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_nacl) 380e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, 381c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl); 382c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger goto done; 383c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 384c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3856708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("ACL entry for %s Initiator" 386c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s already exists for TPG %u, ignoring" 387e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 388e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 38928638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 390c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EEXIST); 391c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 39228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 393c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3946708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_nacl) { 3956708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("struct se_node_acl pointer is NULL\n"); 396c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 397c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 398c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 399c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For v4.x logic the se_node_acl_s is hanging off a fabric 400c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * dependent structure allocated via 401c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * struct target_core_fabric_ops->fabric_make_nodeacl() 402c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 403c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = se_nacl; 404c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 405c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_list); 406c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&acl->acl_sess_list); 407afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_init(&acl->acl_kref); 40801468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger init_completion(&acl->acl_free_comp); 409c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->device_list_lock); 410c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&acl->nacl_sess_lock); 411c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&acl->acl_pr_ref_count, 0); 412c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 413c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger snprintf(acl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname); 414c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->se_tpg = tpg; 415c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->acl_index = scsi_get_new_index(SCSI_AUTH_INTR_INDEX); 416c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 417e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->set_default_node_attributes(acl); 418c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 419c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_create_device_list_for_node(acl) < 0) { 420e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 421c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENOMEM); 422c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 423c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 424c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 425c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 426e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_release_fabric_acl(tpg, acl); 427c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 428c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 429c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 43028638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 431c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&acl->acl_list, &tpg->acl_node_list); 432c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls++; 43328638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 434c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 435c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerdone: 4366708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Added ACL with TCQ Depth: %d for %s" 437e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 438e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 439e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 440c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 441c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return acl; 442c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 443c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_add_initiator_node_acl); 444c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 445c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_del_initiator_node_acl(): 446c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 447c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 448c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 449c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_del_initiator_node_acl( 450c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 451c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl, 452c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 453c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 454337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger LIST_HEAD(sess_list); 455c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *sess_tmp; 456140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger unsigned long flags; 457281689051a628e5341ce1efcfafde9d60f2f6fbbJörn Engel int rc; 458c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 45928638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 460c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 461c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 462c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 463c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_del(&acl->acl_list); 464c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tpg->num_node_acls--; 46528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 466c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 467337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger spin_lock_irqsave(&acl->nacl_sess_lock, flags); 468337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger acl->acl_stop = 1; 469337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger 470337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_for_each_entry_safe(sess, sess_tmp, &acl->acl_sess_list, 471337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger sess_acl_list) { 472337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger if (sess->sess_tearing_down != 0) 473c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 474c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 475337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_get_session(sess); 476337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_move(&sess->sess_acl_list, &sess_list); 477337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger } 478337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger spin_unlock_irqrestore(&acl->nacl_sess_lock, flags); 479337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger 480337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_for_each_entry_safe(sess, sess_tmp, &sess_list, sess_acl_list) { 481337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_del(&sess->sess_acl_list); 482c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 483337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger rc = tpg->se_tpg_tfo->shutdown_session(sess); 484337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_session(sess); 485337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger if (!rc) 486337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger continue; 487337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_session(sess); 488c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 489337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger target_put_nacl(acl); 490337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger /* 491337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger * Wait for last target_put_nacl() to complete in target_complete_nacl() 492337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger * for active fabric session transport_deregister_session() callbacks. 493337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger */ 494337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger wait_for_completion(&acl->acl_free_comp); 495c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 496c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_tpg_wait_for_nacl_pr_ref(acl); 497c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_clear_initiator_node_from_tpg(acl, tpg); 498c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_free_device_list_for_node(acl, tpg); 499c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 5006708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s_TPG[%hu] - Deleted ACL with TCQ Depth: %d for %s" 501e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " Initiator Node: %s\n", tpg->se_tpg_tfo->get_fabric_name(), 502e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg), acl->queue_depth, 503e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), acl->initiatorname); 504c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 505c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 506c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 507c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_del_initiator_node_acl); 508c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 509c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* core_tpg_set_initiator_node_queue_depth(): 510c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 511c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 512c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 513c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_set_initiator_node_queue_depth( 514c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 515c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *initiatorname, 516c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 queue_depth, 517c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int force) 518c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 519c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *sess, *init_sess = NULL; 520c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *acl; 521140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger unsigned long flags; 522c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int dynamic_acl = 0; 523c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 52428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 525c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname); 5266708bb27bb2703da238f21f516034263348af5beAndy Grover if (!acl) { 5276708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Access Control List entry for %s Initiator" 528c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node %s does not exists for TPG %hu, ignoring" 529e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " request.\n", tpg->se_tpg_tfo->get_fabric_name(), 530e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->tpg_get_tag(tpg)); 53128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 532c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENODEV; 533c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 534c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (acl->dynamic_node_acl) { 535c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 0; 536c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dynamic_acl = 1; 537c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 53828638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 539c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 540140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_lock_irqsave(&tpg->session_lock, flags); 541c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_for_each_entry(sess, &tpg->tpg_sess_list, sess_list) { 542c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (sess->se_node_acl != acl) 543c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 544c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 545c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!force) { 5466708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to change queue depth for %s" 547c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Initiator Node: %s while session is" 548c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " operational. To forcefully change the queue" 549c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " depth and force session reinstatement" 550c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " use the \"force=1\" parameter.\n", 551e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), initiatorname); 552140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 553c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 55428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 555c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 556c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 55728638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 558c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EEXIST; 559c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 560c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 561c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if the session needs to be closed by our context. 562c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 5636708bb27bb2703da238f21f516034263348af5beAndy Grover if (!tpg->se_tpg_tfo->shutdown_session(sess)) 564c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger continue; 565c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 566c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_sess = sess; 567c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 568c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 569c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 570c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 571c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * User has requested to change the queue depth for a Initiator Node. 572c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Change the value in the Node's struct se_node_acl, and call 573c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() to add the requested queue depth. 574c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 575e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * Finally call tpg->se_tpg_tfo->close_session() to force session 576c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * reinstatement to occur if there is an active session for the 577c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * $FABRIC_MOD Initiator Node in question. 578c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 579c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->queue_depth = queue_depth; 580c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 581c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_set_queue_depth_for_node(tpg, acl) < 0) { 582140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 583c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 584c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Force session reinstatement if 585c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * core_set_queue_depth_for_node() failed, because we assume 586c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the $FABRIC_MOD has already the set session reinstatement 587e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * bit from tpg->se_tpg_tfo->shutdown_session() called above. 588c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 589c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 590e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 591c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 59228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 593c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 594c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 59528638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 596c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -EINVAL; 597c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 598140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&tpg->session_lock, flags); 599c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 600c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the $FABRIC_MOD session for the Initiator Node ACL exists, 601c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * forcefully shutdown the $FABRIC_MOD session/nexus. 602c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 603c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (init_sess) 604e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->close_session(init_sess); 605c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 606bfb9035c98906aafcd3cf22694fba2550997bf53Joe Perches pr_debug("Successfully changed queue depth to: %d for Initiator" 607c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Node: %s on %s Target Portal Group: %u\n", queue_depth, 608e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover initiatorname, tpg->se_tpg_tfo->get_fabric_name(), 609e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 610c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 61128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&tpg->acl_node_lock); 612c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dynamic_acl) 613c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger acl->dynamic_node_acl = 1; 61428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&tpg->acl_node_lock); 615c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 616c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 617c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 618c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_set_initiator_node_queue_depth); 619c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 62079e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover/* core_tpg_set_initiator_node_tag(): 62179e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover * 62279e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover * Initiator nodeacl tags are not used internally, but may be used by 62379e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover * userspace to emulate aliases or groups. 62479e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover * Returns length of newly-set tag or -EINVAL. 62579e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover */ 62679e62fc3827bd437c304c1810f36896fc1e717b1Andy Groverint core_tpg_set_initiator_node_tag( 62779e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover struct se_portal_group *tpg, 62879e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover struct se_node_acl *acl, 62979e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover const char *new_tag) 63079e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover{ 63179e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover if (strlen(new_tag) >= MAX_ACL_TAG_SIZE) 63279e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover return -EINVAL; 63379e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover 63479e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover if (!strncmp("NULL", new_tag, 4)) { 63579e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover acl->acl_tag[0] = '\0'; 63679e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover return 0; 63779e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover } 63879e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover 63979e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover return snprintf(acl->acl_tag, MAX_ACL_TAG_SIZE, "%s", new_tag); 64079e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover} 64179e62fc3827bd437c304c1810f36896fc1e717b1Andy GroverEXPORT_SYMBOL(core_tpg_set_initiator_node_tag); 64279e62fc3827bd437c304c1810f36896fc1e717b1Andy Grover 6435277797dc4ed873d067477d84e910b39d113f649Nicholas Bellingerstatic void core_tpg_lun_ref_release(struct percpu_ref *ref) 6445277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger{ 6455277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger struct se_lun *lun = container_of(ref, struct se_lun, lun_ref); 6465277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger 6475277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger complete(&lun->lun_ref_comp); 6485277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger} 6495277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger 650c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg) 651c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 652c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* Set in core_dev_setup_virtual_lun0() */ 653e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover struct se_device *dev = g_lun0_dev; 654c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun = &se_tpg->tpg_virt_lun0; 655c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access = TRANSPORT_LUNFLAGS_READ_ONLY; 656c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret; 657c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 658c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = 0; 659c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 660c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 661c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 662c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 664c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 6655277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger init_completion(&lun->lun_ref_comp); 666c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 667d344f8a15637e8b57a0d05a6d50182c11de08606Andy Grover ret = core_tpg_add_lun(se_tpg, lun, lun_access, dev); 668de06875f089678f4f9f1e8d5e1421fb0ceab12d0Andy Grover if (ret < 0) 6695277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger return ret; 6705277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger 671c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 672c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 673c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 674c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_register( 675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct target_core_fabric_ops *tfo, 676c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_wwn *se_wwn, 677c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg, 678c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *tpg_fabric_ptr, 679c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int se_tpg_type) 680c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 681c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 682c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 i; 683c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6844a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel se_tpg->tpg_lun_list = array_zalloc(TRANSPORT_MAX_LUNS_PER_TPG, 6854a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel sizeof(struct se_lun), GFP_KERNEL); 6866708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_tpg->tpg_lun_list) { 6876708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate struct se_portal_group->" 688c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "tpg_lun_list\n"); 689c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 690c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 691c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 692c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { 6934a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = se_tpg->tpg_lun_list[i]; 694c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->unpacked_lun = i; 6950ff8754981261a80f4b77db2536dfea92c2d4539Nicholas Bellinger lun->lun_link_magic = SE_LUN_LINK_MAGIC; 696c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 697c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&lun->lun_acl_count, 0); 698c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger init_completion(&lun->lun_shutdown_comp); 699c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&lun->lun_acl_list); 700c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_acl_lock); 701c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&lun->lun_sep_lock); 7025277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger init_completion(&lun->lun_ref_comp); 703c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 704c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 705c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_type = se_tpg_type; 706c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = tpg_fabric_ptr; 707c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_tfo = tfo; 708c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_wwn = se_wwn; 709c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger atomic_set(&se_tpg->tpg_pr_ref_count, 0); 710c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->acl_node_list); 711e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover INIT_LIST_HEAD(&se_tpg->se_tpg_node); 712c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_tpg->tpg_sess_list); 713c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->acl_node_lock); 714c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->session_lock); 715c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_init(&se_tpg->tpg_lun_lock); 716c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 717c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) { 718c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (core_tpg_setup_virtual_lun0(se_tpg) < 0) { 7190fb889b83186e54c0cfa79516599f2267fb553fbWei Yongjun array_free(se_tpg->tpg_lun_list, 7200fb889b83186e54c0cfa79516599f2267fb553fbWei Yongjun TRANSPORT_MAX_LUNS_PER_TPG); 721c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return -ENOMEM; 722c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 723c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 724c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 725e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 726e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_add_tail(&se_tpg->se_tpg_node, &tpg_list); 727e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 728c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 7296708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Allocated %s struct se_portal_group for" 730c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " endpoint: %s, Portal Tag: %u\n", tfo->get_fabric_name(), 731c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 732c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "Normal" : "Discovery", (tfo->tpg_get_wwn(se_tpg) == NULL) ? 733c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "None" : tfo->tpg_get_wwn(se_tpg), tfo->tpg_get_tag(se_tpg)); 734c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 735c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 736c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 737c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_register); 738c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 739c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint core_tpg_deregister(struct se_portal_group *se_tpg) 740c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 741e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger struct se_node_acl *nacl, *nacl_tmp; 742e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 7436708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Deallocating %s struct se_portal_group" 744c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " for endpoint: %s Portal Tag %u\n", 745c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) ? 746e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover "Normal" : "Discovery", se_tpg->se_tpg_tfo->get_fabric_name(), 747e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg), 748e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg)); 749c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 750e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock_bh(&tpg_lock); 751e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover list_del(&se_tpg->se_tpg_node); 752e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock_bh(&tpg_lock); 753c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 754c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (atomic_read(&se_tpg->tpg_pr_ref_count) != 0) 755c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cpu_relax(); 756e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger /* 757e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * Release any remaining demo-mode generated se_node_acl that have 758e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * not been released because of TFO->tpg_check_demo_mode_cache() == 1 759e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * in transport_deregister_session(). 760e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger */ 76128638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&se_tpg->acl_node_lock); 762e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_for_each_entry_safe(nacl, nacl_tmp, &se_tpg->acl_node_list, 763e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger acl_list) { 764e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger list_del(&nacl->acl_list); 765e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger se_tpg->num_node_acls--; 76628638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&se_tpg->acl_node_lock); 767e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 768e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_tpg_wait_for_nacl_pr_ref(nacl); 769e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger core_free_device_list_for_node(nacl, se_tpg); 770e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->tpg_release_fabric_acl(se_tpg, nacl); 771e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 77228638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_lock_irq(&se_tpg->acl_node_lock); 773e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger } 77428638887f351d11867562322b7abaa014dd5528aRoland Dreier spin_unlock_irq(&se_tpg->acl_node_lock); 775c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 776c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_tpg->se_tpg_type == TRANSPORT_TPG_TYPE_NORMAL) 7779c7d6154bc4b9dfefd580490cdca5f7c72321464Andy Grover core_tpg_remove_lun(se_tpg, &se_tpg->tpg_virt_lun0); 778c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 779c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_tpg->se_tpg_fabric_ptr = NULL; 7804a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel array_free(se_tpg->tpg_lun_list, TRANSPORT_MAX_LUNS_PER_TPG); 781c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 782c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 783c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(core_tpg_deregister); 784c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 785d344f8a15637e8b57a0d05a6d50182c11de08606Andy Groverstruct se_lun *core_tpg_alloc_lun( 786c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 787c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 unpacked_lun) 788c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 789c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun; 790c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 791c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (unpacked_lun > (TRANSPORT_MAX_LUNS_PER_TPG-1)) { 7926708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("%s LUN: %u exceeds TRANSPORT_MAX_LUNS_PER_TPG" 793c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "-1: %u for Target Portal Group: %u\n", 794e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->get_fabric_name(), 795c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unpacked_lun, TRANSPORT_MAX_LUNS_PER_TPG-1, 796e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 797c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EOVERFLOW); 798c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 799c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 800c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 8014a5a75f32dcbcd0b2685f74fd4ede26edf8765a9Jörn Engel lun = tpg->tpg_lun_list[unpacked_lun]; 802c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (lun->lun_status == TRANSPORT_LUN_STATUS_ACTIVE) { 8036708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("TPG Logical Unit Number: %u is already active" 804c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " on %s Target Portal Group: %u, ignoring request.\n", 805e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover unpacked_lun, tpg->se_tpg_tfo->get_fabric_name(), 806e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover tpg->se_tpg_tfo->tpg_get_tag(tpg)); 807c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 808c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-EINVAL); 809c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 810c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 811c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 812c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return lun; 813c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 814c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 815d344f8a15637e8b57a0d05a6d50182c11de08606Andy Groverint core_tpg_add_lun( 816c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 817c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun, 818c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 lun_access, 819340dbf729c3395cf1317890d033aa9ac7347766cAndy Grover struct se_device *dev) 820c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 821e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int ret; 822e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover 8232aad2a86f6685c10360ec8a5a55eb9ab7059cb72Tejun Heo ret = percpu_ref_init(&lun->lun_ref, core_tpg_lun_ref_release, 0, 824a34375ef9e65340a138fc0be287de5c940d260fcTejun Heo GFP_KERNEL); 825e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (ret < 0) 826e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return ret; 827c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 828340dbf729c3395cf1317890d033aa9ac7347766cAndy Grover ret = core_dev_export(dev, tpg, lun); 8295277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger if (ret < 0) { 8309a1049da9bd2cd83fe11d46433e603c193aa9c71Tejun Heo percpu_ref_exit(&lun->lun_ref); 8315277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger return ret; 8325277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger } 8335277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger 834c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 835c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_access = lun_access; 836c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_ACTIVE; 837c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 838c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 842cd9d7cbaec8b622eee4edcd8bf481c4047f74915Andy Grovervoid core_tpg_remove_lun( 843c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *tpg, 844c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_lun *lun) 845c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 8464a9a6c8d538eff6d627fa14409c7c25aff652541Nicholas Bellinger core_clear_lun_from_tpg(lun, tpg); 8474a9a6c8d538eff6d627fa14409c7c25aff652541Nicholas Bellinger transport_clear_lun_ref(lun); 848c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 849c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_dev_unexport(lun->lun_se_dev, tpg, lun); 850c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 851c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&tpg->tpg_lun_lock); 852c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger lun->lun_status = TRANSPORT_LUN_STATUS_FREE; 853c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&tpg->tpg_lun_lock); 854c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 8559a1049da9bd2cd83fe11d46433e603c193aa9c71Tejun Heo percpu_ref_exit(&lun->lun_ref); 856c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 857