1c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/******************************************************************************* 2c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Filename: target_core_transport.c 3c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 4c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This file contains the Generic Target Engine Core. 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/delay.h> 28c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/string.h> 29c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/timer.h> 30c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/slab.h> 31c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/spinlock.h> 32c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/kthread.h> 33c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/in.h> 34c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <linux/cdrom.h> 35827509e38e5a4a5ba65a745ec7b4b0278656d1caPaul Gortmaker#include <linux/module.h> 36015487b89f27d91d95a056cdc3c85e6c729bff12Roland Dreier#include <linux/ratelimit.h> 37c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <asm/unaligned.h> 38c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/sock.h> 39c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <net/tcp.h> 40c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi.h> 41c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <scsi/scsi_cmnd.h> 42e66ecd505addaaf40e7d352796ba8d344f6359ddNicholas Bellinger#include <scsi/scsi_tcq.h> 43c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 44c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_base.h> 45c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_backend.h> 46c4795fb20edf2fe2c862c8fe9f8b681edeb79ac1Christoph Hellwig#include <target/target_core_fabric.h> 47c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include <target/target_core_configfs.h> 48c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 49e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig#include "target_core_internal.h" 50c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include "target_core_alua.h" 51c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include "target_core_pr.h" 52c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger#include "target_core_ua.h" 53c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 54e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier#define CREATE_TRACE_POINTS 55e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier#include <trace/events/target.h> 56e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier 5735e0e757537b9239172e35db773dd062727fd612Christoph Hellwigstatic struct workqueue_struct *target_completion_wq; 58c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic struct kmem_cache *se_sess_cache; 59c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *se_ua_cache; 60c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *t10_pr_reg_cache; 61c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *t10_alua_lu_gp_cache; 62c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *t10_alua_lu_gp_mem_cache; 63c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *t10_alua_tg_pt_gp_cache; 64c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstruct kmem_cache *t10_alua_tg_pt_gp_mem_cache; 65229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reineckestruct kmem_cache *t10_alua_lba_map_cache; 66229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reineckestruct kmem_cache *t10_alua_lba_map_mem_cache; 67c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 68c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void transport_complete_task_attr(struct se_cmd *cmd); 6907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellingerstatic void transport_handle_queue_full(struct se_cmd *cmd, 70e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig struct se_device *dev); 71d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellingerstatic int transport_put_cmd(struct se_cmd *cmd); 7235e0e757537b9239172e35db773dd062727fd612Christoph Hellwigstatic void target_complete_ok_work(struct work_struct *work); 73c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 74e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverint init_se_kmem_caches(void) 75c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 76c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess_cache = kmem_cache_create("se_sess_cache", 77c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct se_session), __alignof__(struct se_session), 78c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 0, NULL); 796708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_sess_cache) { 806708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for struct se_session" 81c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " failed\n"); 82c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover goto out; 83c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 84c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_ua_cache = kmem_cache_create("se_ua_cache", 85c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct se_ua), __alignof__(struct se_ua), 86c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 0, NULL); 876708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_ua_cache) { 886708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for struct se_ua failed\n"); 8935e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_sess_cache; 90c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 91c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger t10_pr_reg_cache = kmem_cache_create("t10_pr_reg_cache", 92c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct t10_pr_registration), 93c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger __alignof__(struct t10_pr_registration), 0, NULL); 946708bb27bb2703da238f21f516034263348af5beAndy Grover if (!t10_pr_reg_cache) { 956708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for struct t10_pr_registration" 96c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " failed\n"); 9735e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_ua_cache; 98c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 99c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger t10_alua_lu_gp_cache = kmem_cache_create("t10_alua_lu_gp_cache", 100c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct t10_alua_lu_gp), __alignof__(struct t10_alua_lu_gp), 101c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 0, NULL); 1026708bb27bb2703da238f21f516034263348af5beAndy Grover if (!t10_alua_lu_gp_cache) { 1036708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for t10_alua_lu_gp_cache" 104c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " failed\n"); 10535e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_pr_reg_cache; 106c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 107c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger t10_alua_lu_gp_mem_cache = kmem_cache_create("t10_alua_lu_gp_mem_cache", 108c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct t10_alua_lu_gp_member), 109c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger __alignof__(struct t10_alua_lu_gp_member), 0, NULL); 1106708bb27bb2703da238f21f516034263348af5beAndy Grover if (!t10_alua_lu_gp_mem_cache) { 1116708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for t10_alua_lu_gp_mem_" 112c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "cache failed\n"); 11335e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_lu_gp_cache; 114c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 115c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger t10_alua_tg_pt_gp_cache = kmem_cache_create("t10_alua_tg_pt_gp_cache", 116c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct t10_alua_tg_pt_gp), 117c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger __alignof__(struct t10_alua_tg_pt_gp), 0, NULL); 1186708bb27bb2703da238f21f516034263348af5beAndy Grover if (!t10_alua_tg_pt_gp_cache) { 1196708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for t10_alua_tg_pt_gp_" 120c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "cache failed\n"); 12135e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_lu_gp_mem_cache; 122c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 123c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger t10_alua_tg_pt_gp_mem_cache = kmem_cache_create( 124c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "t10_alua_tg_pt_gp_mem_cache", 125c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sizeof(struct t10_alua_tg_pt_gp_member), 126c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger __alignof__(struct t10_alua_tg_pt_gp_member), 127c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 0, NULL); 1286708bb27bb2703da238f21f516034263348af5beAndy Grover if (!t10_alua_tg_pt_gp_mem_cache) { 1296708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("kmem_cache_create() for t10_alua_tg_pt_gp_" 130c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "mem_t failed\n"); 13135e0e757537b9239172e35db773dd062727fd612Christoph Hellwig goto out_free_tg_pt_gp_cache; 132c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 133229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke t10_alua_lba_map_cache = kmem_cache_create( 134229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke "t10_alua_lba_map_cache", 135229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke sizeof(struct t10_alua_lba_map), 136229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke __alignof__(struct t10_alua_lba_map), 0, NULL); 137229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke if (!t10_alua_lba_map_cache) { 138229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke pr_err("kmem_cache_create() for t10_alua_lba_map_" 139229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke "cache failed\n"); 140229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke goto out_free_tg_pt_gp_mem_cache; 141229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke } 142229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke t10_alua_lba_map_mem_cache = kmem_cache_create( 143229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke "t10_alua_lba_map_mem_cache", 144229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke sizeof(struct t10_alua_lba_map_member), 145229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke __alignof__(struct t10_alua_lba_map_member), 0, NULL); 146229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke if (!t10_alua_lba_map_mem_cache) { 147229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke pr_err("kmem_cache_create() for t10_alua_lba_map_mem_" 148229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke "cache failed\n"); 149229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke goto out_free_lba_map_cache; 150229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke } 151c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 15235e0e757537b9239172e35db773dd062727fd612Christoph Hellwig target_completion_wq = alloc_workqueue("target_completion", 15335e0e757537b9239172e35db773dd062727fd612Christoph Hellwig WQ_MEM_RECLAIM, 0); 15435e0e757537b9239172e35db773dd062727fd612Christoph Hellwig if (!target_completion_wq) 155229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke goto out_free_lba_map_mem_cache; 15635e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 157c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 15835e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 159229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reineckeout_free_lba_map_mem_cache: 160229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke kmem_cache_destroy(t10_alua_lba_map_mem_cache); 161229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reineckeout_free_lba_map_cache: 162229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke kmem_cache_destroy(t10_alua_lba_map_cache); 16335e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_tg_pt_gp_mem_cache: 16435e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(t10_alua_tg_pt_gp_mem_cache); 16535e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_tg_pt_gp_cache: 16635e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(t10_alua_tg_pt_gp_cache); 16735e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_lu_gp_mem_cache: 16835e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(t10_alua_lu_gp_mem_cache); 16935e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_lu_gp_cache: 17035e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(t10_alua_lu_gp_cache); 17135e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_pr_reg_cache: 17235e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(t10_pr_reg_cache); 17335e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_ua_cache: 17435e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(se_ua_cache); 17535e0e757537b9239172e35db773dd062727fd612Christoph Hellwigout_free_sess_cache: 17635e0e757537b9239172e35db773dd062727fd612Christoph Hellwig kmem_cache_destroy(se_sess_cache); 177c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerout: 178e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return -ENOMEM; 179c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 180c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 181e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grovervoid release_se_kmem_caches(void) 182c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 18335e0e757537b9239172e35db773dd062727fd612Christoph Hellwig destroy_workqueue(target_completion_wq); 184c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(se_sess_cache); 185c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(se_ua_cache); 186c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(t10_pr_reg_cache); 187c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(t10_alua_lu_gp_cache); 188c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(t10_alua_lu_gp_mem_cache); 189c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(t10_alua_tg_pt_gp_cache); 190c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_destroy(t10_alua_tg_pt_gp_mem_cache); 191229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke kmem_cache_destroy(t10_alua_lba_map_cache); 192229d4f112fd6d1562b6d5324c4cb8f8d097bac54Hannes Reinecke kmem_cache_destroy(t10_alua_lba_map_mem_cache); 193c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 194c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 195e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover/* This code ensures unique mib indexes are handed out. */ 196e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic DEFINE_SPINLOCK(scsi_mib_index_lock); 197e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Groverstatic u32 scsi_mib_index[SCSI_INDEX_TYPE_MAX]; 198e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 199e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger/* 200e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger * Allocate a new row index for the entry type specified 201e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger */ 202e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellingeru32 scsi_get_new_index(scsi_index_t type) 203e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger{ 204e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger u32 new_index; 205e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 206e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover BUG_ON((type < 0) || (type >= SCSI_INDEX_TYPE_MAX)); 207e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 208e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_lock(&scsi_mib_index_lock); 209e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover new_index = ++scsi_mib_index[type]; 210e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover spin_unlock(&scsi_mib_index_lock); 211e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 212e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger return new_index; 213e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger} 214e89d15eeadb172bd53ca6362bf9ab6b22077224cNicholas Bellinger 215dbc5623eb2898f5b5dcdc0b16077bb3f58629c78Nicholas Bellingervoid transport_subsystem_check_init(void) 216c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 217c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret; 218283669d282836c5b96faca9bcca184efb9618975Andy Grover static int sub_api_initialized; 219c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 220dbc5623eb2898f5b5dcdc0b16077bb3f58629c78Nicholas Bellinger if (sub_api_initialized) 221dbc5623eb2898f5b5dcdc0b16077bb3f58629c78Nicholas Bellinger return; 222dbc5623eb2898f5b5dcdc0b16077bb3f58629c78Nicholas Bellinger 223c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = request_module("target_core_iblock"); 224c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret != 0) 2256708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to load target_core_iblock\n"); 226c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 227c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = request_module("target_core_file"); 228c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret != 0) 2296708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to load target_core_file\n"); 230c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 231c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = request_module("target_core_pscsi"); 232c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret != 0) 2336708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to load target_core_pscsi\n"); 234c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2357c9e7a6fe11c8dc5b3b9d0e889dde73347247584Andy Grover ret = request_module("target_core_user"); 2367c9e7a6fe11c8dc5b3b9d0e889dde73347247584Andy Grover if (ret != 0) 2377c9e7a6fe11c8dc5b3b9d0e889dde73347247584Andy Grover pr_err("Unable to load target_core_user\n"); 2387c9e7a6fe11c8dc5b3b9d0e889dde73347247584Andy Grover 239e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover sub_api_initialized = 1; 240c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 241c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 242e70beee783d6977d80eede88a3394f02eabddad1Nicholas Bellingerstruct se_session *transport_init_session(enum target_prot_op sup_prot_ops) 243c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 244c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *se_sess; 245c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 246c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess = kmem_cache_zalloc(se_sess_cache, GFP_KERNEL); 2476708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_sess) { 2486708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate struct se_session from" 249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " se_sess_cache\n"); 250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ERR_PTR(-ENOMEM); 251c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_sess->sess_list); 253c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger INIT_LIST_HEAD(&se_sess->sess_acl_list); 254a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger INIT_LIST_HEAD(&se_sess->sess_cmd_list); 2559b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger INIT_LIST_HEAD(&se_sess->sess_wait_list); 256a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger spin_lock_init(&se_sess->sess_cmd_lock); 25741ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger kref_init(&se_sess->sess_kref); 258e70beee783d6977d80eede88a3394f02eabddad1Nicholas Bellinger se_sess->sup_prot_ops = sup_prot_ops; 259c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 260c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return se_sess; 261c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 262c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_init_session); 263c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 264c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellingerint transport_alloc_session_tags(struct se_session *se_sess, 265c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger unsigned int tag_num, unsigned int tag_size) 266c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger{ 267c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger int rc; 268c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 2698c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger se_sess->sess_cmd_map = kzalloc(tag_num * tag_size, 2708c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); 271c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger if (!se_sess->sess_cmd_map) { 2728c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger se_sess->sess_cmd_map = vzalloc(tag_num * tag_size); 2738c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger if (!se_sess->sess_cmd_map) { 2748c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger pr_err("Unable to allocate se_sess->sess_cmd_map\n"); 2758c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger return -ENOMEM; 2768c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger } 277c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger } 278c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 279c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger rc = percpu_ida_init(&se_sess->sess_tag_pool, tag_num); 280c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger if (rc < 0) { 281c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger pr_err("Unable to init se_sess->sess_tag_pool," 282c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger " tag_num: %u\n", tag_num); 2838c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger if (is_vmalloc_addr(se_sess->sess_cmd_map)) 2848c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger vfree(se_sess->sess_cmd_map); 2858c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger else 2868c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger kfree(se_sess->sess_cmd_map); 287c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger se_sess->sess_cmd_map = NULL; 288c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger return -ENOMEM; 289c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger } 290c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 291c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger return 0; 292c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger} 293c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas BellingerEXPORT_SYMBOL(transport_alloc_session_tags); 294c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 295c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellingerstruct se_session *transport_init_session_tags(unsigned int tag_num, 296e70beee783d6977d80eede88a3394f02eabddad1Nicholas Bellinger unsigned int tag_size, 297e70beee783d6977d80eede88a3394f02eabddad1Nicholas Bellinger enum target_prot_op sup_prot_ops) 298c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger{ 299c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger struct se_session *se_sess; 300c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger int rc; 301c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 302e70beee783d6977d80eede88a3394f02eabddad1Nicholas Bellinger se_sess = transport_init_session(sup_prot_ops); 303c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger if (IS_ERR(se_sess)) 304c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger return se_sess; 305c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 306c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger rc = transport_alloc_session_tags(se_sess, tag_num, tag_size); 307c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger if (rc < 0) { 308c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger transport_free_session(se_sess); 309c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger return ERR_PTR(-ENOMEM); 310c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger } 311c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 312c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger return se_sess; 313c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger} 314c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas BellingerEXPORT_SYMBOL(transport_init_session_tags); 315c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger 316c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 317140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger * Called with spin_lock_irqsave(&struct se_portal_group->session_lock called. 318c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 319c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid __transport_register_session( 320c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg, 321c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl, 322c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *se_sess, 323c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *fabric_sess_ptr) 324c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 325c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char buf[PR_REG_ISID_LEN]; 326c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 327c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess->se_tpg = se_tpg; 328c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess->fabric_sess_ptr = fabric_sess_ptr; 329c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 330c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Used by struct se_node_acl's under ConfigFS to locate active se_session-t 331c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 332c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Only set for struct se_session's that will actually be moving I/O. 333c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * eg: *NOT* discovery sessions. 334c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 335c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (se_nacl) { 336c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 337c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the fabric module supports an ISID based TransportID, 338c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * save this value in binary from the fabric I_T Nexus now. 339c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 340e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (se_tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) { 341c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger memset(&buf[0], 0, PR_REG_ISID_LEN); 342e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->sess_get_initiator_sid(se_sess, 343c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &buf[0], PR_REG_ISID_LEN); 344c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess->sess_bin_isid = get_unaligned_be64(&buf[0]); 345c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 346afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_get(&se_nacl->acl_kref); 347afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger 348c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock_irq(&se_nacl->nacl_sess_lock); 349c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 350c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * The se_nacl->nacl_sess pointer will be set to the 351c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * last active I_T Nexus for each struct se_node_acl. 352c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 353c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl->nacl_sess = se_sess; 354c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 355c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&se_sess->sess_acl_list, 356c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &se_nacl->acl_sess_list); 357c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock_irq(&se_nacl->nacl_sess_lock); 358c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 359c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_add_tail(&se_sess->sess_list, &se_tpg->tpg_sess_list); 360c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 3616708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Registered fabric_sess_ptr: %p\n", 362e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->get_fabric_name(), se_sess->fabric_sess_ptr); 363c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 364c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(__transport_register_session); 365c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 366c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_register_session( 367c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg, 368c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl, 369c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *se_sess, 370c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger void *fabric_sess_ptr) 371c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 372140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger unsigned long flags; 373140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger 374140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_lock_irqsave(&se_tpg->session_lock, flags); 375c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger __transport_register_session(se_tpg, se_nacl, se_sess, fabric_sess_ptr); 376140854cb72525246745b67300d35101ad2875a39Nicholas Bellinger spin_unlock_irqrestore(&se_tpg->session_lock, flags); 377c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 378c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_register_session); 379c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 380ecf0dd6642ecf7c0aff89c1be48b870586f4be4fFengguang Wustatic void target_release_session(struct kref *kref) 38141ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger{ 38241ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger struct se_session *se_sess = container_of(kref, 38341ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger struct se_session, sess_kref); 38441ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger struct se_portal_group *se_tpg = se_sess->se_tpg; 38541ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger 38641ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger se_tpg->se_tpg_tfo->close_session(se_sess); 38741ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger} 38841ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger 38941ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellingervoid target_get_session(struct se_session *se_sess) 39041ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger{ 39141ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger kref_get(&se_sess->sess_kref); 39241ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger} 39341ac82b668177876d5965d5f60956fb0fbcdb514Nicholas BellingerEXPORT_SYMBOL(target_get_session); 39441ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger 39533933a0e962bba4af32de7db912e2fdfef603d24Jörn Engelvoid target_put_session(struct se_session *se_sess) 39641ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger{ 3974149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel struct se_portal_group *tpg = se_sess->se_tpg; 3984149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel 3994149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel if (tpg->se_tpg_tfo->put_session != NULL) { 4004149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel tpg->se_tpg_tfo->put_session(se_sess); 4014149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel return; 4024149268e7816d719b0fde8e89aaa6db8c168fc43Joern Engel } 40333933a0e962bba4af32de7db912e2fdfef603d24Jörn Engel kref_put(&se_sess->sess_kref, target_release_session); 40441ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger} 40541ac82b668177876d5965d5f60956fb0fbcdb514Nicholas BellingerEXPORT_SYMBOL(target_put_session); 40641ac82b668177876d5965d5f60956fb0fbcdb514Nicholas Bellinger 407afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellingerstatic void target_complete_nacl(struct kref *kref) 408afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger{ 409afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger struct se_node_acl *nacl = container_of(kref, 410afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger struct se_node_acl, acl_kref); 411afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger 412afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger complete(&nacl->acl_free_comp); 413afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger} 414afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger 415afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellingervoid target_put_nacl(struct se_node_acl *nacl) 416afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger{ 417afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger kref_put(&nacl->acl_kref, target_complete_nacl); 418afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger} 419afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger 420c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_deregister_session_configfs(struct se_session *se_sess) 421c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 422c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl; 423233888644d80cc44330062e5e978c9e3a14c9cb9Roland Dreier unsigned long flags; 424c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 425c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Used by struct se_node_acl's under ConfigFS to locate active struct se_session 426c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 427c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl = se_sess->se_node_acl; 4286708bb27bb2703da238f21f516034263348af5beAndy Grover if (se_nacl) { 429233888644d80cc44330062e5e978c9e3a14c9cb9Roland Dreier spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags); 430337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger if (se_nacl->acl_stop == 0) 431337c060701fb3d27d9945bf7af7ba194ae2153a8Nicholas Bellinger list_del(&se_sess->sess_acl_list); 432c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 433c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the session list is empty, then clear the pointer. 434c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Otherwise, set the struct se_session pointer from the tail 435c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * element of the per struct se_node_acl active session list. 436c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 437c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (list_empty(&se_nacl->acl_sess_list)) 438c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl->nacl_sess = NULL; 439c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else { 440c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl->nacl_sess = container_of( 441c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl->acl_sess_list.prev, 442c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session, sess_acl_list); 443c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 444233888644d80cc44330062e5e978c9e3a14c9cb9Roland Dreier spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags); 445c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 446c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 447c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_deregister_session_configfs); 448c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 449c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_free_session(struct se_session *se_sess) 450c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 451c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger if (se_sess->sess_cmd_map) { 452c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger percpu_ida_destroy(&se_sess->sess_tag_pool); 4538c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger if (is_vmalloc_addr(se_sess->sess_cmd_map)) 4548c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger vfree(se_sess->sess_cmd_map); 4558c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger else 4568c7f6e9b3321f5ede7f33974cad06db224661a42Nicholas Bellinger kfree(se_sess->sess_cmd_map); 457c0add7fd05ff99c3a516c78eb6b1e6460a3efdaeNicholas Bellinger } 458c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger kmem_cache_free(se_sess_cache, se_sess); 459c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 460c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_free_session); 461c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 462c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_deregister_session(struct se_session *se_sess) 463c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 464c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_portal_group *se_tpg = se_sess->se_tpg; 46501468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger struct target_core_fabric_ops *se_tfo; 466c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_node_acl *se_nacl; 467e63a8e1933a2218cf801e46dd01bd8cca4a555ecRoland Dreier unsigned long flags; 46801468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger bool comp_nacl = true; 469c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 4706708bb27bb2703da238f21f516034263348af5beAndy Grover if (!se_tpg) { 471c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_free_session(se_sess); 472c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return; 473c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 47401468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger se_tfo = se_tpg->se_tpg_tfo; 475c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 476e63a8e1933a2218cf801e46dd01bd8cca4a555ecRoland Dreier spin_lock_irqsave(&se_tpg->session_lock, flags); 477c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger list_del(&se_sess->sess_list); 478c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess->se_tpg = NULL; 479c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_sess->fabric_sess_ptr = NULL; 480e63a8e1933a2218cf801e46dd01bd8cca4a555ecRoland Dreier spin_unlock_irqrestore(&se_tpg->session_lock, flags); 481c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 482c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 483c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if we need to do extra work for this initiator node's 484c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * struct se_node_acl if it had been previously dynamically generated. 485c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 486c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger se_nacl = se_sess->se_node_acl; 48701468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger 48801468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger spin_lock_irqsave(&se_tpg->acl_node_lock, flags); 48901468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger if (se_nacl && se_nacl->dynamic_node_acl) { 49001468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger if (!se_tfo->tpg_check_demo_mode_cache(se_tpg)) { 49101468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger list_del(&se_nacl->acl_list); 49201468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger se_tpg->num_node_acls--; 49301468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger spin_unlock_irqrestore(&se_tpg->acl_node_lock, flags); 49401468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger core_tpg_wait_for_nacl_pr_ref(se_nacl); 49501468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger core_free_device_list_for_node(se_nacl, se_tpg); 49601468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger se_tfo->tpg_release_fabric_acl(se_tpg, se_nacl); 49701468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger 49801468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger comp_nacl = false; 49901468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger spin_lock_irqsave(&se_tpg->acl_node_lock, flags); 500c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 501c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 50201468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger spin_unlock_irqrestore(&se_tpg->acl_node_lock, flags); 503c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 5046708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("TARGET_CORE[%s]: Deregistered fabric_sess\n", 505e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover se_tpg->se_tpg_tfo->get_fabric_name()); 50601468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger /* 507125d0119d158180eb38580adfbc1a83d56120709Hannes Reinecke * If last kref is dropping now for an explicit NodeACL, awake sleeping 508afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger * ->acl_free_comp caller to wakeup configfs se_node_acl->acl_group 509afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger * removal context. 51001468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger */ 5110bcc297e2b45c12baf735e1dc1f163e71ea55e16Christophe Vu-Brugier if (se_nacl && comp_nacl) 512afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger target_put_nacl(se_nacl); 51301468346546a9bcc09035a7e8b71f78af5b7133aNicholas Bellinger 514afb999ffc48f5e7ec18e6f8f9e68aa3d0085862dNicholas Bellinger transport_free_session(se_sess); 515c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 516c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_deregister_session); 517c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 518c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 519a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover * Called with cmd->t_state_lock held. 520c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 521cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwigstatic void target_remove_from_state_list(struct se_cmd *cmd) 522c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 52342bf829eee0e36371a3df43978b14572c716cbe7Christoph Hellwig struct se_device *dev = cmd->se_dev; 524c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned long flags; 525c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 52642bf829eee0e36371a3df43978b14572c716cbe7Christoph Hellwig if (!dev) 52742bf829eee0e36371a3df43978b14572c716cbe7Christoph Hellwig return; 528c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 529cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig if (cmd->transport_state & CMD_T_BUSY) 530cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig return; 531c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 532cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig spin_lock_irqsave(&dev->execute_task_lock, flags); 533cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig if (cmd->state_active) { 534cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig list_del(&cmd->state_list); 535cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->state_active = false; 536c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 537cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig spin_unlock_irqrestore(&dev->execute_task_lock, flags); 538c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 539c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 540862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellingerstatic int transport_cmd_check_stop(struct se_cmd *cmd, bool remove_from_lists, 541862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger bool write_pending) 542c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 543c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned long flags; 544c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 545a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_irqsave(&cmd->t_state_lock, flags); 546862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger if (write_pending) 547862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger cmd->t_state = TRANSPORT_WRITE_PENDING; 548862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger 549f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig if (remove_from_lists) { 550f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig target_remove_from_state_list(cmd); 551f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig 552f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig /* 553f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * Clear struct se_cmd->se_lun before the handoff to FE. 554f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig */ 555f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig cmd->se_lun = NULL; 556f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig } 557f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig 558c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 559c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine if frontend context caller is requesting the stopping of 560e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover * this command for frontend exceptions. 561c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 5627d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig if (cmd->transport_state & CMD_T_STOP) { 5637d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig pr_debug("%s:%d CMD_T_STOP for ITT: 0x%08x\n", 5647d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig __func__, __LINE__, 565e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->get_task_tag(cmd)); 566c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 567a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 568c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 569a95d6511303b848da45ee27b35018bb58087bdc6Nicholas Bellinger complete_all(&cmd->t_transport_stop_comp); 570c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 1; 571c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 572f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig 573f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig cmd->transport_state &= ~CMD_T_ACTIVE; 574f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig if (remove_from_lists) { 575f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig /* 576f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * Some fabric modules like tcm_loop can release 577f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * their internally allocated I/O reference now and 578f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * struct se_cmd now. 579f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * 580f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * Fabric modules are expected to return '1' here if the 581f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * se_cmd being passed is released at this point, 582f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig * or zero if not being released. 583f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig */ 584f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig if (cmd->se_tfo->check_stop_free != NULL) { 585f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig spin_unlock_irqrestore(&cmd->t_state_lock, flags); 586f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig return cmd->se_tfo->check_stop_free(cmd); 587c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 588f7113a47e2c3880ed5f8a05ff9c54ead4ee7351cChristoph Hellwig } 589c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 590a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 591c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 592c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 593c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 594c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int transport_cmd_check_stop_to_fabric(struct se_cmd *cmd) 595c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 596862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger return transport_cmd_check_stop(cmd, true, false); 597c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 598c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 599c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void transport_lun_remove_cmd(struct se_cmd *cmd) 600c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 601e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover struct se_lun *lun = cmd->se_lun; 602c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6035259a06ef97068b710f45d092a587e8d740f750fNicholas Bellinger if (!lun) 604c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return; 605c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6065259a06ef97068b710f45d092a587e8d740f750fNicholas Bellinger if (cmpxchg(&cmd->lun_ref_active, true, false)) 6075259a06ef97068b710f45d092a587e8d740f750fNicholas Bellinger percpu_ref_put(&lun->lun_ref); 608c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 609c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 610c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_cmd_finish_abort(struct se_cmd *cmd, int remove) 611c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 61268259b5aac13a57cba797b9605ed9812158f0e72Alex Leung if (cmd->se_cmd_flags & SCF_SE_LUN_CMD) 61368259b5aac13a57cba797b9605ed9812158f0e72Alex Leung transport_lun_remove_cmd(cmd); 614131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger /* 615131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger * Allow the fabric driver to unmap any resources before 616131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger * releasing the descriptor via TFO->release_cmd() 617131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger */ 618131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger if (remove) 619131e6abc674edb9f9a59090bb35bf6650569b7e7Nicholas Bellinger cmd->se_tfo->aborted_task(cmd); 62068259b5aac13a57cba797b9605ed9812158f0e72Alex Leung 621c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (transport_cmd_check_stop_to_fabric(cmd)) 622c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return; 623af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig if (remove) 624e6a2573f1f5d66f0456c433afdfc63f33fdf9008Christoph Hellwig transport_put_cmd(cmd); 625c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 626c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 62735e0e757537b9239172e35db773dd062727fd612Christoph Hellwigstatic void target_complete_failure_work(struct work_struct *work) 62835e0e757537b9239172e35db773dd062727fd612Christoph Hellwig{ 62935e0e757537b9239172e35db773dd062727fd612Christoph Hellwig struct se_cmd *cmd = container_of(work, struct se_cmd, work); 63035e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 631de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig transport_generic_request_failure(cmd, 632de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE); 63335e0e757537b9239172e35db773dd062727fd612Christoph Hellwig} 63435e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 6356138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini/* 636d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini * Used when asking transport to copy Sense Data from the underlying 637d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini * Linux/SCSI struct scsi_cmnd 6386138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini */ 639d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzinistatic unsigned char *transport_get_sense_buffer(struct se_cmd *cmd) 6406138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini{ 6416138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini struct se_device *dev = cmd->se_dev; 6426138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 6436138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini WARN_ON(!cmd->se_lun); 6446138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 6456138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini if (!dev) 646d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini return NULL; 6476138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 648d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) 649d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini return NULL; 6506138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 6519c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; 6526138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 653d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini pr_debug("HBA_[%u]_PLUG[%s]: Requesting sense for SAM STATUS: 0x%02x\n", 6546138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status); 6559c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier return cmd->sense_buffer; 6566138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini} 6576138ed2ab8791d7a9c5ba66cadadd5eaf1fc1dacPaolo Bonzini 6585787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwigvoid target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) 659c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 66042bf829eee0e36371a3df43978b14572c716cbe7Christoph Hellwig struct se_device *dev = cmd->se_dev; 6615787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwig int success = scsi_status == GOOD; 662c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned long flags; 663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 6645787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwig cmd->scsi_status = scsi_status; 6655787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwig 6665787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwig 667a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_irqsave(&cmd->t_state_lock, flags); 668cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->transport_state &= ~CMD_T_BUSY; 669c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 670c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (dev && dev->transport->transport_complete) { 671d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini dev->transport->transport_complete(cmd, 672d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini cmd->t_data_sg, 673d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini transport_get_sense_buffer(cmd)); 674d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) 675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger success = 1; 676c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 677c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 678c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 6795787cacd0bd5ee016ad807b244550d34fe2beebeChristoph Hellwig * See if we are waiting to complete for an exception condition. 680c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 681cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig if (cmd->transport_state & CMD_T_REQUEST_STOP) { 682a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 683cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig complete(&cmd->task_stop_comp); 684c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return; 685c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 6862235007c4d3245c0eca5e49497aafe5a111c00fbChristoph Hellwig 6873d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger /* 688125d0119d158180eb38580adfbc1a83d56120709Hannes Reinecke * Check for case where an explicit ABORT_TASK has been received 6893d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger * and transport_wait_for_tasks() will be waiting for completion.. 6903d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger */ 6913d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger if (cmd->transport_state & CMD_T_ABORTED && 6923d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger cmd->transport_state & CMD_T_STOP) { 6933d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 694a95d6511303b848da45ee27b35018bb58087bdc6Nicholas Bellinger complete_all(&cmd->t_transport_stop_comp); 6953d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger return; 6963dca1471993f9b89f3184468f8bbab2b1e024451Roland Dreier } else if (!success) { 69735e0e757537b9239172e35db773dd062727fd612Christoph Hellwig INIT_WORK(&cmd->work, target_complete_failure_work); 698c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } else { 69935e0e757537b9239172e35db773dd062727fd612Christoph Hellwig INIT_WORK(&cmd->work, target_complete_ok_work); 700c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 70135e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 70235e0e757537b9239172e35db773dd062727fd612Christoph Hellwig cmd->t_state = TRANSPORT_COMPLETE; 7033d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger cmd->transport_state |= (CMD_T_COMPLETE | CMD_T_ACTIVE); 704a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 705c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 70635e0e757537b9239172e35db773dd062727fd612Christoph Hellwig queue_work(target_completion_wq, &cmd->work); 707c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 7086bb35e009b656b36f7985057822c5fbf53ea75b7Christoph HellwigEXPORT_SYMBOL(target_complete_cmd); 7096bb35e009b656b36f7985057822c5fbf53ea75b7Christoph Hellwig 7102426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreiervoid target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) 7112426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier{ 7122426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier if (scsi_status == SAM_STAT_GOOD && length < cmd->data_length) { 7132426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { 7142426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier cmd->residual_count += cmd->data_length - length; 7152426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier } else { 7162426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; 7172426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier cmd->residual_count = cmd->data_length - length; 7182426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier } 7192426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier 7202426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier cmd->data_length = length; 7212426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier } 7222426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier 7232426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier target_complete_cmd(cmd, scsi_status); 7242426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier} 7252426bd456a61407388b6e61fc5f98dbcbebc50e2Roland DreierEXPORT_SYMBOL(target_complete_cmd_with_length); 7262426bd456a61407388b6e61fc5f98dbcbebc50e2Roland Dreier 727cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwigstatic void target_add_to_state_list(struct se_cmd *cmd) 728c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 729cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig struct se_device *dev = cmd->se_dev; 730cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig unsigned long flags; 731c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 732cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig spin_lock_irqsave(&dev->execute_task_lock, flags); 733cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig if (!cmd->state_active) { 734cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig list_add_tail(&cmd->state_list, &dev->state_list); 735cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->state_active = true; 736c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 737cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig spin_unlock_irqrestore(&dev->execute_task_lock, flags); 738c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 739c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 74007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger/* 741f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger * Handle QUEUE_FULL / -EAGAIN and -ENOMEM status 74207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger */ 7437a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwigstatic void transport_write_pending_qf(struct se_cmd *cmd); 7447a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwigstatic void transport_complete_qf(struct se_cmd *cmd); 74507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 7460fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwigvoid target_qf_do_work(struct work_struct *work) 74707bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger{ 74807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger struct se_device *dev = container_of(work, struct se_device, 74907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger qf_work_queue); 750bcac364a24c894c4cf8cf219b7863c192cd34079Roland Dreier LIST_HEAD(qf_cmd_list); 75107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger struct se_cmd *cmd, *cmd_tmp; 75207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 75307bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger spin_lock_irq(&dev->qf_cmd_lock); 754bcac364a24c894c4cf8cf219b7863c192cd34079Roland Dreier list_splice_init(&dev->qf_cmd_list, &qf_cmd_list); 755bcac364a24c894c4cf8cf219b7863c192cd34079Roland Dreier spin_unlock_irq(&dev->qf_cmd_lock); 75607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 757bcac364a24c894c4cf8cf219b7863c192cd34079Roland Dreier list_for_each_entry_safe(cmd, cmd_tmp, &qf_cmd_list, se_qf_node) { 75807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger list_del(&cmd->se_qf_node); 75933940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_dec_mb(&dev->dev_qf_count); 76007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 7616708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Processing %s cmd: %p QUEUE_FULL in work queue" 76207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger " context: %s\n", cmd->se_tfo->get_fabric_name(), cmd, 763e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig (cmd->t_state == TRANSPORT_COMPLETE_QF_OK) ? "COMPLETE_OK" : 76407bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger (cmd->t_state == TRANSPORT_COMPLETE_QF_WP) ? "WRITE_PENDING" 76507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger : "UNKNOWN"); 766f7a5cc0b310af887f5391ba886d3d9254ac8920aChristoph Hellwig 7677a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwig if (cmd->t_state == TRANSPORT_COMPLETE_QF_WP) 7687a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwig transport_write_pending_qf(cmd); 7697a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwig else if (cmd->t_state == TRANSPORT_COMPLETE_QF_OK) 7707a6f0a1ea5f5ac9b67211071d558c5b09580695dChristoph Hellwig transport_complete_qf(cmd); 77107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger } 77207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger} 77307bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 774c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerunsigned char *transport_dump_cmd_direction(struct se_cmd *cmd) 775c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 776c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (cmd->data_direction) { 777c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_NONE: 778c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return "NONE"; 779c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_FROM_DEVICE: 780c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return "READ"; 781c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_TO_DEVICE: 782c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return "WRITE"; 783c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_BIDIRECTIONAL: 784c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return "BIDI"; 785c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 786c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 787c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 788c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 789c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return "UNKNOWN"; 790c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 791c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 792c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_dump_dev_state( 793c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_device *dev, 794c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger char *b, 795c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int *bl) 796c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 797c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *bl += sprintf(b + *bl, "Status: "); 7980fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig if (dev->export_count) 799c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *bl += sprintf(b + *bl, "ACTIVATED"); 8000fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig else 801c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *bl += sprintf(b + *bl, "DEACTIVATED"); 802c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 8035f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig *bl += sprintf(b + *bl, " Max Queue Depth: %d", dev->queue_depth); 80411e764bd5ed4bb930e0ec5dd161df58307507347Nicholas Bellinger *bl += sprintf(b + *bl, " SectorSize: %u HwMaxSectors: %u\n", 8050fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig dev->dev_attrib.block_size, 8060fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig dev->dev_attrib.hw_max_sectors); 807c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *bl += sprintf(b + *bl, " "); 808c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 809c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 810c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_dump_vpd_proto_id( 811c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct t10_vpd *vpd, 812c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *p_buf, 813c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int p_buf_len) 814c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 815c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char buf[VPD_TMP_BUF_SIZE]; 816c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int len; 817c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 818c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger memset(buf, 0, VPD_TMP_BUF_SIZE); 819c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger len = sprintf(buf, "T10 VPD Protocol Identifier: "); 820c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 821c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (vpd->protocol_identifier) { 822c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x00: 823c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Fibre Channel\n"); 824c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 825c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x10: 826c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Parallel SCSI\n"); 827c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 828c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x20: 829c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "SSA\n"); 830c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 831c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x30: 832c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "IEEE 1394\n"); 833c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 834c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x40: 835c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "SCSI Remote Direct Memory Access" 836c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Protocol\n"); 837c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 838c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x50: 839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Internet SCSI (iSCSI)\n"); 840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x60: 842c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "SAS Serial SCSI Protocol\n"); 843c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 844c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x70: 845c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Automation/Drive Interface Transport" 846c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " Protocol\n"); 847c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 848c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x80: 849c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "AT Attachment Interface ATA/ATAPI\n"); 850c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 851c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 852c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Unknown 0x%02x\n", 853c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->protocol_identifier); 854c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 855c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 856c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 857c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (p_buf) 858c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger strncpy(p_buf, buf, p_buf_len); 859c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 8606708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s", buf); 861c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 862c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 863c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid 864c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingertransport_set_vpd_proto_id(struct t10_vpd *vpd, unsigned char *page_83) 865c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 866c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 867c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Check if the Protocol Identifier Valid (PIV) bit is set.. 868c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 869c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * from spc3r23.pdf section 7.5.1 870c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 871c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (page_83[1] & 0x80) { 872c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->protocol_identifier = (page_83[0] & 0xf0); 873c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->protocol_identifier_set = 1; 874c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_dump_vpd_proto_id(vpd, NULL, 0); 875c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 876c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 877c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_set_vpd_proto_id); 878c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 879c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_dump_vpd_assoc( 880c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct t10_vpd *vpd, 881c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *p_buf, 882c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int p_buf_len) 883c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 884c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char buf[VPD_TMP_BUF_SIZE]; 885e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int ret = 0; 886e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int len; 887c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 888c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger memset(buf, 0, VPD_TMP_BUF_SIZE); 889c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger len = sprintf(buf, "T10 VPD Identifier Association: "); 890c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 891c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (vpd->association) { 892c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x00: 893c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "addressed logical unit\n"); 894c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 895c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x10: 896c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "target port\n"); 897c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 898c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x20: 899c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "SCSI target device\n"); 900c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 901c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 902c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Unknown 0x%02x\n", vpd->association); 903e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover ret = -EINVAL; 904c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 905c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 906c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 907c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (p_buf) 908c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger strncpy(p_buf, buf, p_buf_len); 909c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 9106708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s", buf); 911c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 912c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ret; 913c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 914c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 915c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_set_vpd_assoc(struct t10_vpd *vpd, unsigned char *page_83) 916c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 917c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 918c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * The VPD identification association.. 919c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 920c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * from spc3r23.pdf Section 7.6.3.1 Table 297 921c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 922c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->association = (page_83[1] & 0x30); 923c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return transport_dump_vpd_assoc(vpd, NULL, 0); 924c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 925c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_set_vpd_assoc); 926c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 927c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_dump_vpd_ident_type( 928c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct t10_vpd *vpd, 929c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *p_buf, 930c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int p_buf_len) 931c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 932c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char buf[VPD_TMP_BUF_SIZE]; 933e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int ret = 0; 934e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover int len; 935c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 936c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger memset(buf, 0, VPD_TMP_BUF_SIZE); 937c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger len = sprintf(buf, "T10 VPD Identifier Type: "); 938c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 939c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (vpd->device_identifier_type) { 940c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x00: 941c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Vendor specific\n"); 942c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 943c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x01: 944c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "T10 Vendor ID based\n"); 945c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 946c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x02: 947c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "EUI-64 based\n"); 948c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 949c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x03: 950c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "NAA\n"); 951c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 952c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x04: 953c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Relative target port identifier\n"); 954c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 955c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x08: 956c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "SCSI name string\n"); 957c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 958c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 959c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf+len, "Unsupported: 0x%02x\n", 960c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier_type); 961e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover ret = -EINVAL; 962c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 963c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 964c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 965e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (p_buf) { 966e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (p_buf_len < strlen(buf)+1) 967e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return -EINVAL; 968c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger strncpy(p_buf, buf, p_buf_len); 969e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover } else { 9706708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s", buf); 971e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover } 972c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 973c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ret; 974c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 975c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 976c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_set_vpd_ident_type(struct t10_vpd *vpd, unsigned char *page_83) 977c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 978c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 979c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * The VPD identifier type.. 980c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 981c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * from spc3r23.pdf Section 7.6.3.1 Table 298 982c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 983c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier_type = (page_83[1] & 0x0f); 984c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return transport_dump_vpd_ident_type(vpd, NULL, 0); 985c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 986c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_set_vpd_ident_type); 987c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 988c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_dump_vpd_ident( 989c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct t10_vpd *vpd, 990c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *p_buf, 991c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int p_buf_len) 992c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 993c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char buf[VPD_TMP_BUF_SIZE]; 994c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret = 0; 995c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 996c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger memset(buf, 0, VPD_TMP_BUF_SIZE); 997c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 998c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (vpd->device_identifier_code_set) { 999c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x01: /* Binary */ 1000703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter snprintf(buf, sizeof(buf), 1001703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter "T10 VPD Binary Device Identifier: %s\n", 1002c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &vpd->device_identifier[0]); 1003c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1004c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x02: /* ASCII */ 1005703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter snprintf(buf, sizeof(buf), 1006703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter "T10 VPD ASCII Device Identifier: %s\n", 1007c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &vpd->device_identifier[0]); 1008c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1009c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x03: /* UTF-8 */ 1010703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter snprintf(buf, sizeof(buf), 1011703d641d87034629f8b0da94334034ed5d805b36Dan Carpenter "T10 VPD UTF-8 Device Identifier: %s\n", 1012c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger &vpd->device_identifier[0]); 1013c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1014c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 1015c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger sprintf(buf, "T10 VPD Device Identifier encoding unsupported:" 1016c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " 0x%02x", vpd->device_identifier_code_set); 1017e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover ret = -EINVAL; 1018c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1019c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1020c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1021c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (p_buf) 1022c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger strncpy(p_buf, buf, p_buf_len); 1023c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger else 10246708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("%s", buf); 1025c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1026c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ret; 1027c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1028c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1029c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint 1030c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingertransport_set_vpd_ident(struct t10_vpd *vpd, unsigned char *page_83) 1031c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 1032c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger static const char hex_str[] = "0123456789abcdef"; 103335d1efe80500a55f9aa01b305a6714ec78c33764Masanari Iida int j = 0, i = 4; /* offset to start of the identifier */ 1034c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1035c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1036c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * The VPD Code Set (encoding) 1037c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 1038c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * from spc3r23.pdf Section 7.6.3.1 Table 296 1039c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1040c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier_code_set = (page_83[0] & 0x0f); 1041c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (vpd->device_identifier_code_set) { 1042c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x01: /* Binary */ 1043c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier[j++] = 1044c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger hex_str[vpd->device_identifier_type]; 1045c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (i < (4 + page_83[3])) { 1046c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier[j++] = 1047c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger hex_str[(page_83[i] & 0xf0) >> 4]; 1048c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier[j++] = 1049c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger hex_str[page_83[i] & 0x0f]; 1050c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger i++; 1051c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1052c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1053c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x02: /* ASCII */ 1054c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case 0x03: /* UTF-8 */ 1055c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger while (i < (4 + page_83[3])) 1056c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger vpd->device_identifier[j++] = page_83[i++]; 1057c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1058c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 1059c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1060c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1061c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1062c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return transport_dump_vpd_ident(vpd, NULL, 0); 1063c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1064c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_set_vpd_ident); 1065c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1066de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigsense_reason_t 1067de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtarget_cmd_size_check(struct se_cmd *cmd, unsigned int size) 10689b3b804101db067c3889948f57031f852186ea11Christoph Hellwig{ 10699b3b804101db067c3889948f57031f852186ea11Christoph Hellwig struct se_device *dev = cmd->se_dev; 10709b3b804101db067c3889948f57031f852186ea11Christoph Hellwig 10719b3b804101db067c3889948f57031f852186ea11Christoph Hellwig if (cmd->unknown_data_length) { 10729b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->data_length = size; 10739b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } else if (size != cmd->data_length) { 10749b3b804101db067c3889948f57031f852186ea11Christoph Hellwig pr_warn("TARGET_CORE[%s]: Expected Transfer Length:" 10759b3b804101db067c3889948f57031f852186ea11Christoph Hellwig " %u does not match SCSI CDB Length: %u for SAM Opcode:" 10769b3b804101db067c3889948f57031f852186ea11Christoph Hellwig " 0x%02x\n", cmd->se_tfo->get_fabric_name(), 10779b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->data_length, size, cmd->t_task_cdb[0]); 10789b3b804101db067c3889948f57031f852186ea11Christoph Hellwig 10799b3b804101db067c3889948f57031f852186ea11Christoph Hellwig if (cmd->data_direction == DMA_TO_DEVICE) { 10809b3b804101db067c3889948f57031f852186ea11Christoph Hellwig pr_err("Rejecting underflow/overflow" 10819b3b804101db067c3889948f57031f852186ea11Christoph Hellwig " WRITE data\n"); 1082de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_INVALID_CDB_FIELD; 10839b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } 10849b3b804101db067c3889948f57031f852186ea11Christoph Hellwig /* 10859b3b804101db067c3889948f57031f852186ea11Christoph Hellwig * Reject READ_* or WRITE_* with overflow/underflow for 10869b3b804101db067c3889948f57031f852186ea11Christoph Hellwig * type SCF_SCSI_DATA_CDB. 10879b3b804101db067c3889948f57031f852186ea11Christoph Hellwig */ 10880fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig if (dev->dev_attrib.block_size != 512) { 10899b3b804101db067c3889948f57031f852186ea11Christoph Hellwig pr_err("Failing OVERFLOW/UNDERFLOW for LBA op" 10909b3b804101db067c3889948f57031f852186ea11Christoph Hellwig " CDB on non 512-byte sector setup subsystem" 10919b3b804101db067c3889948f57031f852186ea11Christoph Hellwig " plugin: %s\n", dev->transport->name); 10929b3b804101db067c3889948f57031f852186ea11Christoph Hellwig /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ 1093de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_INVALID_CDB_FIELD; 10949b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } 10954c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger /* 10964c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger * For the overflow case keep the existing fabric provided 10974c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger * ->data_length. Otherwise for the underflow case, reset 10984c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger * ->data_length to the smaller SCSI expected data transfer 10994c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger * length. 11004c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger */ 11019b3b804101db067c3889948f57031f852186ea11Christoph Hellwig if (size > cmd->data_length) { 11029b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; 11039b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->residual_count = (size - cmd->data_length); 11049b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } else { 11059b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; 11069b3b804101db067c3889948f57031f852186ea11Christoph Hellwig cmd->residual_count = (cmd->data_length - size); 11074c054ba63ad47ef244cfcfa1cea38134620a5baeNicholas Bellinger cmd->data_length = size; 11089b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } 11099b3b804101db067c3889948f57031f852186ea11Christoph Hellwig } 11109b3b804101db067c3889948f57031f852186ea11Christoph Hellwig 11119b3b804101db067c3889948f57031f852186ea11Christoph Hellwig return 0; 11129b3b804101db067c3889948f57031f852186ea11Christoph Hellwig 11139b3b804101db067c3889948f57031f852186ea11Christoph Hellwig} 11149b3b804101db067c3889948f57031f852186ea11Christoph Hellwig 1115c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 1116c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Used by fabric modules containing a local struct se_cmd within their 1117c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * fabric dependent per I/O descriptor. 1118c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1119c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_init_se_cmd( 1120c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_cmd *cmd, 1121c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct target_core_fabric_ops *tfo, 1122c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_session *se_sess, 1123c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u32 data_length, 1124c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int data_direction, 1125c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int task_attr, 1126c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *sense_buffer) 1127c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 11285951146dea1ac8ff2f177477c907084d63913cadAndy Grover INIT_LIST_HEAD(&cmd->se_delayed_node); 112907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger INIT_LIST_HEAD(&cmd->se_qf_node); 1130a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger INIT_LIST_HEAD(&cmd->se_cmd_list); 1131cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig INIT_LIST_HEAD(&cmd->state_list); 1132a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover init_completion(&cmd->t_transport_stop_comp); 1133a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger init_completion(&cmd->cmd_wait_comp); 1134cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig init_completion(&cmd->task_stop_comp); 1135a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_init(&cmd->t_state_lock); 11361e1110c43b1cda9fe77fc4a04835e460550e6b3cMikulas Patocka kref_init(&cmd->cmd_kref); 11377d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig cmd->transport_state = CMD_T_DEV_ACTIVE; 1138c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1139c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_tfo = tfo; 1140c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_sess = se_sess; 1141c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->data_length = data_length; 1142c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->data_direction = data_direction; 1143c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->sam_task_attr = task_attr; 1144c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->sense_buffer = sense_buffer; 1145cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig 1146cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->state_active = false; 1147c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1148c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_init_se_cmd); 1149c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1150de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigstatic sense_reason_t 1151de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtransport_check_alloc_task_attr(struct se_cmd *cmd) 1152c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 1153019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig struct se_device *dev = cmd->se_dev; 1154019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1155c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1156c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Check if SAM Task Attribute emulation is enabled for this 1157c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * struct se_device storage object 1158c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1159019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) 1160c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 1161c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1162e66ecd505addaaf40e7d352796ba8d344f6359ddNicholas Bellinger if (cmd->sam_task_attr == MSG_ACA_TAG) { 11636708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("SAM Task Attribute ACA" 1164c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " emulation is not supported\n"); 1165de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_INVALID_CDB_FIELD; 1166c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1167c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1168c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Used to determine when ORDERED commands should go from 1169c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Dormant to Active status. 1170c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1171019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig cmd->se_ordered_id = atomic_inc_return(&dev->dev_ordered_id); 11726708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Allocated se_ordered_id: %u for Task Attr: 0x%02x on %s\n", 1173c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_ordered_id, cmd->sam_task_attr, 1174019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig dev->transport->name); 1175c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 1176c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1177c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1178de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigsense_reason_t 1179de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtarget_setup_cmd_from_cdb(struct se_cmd *cmd, unsigned char *cdb) 1180c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 11810fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig struct se_device *dev = cmd->se_dev; 1182de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t ret; 1183c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1184c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1185c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Ensure that the received CDB is less than the max (252 + 8) bytes 1186c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * for VARIABLE_LENGTH_CMD 1187c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1188c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (scsi_command_size(cdb) > SCSI_MAX_VARLEN_CDB_SIZE) { 11896708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Received SCSI CDB with command_size: %d that" 1190c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n", 1191c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger scsi_command_size(cdb), SCSI_MAX_VARLEN_CDB_SIZE); 1192de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_INVALID_CDB_FIELD; 1193c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1194c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1195c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If the received CDB is larger than TCM_MAX_COMMAND_SIZE, 1196c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * allocate the additional extended CDB buffer now.. Otherwise 1197c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * setup the pointer from __t_task_cdb to t_task_cdb. 1198c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1199a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover if (scsi_command_size(cdb) > sizeof(cmd->__t_task_cdb)) { 1200a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover cmd->t_task_cdb = kzalloc(scsi_command_size(cdb), 1201c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger GFP_KERNEL); 12026708bb27bb2703da238f21f516034263348af5beAndy Grover if (!cmd->t_task_cdb) { 12036708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to allocate cmd->t_task_cdb" 1204a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover " %u > sizeof(cmd->__t_task_cdb): %lu ops\n", 1205c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger scsi_command_size(cdb), 1206a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover (unsigned long)sizeof(cmd->__t_task_cdb)); 1207de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_OUT_OF_RESOURCES; 1208c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1209c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } else 1210a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover cmd->t_task_cdb = &cmd->__t_task_cdb[0]; 1211c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1212a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover * Copy the original CDB into cmd-> 1213c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1214a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover memcpy(cmd->t_task_cdb, cdb, scsi_command_size(cdb)); 1215cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 1216e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_sequencer_start(cmd); 1217e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier 1218cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig /* 1219cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig * Check for an existing UNIT ATTENTION condition 1220cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig */ 1221de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig ret = target_scsi3_ua_check(cmd); 1222de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1223de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return ret; 1224cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 1225c87fbd5656f263f0fc1c37d20f402797c068232eChristoph Hellwig ret = target_alua_state_check(cmd); 1226de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1227de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return ret; 1228cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 1229d977f4377fbc396b888e12fdb3b13118b09ca7dbChristoph Hellwig ret = target_check_reservation(cmd); 1230f85eda8d75d37a3796cee7f5a906e50e3f13d9e1Nicholas Bellinger if (ret) { 1231f85eda8d75d37a3796cee7f5a906e50e3f13d9e1Nicholas Bellinger cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; 1232d977f4377fbc396b888e12fdb3b13118b09ca7dbChristoph Hellwig return ret; 1233f85eda8d75d37a3796cee7f5a906e50e3f13d9e1Nicholas Bellinger } 1234cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 12350fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig ret = dev->transport->parse_cdb(cmd); 1236de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1237de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return ret; 1238de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 1239de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig ret = transport_check_alloc_task_attr(cmd); 1240de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1241c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return ret; 1242cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 1243cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig cmd->se_cmd_flags |= SCF_SUPPORTED_SAM_OPCODE; 1244cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 1245c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&cmd->se_lun->lun_sep_lock); 1246c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (cmd->se_lun->lun_sep) 1247c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_lun->lun_sep->sep_stats.cmd_pdus++; 1248c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&cmd->se_lun->lun_sep_lock); 1249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 1250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1251a12f41f8412ff57057906ebbe146fda37db158acAndy GroverEXPORT_SYMBOL(target_setup_cmd_from_cdb); 1252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1253c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 1254695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger * Used by fabric module frontends to queue tasks directly. 1255695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger * Many only be used from process context only 1256695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger */ 1257695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellingerint transport_handle_cdb_direct( 1258695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger struct se_cmd *cmd) 1259695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger{ 1260de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t ret; 1261dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger 1262695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger if (!cmd->se_lun) { 1263695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger dump_stack(); 12646708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("cmd->se_lun is NULL\n"); 1265695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger return -EINVAL; 1266695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger } 1267695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger if (in_interrupt()) { 1268695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger dump_stack(); 12696708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("transport_generic_handle_cdb cannot be called" 1270695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger " from interrupt context\n"); 1271695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger return -EINVAL; 1272695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger } 1273dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger /* 1274af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig * Set TRANSPORT_NEW_CMD state and CMD_T_ACTIVE to ensure that 1275af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig * outstanding descriptors are handled correctly during shutdown via 1276af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig * transport_wait_for_tasks() 1277dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * 1278dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * Also, we don't take cmd->t_state_lock here as we only expect 1279dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * this to be called for initial descriptor submission. 1280dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger */ 1281dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger cmd->t_state = TRANSPORT_NEW_CMD; 12827d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig cmd->transport_state |= CMD_T_ACTIVE; 12837d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig 1284dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger /* 1285dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * transport_generic_new_cmd() is already handling QUEUE_FULL, 1286dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * so follow TRANSPORT_NEW_CMD processing thread context usage 1287dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger * and call transport_generic_request_failure() if necessary.. 1288dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger */ 1289dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger ret = transport_generic_new_cmd(cmd); 1290de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1291de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig transport_generic_request_failure(cmd, ret); 1292dd8ae59d48790d5c25f47ebbe502c8ca379fdde0Nicholas Bellinger return 0; 1293695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger} 1294695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas BellingerEXPORT_SYMBOL(transport_handle_cdb_direct); 1295695434e1cbd57f404110bf4ab187a5127ffd79bbNicholas Bellinger 1296c5ff8d6bc3ebc363d77d71791080fefb07ae9017Nicholas Bellingersense_reason_t 1297de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtransport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *sgl, 1298de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig u32 sgl_count, struct scatterlist *sgl_bidi, u32 sgl_bidi_count) 1299de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig{ 1300de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (!sgl || !sgl_count) 1301de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return 0; 1302de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 1303de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig /* 1304de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig * Reject SCSI data overflow with map_mem_to_cmd() as incoming 1305de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig * scatterlists already have been set to follow what the fabric 1306de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig * passes for the original expected data transfer length. 1307de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig */ 1308de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { 1309de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig pr_warn("Rejecting SCSI DATA overflow for fabric using" 1310de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig " SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC\n"); 1311de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_INVALID_CDB_FIELD; 1312de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig } 1313de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 1314de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_data_sg = sgl; 1315de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_data_nents = sgl_count; 1316de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 1317de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (sgl_bidi && sgl_bidi_count) { 1318de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_bidi_data_sg = sgl_bidi; 1319de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_bidi_data_nents = sgl_bidi_count; 1320de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig } 1321de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC; 1322de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return 0; 1323de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig} 1324de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 1325a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger/* 1326a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * target_submit_cmd_map_sgls - lookup unpacked lun and submit uninitialized 1327a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * se_cmd + use pre-allocated SGL memory. 1328a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * 1329a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @se_cmd: command descriptor to submit 1330a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @se_sess: associated se_sess for endpoint 1331a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @cdb: pointer to SCSI CDB 1332a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @sense: pointer to SCSI sense buffer 1333a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @unpacked_lun: unpacked LUN to reference for struct se_lun 1334a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @data_length: fabric expected data transfer length 1335a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @task_addr: SAM task attribute 1336a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @data_dir: DMA data direction 1337a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @flags: flags for command submission from target_sc_flags_tables 1338a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @sgl: struct scatterlist memory for unidirectional mapping 1339a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @sgl_count: scatterlist count for unidirectional mapping 1340a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @sgl_bidi: struct scatterlist memory for bidirectional READ mapping 1341a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @sgl_bidi_count: scatterlist count for bidirectional READ mapping 1342def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger * @sgl_prot: struct scatterlist memory protection information 1343def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger * @sgl_prot_count: scatterlist count for protection information 1344a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * 1345d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier * Returns non zero to signal active I/O shutdown failure. All other 1346d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier * setup exceptions will be returned as a SCSI CHECK_CONDITION response, 1347d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier * but still return zero here. 1348d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier * 1349a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * This may only be called from process context, and also currently 1350a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * assumes internal allocation of fabric payload buffer by target-core. 1351a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger */ 1352a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellingerint target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess, 1353a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger unsigned char *cdb, unsigned char *sense, u32 unpacked_lun, 1354a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger u32 data_length, int task_attr, int data_dir, int flags, 1355a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger struct scatterlist *sgl, u32 sgl_count, 1356def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger struct scatterlist *sgl_bidi, u32 sgl_bidi_count, 1357def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger struct scatterlist *sgl_prot, u32 sgl_prot_count) 1358a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger{ 1359a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger struct se_portal_group *se_tpg; 1360de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t rc; 1361de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig int ret; 1362a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger 1363a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger se_tpg = se_sess->se_tpg; 1364a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger BUG_ON(!se_tpg); 1365a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger BUG_ON(se_cmd->se_tfo || se_cmd->se_sess); 1366a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger BUG_ON(in_interrupt()); 1367a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger /* 1368a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * Initialize se_cmd for target operation. From this point 1369a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * exceptions are handled by sending exception status via 1370a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * target_core_fabric_ops->queue_status() callback 1371a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger */ 1372a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, 1373a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger data_length, data_dir, task_attr, sense); 1374b0d7994660af1601cc26ef7ab748569fdb9c253bSebastian Andrzej Siewior if (flags & TARGET_SCF_UNKNOWN_SIZE) 1375b0d7994660af1601cc26ef7ab748569fdb9c253bSebastian Andrzej Siewior se_cmd->unknown_data_length = 1; 1376a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger /* 1377a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * Obtain struct se_cmd->cmd_kref reference and add new cmd to 1378a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * se_sess->sess_cmd_list. A second kref_get here is necessary 1379a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * for fabrics using TARGET_SCF_ACK_KREF that expect a second 1380a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * kref_put() to happen during fabric packet acknowledgement. 1381a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger */ 1382de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig ret = target_get_sess_cmd(se_sess, se_cmd, (flags & TARGET_SCF_ACK_KREF)); 1383de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) 1384de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return ret; 1385a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger /* 1386a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * Signal bidirectional data payloads to target-core 1387a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger */ 1388a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger if (flags & TARGET_SCF_BIDI_OP) 1389a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger se_cmd->se_cmd_flags |= SCF_BIDI; 1390a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger /* 1391a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * Locate se_lun pointer and attach it to struct se_cmd 1392a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger */ 1393de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig rc = transport_lookup_cmd_lun(se_cmd, unpacked_lun); 1394de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (rc) { 1395de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig transport_send_check_condition_and_sense(se_cmd, rc, 0); 1396735703cac08f34a197e1c6331ca9adc8a52d6046Nicholas Bellinger target_put_sess_cmd(se_sess, se_cmd); 1397d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier return 0; 1398735703cac08f34a197e1c6331ca9adc8a52d6046Nicholas Bellinger } 1399b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg 1400b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg rc = target_setup_cmd_from_cdb(se_cmd, cdb); 1401b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg if (rc != 0) { 1402b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg transport_generic_request_failure(se_cmd, rc); 1403b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg return 0; 1404b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg } 1405b5b8e2989e3406798dbb88fbb4eaafbbf1a56f6aSagi Grimberg 1406def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger /* 1407def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger * Save pointers for SGLs containing protection information, 1408def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger * if present. 1409def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger */ 1410def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger if (sgl_prot_count) { 1411def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger se_cmd->t_prot_sg = sgl_prot; 1412def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger se_cmd->t_prot_nents = sgl_prot_count; 1413def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger } 1414d6e0175cf3f9737a760482d185bb73566bcc9331Christoph Hellwig 1415a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger /* 1416a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * When a non zero sgl_count has been passed perform SGL passthrough 1417a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * mapping for pre-allocated fabric memory instead of having target 1418a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * core perform an internal SGL allocation.. 1419a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger */ 1420a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger if (sgl_count != 0) { 1421a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger BUG_ON(!sgl); 1422a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger 1423944981c7e106af2aa004847e9177497856630980Nicholas Bellinger /* 1424944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * A work-around for tcm_loop as some userspace code via 1425944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * scsi-generic do not memset their associated read buffers, 1426944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * so go ahead and do that here for type non-data CDBs. Also 1427944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * note that this is currently guaranteed to be a single SGL 1428944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * for this case by target core in target_setup_cmd_from_cdb() 1429944981c7e106af2aa004847e9177497856630980Nicholas Bellinger * -> transport_generic_cmd_sequencer(). 1430944981c7e106af2aa004847e9177497856630980Nicholas Bellinger */ 1431944981c7e106af2aa004847e9177497856630980Nicholas Bellinger if (!(se_cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) && 1432944981c7e106af2aa004847e9177497856630980Nicholas Bellinger se_cmd->data_direction == DMA_FROM_DEVICE) { 1433944981c7e106af2aa004847e9177497856630980Nicholas Bellinger unsigned char *buf = NULL; 1434944981c7e106af2aa004847e9177497856630980Nicholas Bellinger 1435944981c7e106af2aa004847e9177497856630980Nicholas Bellinger if (sgl) 1436944981c7e106af2aa004847e9177497856630980Nicholas Bellinger buf = kmap(sg_page(sgl)) + sgl->offset; 1437944981c7e106af2aa004847e9177497856630980Nicholas Bellinger 1438944981c7e106af2aa004847e9177497856630980Nicholas Bellinger if (buf) { 1439944981c7e106af2aa004847e9177497856630980Nicholas Bellinger memset(buf, 0, sgl->length); 1440944981c7e106af2aa004847e9177497856630980Nicholas Bellinger kunmap(sg_page(sgl)); 1441944981c7e106af2aa004847e9177497856630980Nicholas Bellinger } 1442944981c7e106af2aa004847e9177497856630980Nicholas Bellinger } 1443944981c7e106af2aa004847e9177497856630980Nicholas Bellinger 1444a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger rc = transport_generic_map_mem_to_cmd(se_cmd, sgl, sgl_count, 1445a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger sgl_bidi, sgl_bidi_count); 1446a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger if (rc != 0) { 1447de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig transport_generic_request_failure(se_cmd, rc); 1448a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger return 0; 1449a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger } 1450a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger } 1451def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger 145211e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover /* 145311e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover * Check if we need to delay processing because of ALUA 145411e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover * Active/NonOptimized primary access state.. 145511e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover */ 145611e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover core_alua_check_nonop_delay(se_cmd); 145711e319ed95dc0e8f0fa4cad88b33152e9203b262Andy Grover 1458a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger transport_handle_cdb_direct(se_cmd); 1459d6dfc868bcf329392abd1ecfa7357eb51ebf8c30Roland Dreier return 0; 1460a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger} 1461a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas BellingerEXPORT_SYMBOL(target_submit_cmd_map_sgls); 1462a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger 1463a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger/* 1464a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * target_submit_cmd - lookup unpacked lun and submit uninitialized se_cmd 1465a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * 1466a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @se_cmd: command descriptor to submit 1467a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @se_sess: associated se_sess for endpoint 1468a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @cdb: pointer to SCSI CDB 1469a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @sense: pointer to SCSI sense buffer 1470a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @unpacked_lun: unpacked LUN to reference for struct se_lun 1471a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @data_length: fabric expected data transfer length 1472a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @task_addr: SAM task attribute 1473a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @data_dir: DMA data direction 1474a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * @flags: flags for command submission from target_sc_flags_tables 1475a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * 1476a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * Returns non zero to signal active I/O shutdown failure. All other 1477a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * setup exceptions will be returned as a SCSI CHECK_CONDITION response, 1478a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * but still return zero here. 1479a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * 1480a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * This may only be called from process context, and also currently 1481a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * assumes internal allocation of fabric payload buffer by target-core. 1482a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * 1483a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger * It also assumes interal target core SGL memory allocation. 1484a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger */ 1485a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellingerint target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, 1486a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger unsigned char *cdb, unsigned char *sense, u32 unpacked_lun, 1487a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger u32 data_length, int task_attr, int data_dir, int flags) 1488a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger{ 1489a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger return target_submit_cmd_map_sgls(se_cmd, se_sess, cdb, sense, 1490a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger unpacked_lun, data_length, task_attr, data_dir, 1491def2b339b422070ecb99298a80e4b15033adc0ceNicholas Bellinger flags, NULL, 0, NULL, 0, NULL, 0); 1492a026757ff56365b4aa3875c14f1bd5733e0e8bb2Nicholas Bellinger} 1493a63607855224702ea17e6016ecf3f7d544e83625Nicholas BellingerEXPORT_SYMBOL(target_submit_cmd); 1494a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger 14959f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellingerstatic void target_complete_tmr_failure(struct work_struct *work) 14969f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger{ 14979f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger struct se_cmd *se_cmd = container_of(work, struct se_cmd, work); 14989f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger 14999f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; 15009f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger se_cmd->se_tfo->queue_tm_rsp(se_cmd); 15015a3b6fc0092c5f8dee7820064ee54d2631d48573Roland Dreier 15025a3b6fc0092c5f8dee7820064ee54d2631d48573Roland Dreier transport_cmd_check_stop_to_fabric(se_cmd); 15039f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger} 15049f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger 1505ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover/** 1506ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * target_submit_tmr - lookup unpacked lun and submit uninitialized se_cmd 1507ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * for TMR CDBs 1508ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * 1509ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @se_cmd: command descriptor to submit 1510ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @se_sess: associated se_sess for endpoint 1511ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @sense: pointer to SCSI sense buffer 1512ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @unpacked_lun: unpacked LUN to reference for struct se_lun 1513ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @fabric_context: fabric context for TMR req 1514ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * @tm_type: Type of TM request 1515c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger * @gfp: gfp type for caller 1516c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger * @tag: referenced task tag for TMR_ABORT_TASK 1517c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger * @flags: submit cmd flags 1518ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * 1519ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover * Callable from all contexts. 1520ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover **/ 1521ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1522c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellingerint target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess, 1523ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover unsigned char *sense, u32 unpacked_lun, 1524c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger void *fabric_tmr_ptr, unsigned char tm_type, 1525c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger gfp_t gfp, unsigned int tag, int flags) 1526ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover{ 1527ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover struct se_portal_group *se_tpg; 1528ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover int ret; 1529ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1530ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover se_tpg = se_sess->se_tpg; 1531ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover BUG_ON(!se_tpg); 1532ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1533ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, 1534ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 0, DMA_NONE, MSG_SIMPLE_TAG, sense); 1535c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger /* 1536c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger * FIXME: Currently expect caller to handle se_cmd->se_tmr_req 1537c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger * allocation failure. 1538c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger */ 1539c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger ret = core_tmr_alloc_req(se_cmd, fabric_tmr_ptr, tm_type, gfp); 1540c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger if (ret < 0) 1541c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger return -ENOMEM; 1542ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1543c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger if (tm_type == TMR_ABORT_TASK) 1544c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger se_cmd->se_tmr_req->ref_task_tag = tag; 1545c0974f89385970455a60a999ae4fc0a783cf458dNicholas Bellinger 1546ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover /* See target_submit_cmd for commentary */ 1547bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier ret = target_get_sess_cmd(se_sess, se_cmd, (flags & TARGET_SCF_ACK_KREF)); 1548bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier if (ret) { 1549bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier core_tmr_release_req(se_cmd->se_tmr_req); 1550bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier return ret; 1551bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier } 1552ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1553ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover ret = transport_lookup_tmr_lun(se_cmd, unpacked_lun); 1554ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover if (ret) { 15559f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger /* 15569f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger * For callback during failure handling, push this work off 15579f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger * to process context with TMR_LUN_DOES_NOT_EXIST status. 15589f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger */ 15599f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger INIT_WORK(&se_cmd->work, target_complete_tmr_failure); 15609f0d05c2c6185d7b5ba08a6c052e90837101031fNicholas Bellinger schedule_work(&se_cmd->work); 1561c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger return 0; 1562ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover } 1563ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover transport_generic_handle_tmr(se_cmd); 1564c7042cae58c13970f39c0820a3aab2a13dda9fe1Nicholas Bellinger return 0; 1565ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover} 1566ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy GroverEXPORT_SYMBOL(target_submit_tmr); 1567ea98d7f9c7cc38de55f81a1c249112442b93c7c9Andy Grover 1568cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig/* 1569cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig * If the cmd is active, request it to be stopped and sleep until it 1570cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig * has completed. 1571cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig */ 1572cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwigbool target_stop_cmd(struct se_cmd *cmd, unsigned long *flags) 1573cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig{ 1574cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig bool was_active = false; 1575cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig 1576cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig if (cmd->transport_state & CMD_T_BUSY) { 1577cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->transport_state |= CMD_T_REQUEST_STOP; 1578cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig spin_unlock_irqrestore(&cmd->t_state_lock, *flags); 1579cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig 1580cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig pr_debug("cmd %p waiting to complete\n", cmd); 1581cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig wait_for_completion(&cmd->task_stop_comp); 1582cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig pr_debug("cmd %p stopped successfully\n", cmd); 1583cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig 1584cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig spin_lock_irqsave(&cmd->t_state_lock, *flags); 1585cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->transport_state &= ~CMD_T_REQUEST_STOP; 1586cf572a9627c9ae86082216de109780c1d2e2ee28Christoph Hellwig cmd->transport_state &= ~CMD_T_BUSY; 1587cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig was_active = true; 1588cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig } 1589cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig 1590cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig return was_active; 1591cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig} 1592cdbb70bb4c17dad0ee23a357030021892a0f60f0Christoph Hellwig 1593c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 1594c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Handle SAM-esque emulation for generic transport request failures. 1595c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1596de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigvoid transport_generic_request_failure(struct se_cmd *cmd, 1597de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t sense_reason) 1598c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 159907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger int ret = 0; 160007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 16016708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("-----[ Storage Engine Exception for cmd: %p ITT: 0x%08x" 1602e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover " CDB: 0x%02x\n", cmd, cmd->se_tfo->get_task_tag(cmd), 1603a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover cmd->t_task_cdb[0]); 1604de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig pr_debug("-----[ i_state: %d t_state: %d sense_reason: %d\n", 1605e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->get_cmd_state(cmd), 1606de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_state, sense_reason); 1607d43d6aea844e66b847e3a0e5cb2c24b6ba84908aChristoph Hellwig pr_debug("-----[ CMD_T_ACTIVE: %d CMD_T_STOP: %d CMD_T_SENT: %d\n", 16087d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig (cmd->transport_state & CMD_T_ACTIVE) != 0, 16097d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig (cmd->transport_state & CMD_T_STOP) != 0, 16107d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig (cmd->transport_state & CMD_T_SENT) != 0); 1611c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1612c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1613c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For SAM Task Attribute emulation for failed struct se_cmd 1614c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1615019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig transport_complete_task_attr(cmd); 1616cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger /* 1617cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger * Handle special case for COMPARE_AND_WRITE failure, where the 1618cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger * callback is expected to drop the per device ->caw_mutex. 1619cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger */ 1620cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger if ((cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) && 1621cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger cmd->transport_complete_callback) 1622cf6d1f0964fa9db57fc660caf51939d7a03359a1Nicholas Bellinger cmd->transport_complete_callback(cmd); 1623c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1624de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig switch (sense_reason) { 162503e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_NON_EXISTENT_LUN: 162603e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_UNSUPPORTED_SCSI_OPCODE: 162703e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_INVALID_CDB_FIELD: 162803e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_INVALID_PARAMETER_LIST: 1629bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier case TCM_PARAMETER_LIST_LENGTH_ERROR: 163003e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 163103e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_UNKNOWN_MODE_PAGE: 163203e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_WRITE_PROTECTED: 1633e2397c704429025bc6b331a970f699e52f34283eRoland Dreier case TCM_ADDRESS_OUT_OF_RANGE: 163403e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_CHECK_CONDITION_ABORT_CMD: 163503e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_CHECK_CONDITION_UNIT_ATTENTION: 163603e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_CHECK_CONDITION_NOT_READY: 163794387aa7cec8c5386b405b852cf3e5be38456fc7Nicholas Bellinger case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: 163894387aa7cec8c5386b405b852cf3e5be38456fc7Nicholas Bellinger case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: 163994387aa7cec8c5386b405b852cf3e5be38456fc7Nicholas Bellinger case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: 1640c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1641de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig case TCM_OUT_OF_RESOURCES: 1642de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 1643de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig break; 164403e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger case TCM_RESERVATION_CONFLICT: 1645c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1646c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * No SENSE Data payload for this case, set SCSI Status 1647c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * and queue the response to $FABRIC_MOD. 1648c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 1649c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Uses linux/include/scsi/scsi.h SAM status codes defs 1650c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1651c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT; 1652c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1653c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For UA Interlock Code 11b, a RESERVATION CONFLICT will 1654c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * establish a UNIT ATTENTION with PREVIOUS RESERVATION 1655c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * CONFLICT STATUS. 1656c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 1657c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * See spc4r17, section 7.4.6 Control Mode Page, Table 349 1658c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1659e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (cmd->se_sess && 16600fd97ccf45be26fb01b3a412f1f6c6b5044b2f16Christoph Hellwig cmd->se_dev->dev_attrib.emulate_ua_intlck_ctrl == 2) 1661e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover core_scsi3_ua_allocate(cmd->se_sess->se_node_acl, 1662c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->orig_fe_lun, 0x2C, 1663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS); 1664c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1665e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 1666e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier ret = cmd->se_tfo-> queue_status(cmd); 1667f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 166807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger goto queue_full; 1669c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger goto check_stop; 1670c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 16716708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unknown transport error for CDB 0x%02x: %d\n", 1672de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->t_task_cdb[0], sense_reason); 1673de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; 1674c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 1675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1676f314643751450a582c1ca40a54558240ef7cd4bfChristoph Hellwig 1677de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig ret = transport_send_check_condition_and_sense(cmd, sense_reason, 0); 167803e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 167903e98c9eb916f3f0868c1dc344dde2a60287ff72Nicholas Bellinger goto queue_full; 168007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 1681c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingercheck_stop: 1682c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_lun_remove_cmd(cmd); 16836708bb27bb2703da238f21f516034263348af5beAndy Grover if (!transport_cmd_check_stop_to_fabric(cmd)) 1684c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ; 168507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger return; 168607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 168707bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellingerqueue_full: 1688e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig cmd->t_state = TRANSPORT_COMPLETE_QF_OK; 1689e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_handle_queue_full(cmd, cmd->se_dev); 1690c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 16912fbff1276bb635294b3384b6c167f72d0acdab95Nicholas BellingerEXPORT_SYMBOL(transport_generic_request_failure); 1692c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 169376dde50ebef75773ea2b68e0bf914e87e6a3711cNicholas Bellingervoid __target_execute_cmd(struct se_cmd *cmd) 1694c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 1695de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t ret; 16965f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1697de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (cmd->execute_cmd) { 1698de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig ret = cmd->execute_cmd(cmd); 1699de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (ret) { 1700de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig spin_lock_irq(&cmd->t_state_lock); 1701de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig cmd->transport_state &= ~(CMD_T_BUSY|CMD_T_SENT); 1702de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig spin_unlock_irq(&cmd->t_state_lock); 17035f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1704de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig transport_generic_request_failure(cmd, ret); 1705de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig } 17065f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig } 17075f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig} 17085f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1709019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwigstatic bool target_handle_task_attr(struct se_cmd *cmd) 17105f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig{ 17115f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig struct se_device *dev = cmd->se_dev; 17125f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1713019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) 1714019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return false; 17155f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1716c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 171725985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * Check for the existence of HEAD_OF_QUEUE, and if true return 1 1718c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * to allow the passed struct se_cmd list of tasks to the front of the list. 1719c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 17205f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig switch (cmd->sam_task_attr) { 17215f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig case MSG_HEAD_TAG: 17225f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig pr_debug("Added HEAD_OF_QUEUE for CDB: 0x%02x, " 17235f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig "se_ordered_id: %u\n", 17245f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig cmd->t_task_cdb[0], cmd->se_ordered_id); 1725019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return false; 17265f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig case MSG_ORDERED_TAG: 172733940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_inc_mb(&dev->dev_ordered_sync); 1728c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 17295f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig pr_debug("Added ORDERED for CDB: 0x%02x to ordered list, " 17305f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig " se_ordered_id: %u\n", 17315f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig cmd->t_task_cdb[0], cmd->se_ordered_id); 17325f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1733c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 17345f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig * Execute an ORDERED command if no other older commands 17355f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig * exist that need to be completed first. 1736c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 17375f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig if (!atomic_read(&dev->simple_cmds)) 1738019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return false; 17395f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig break; 17405f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig default: 1741c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1742c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * For SIMPLE and UNTAGGED Task Attribute commands 1743c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 174433940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_inc_mb(&dev->simple_cmds); 17455f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig break; 1746c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 17475f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 1748019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig if (atomic_read(&dev->dev_ordered_sync) == 0) 1749019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return false; 1750c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1751019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig spin_lock(&dev->delayed_cmd_lock); 1752019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig list_add_tail(&cmd->se_delayed_node, &dev->delayed_cmd_list); 1753019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig spin_unlock(&dev->delayed_cmd_lock); 1754019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1755019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig pr_debug("Added CDB: 0x%02x Task Attr: 0x%02x to" 1756019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig " delayed CMD list, se_ordered_id: %u\n", 1757019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig cmd->t_task_cdb[0], cmd->sam_task_attr, 1758019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig cmd->se_ordered_id); 1759019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return true; 1760019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig} 1761019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1762019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwigvoid target_execute_cmd(struct se_cmd *cmd) 1763019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig{ 1764019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig /* 1765019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig * If the received CDB has aleady been aborted stop processing it here. 1766019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig */ 17674a9a6c8d538eff6d627fa14409c7c25aff652541Nicholas Bellinger if (transport_check_aborted_status(cmd, 1)) 17685f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig return; 1769c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1770c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1771019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig * Determine if frontend context caller is requesting the stopping of 1772019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig * this command for frontend exceptions. 1773019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig */ 17744a9a6c8d538eff6d627fa14409c7c25aff652541Nicholas Bellinger spin_lock_irq(&cmd->t_state_lock); 1775019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig if (cmd->transport_state & CMD_T_STOP) { 1776019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig pr_debug("%s:%d CMD_T_STOP for ITT: 0x%08x\n", 1777019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig __func__, __LINE__, 1778019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig cmd->se_tfo->get_task_tag(cmd)); 1779019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1780019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig spin_unlock_irq(&cmd->t_state_lock); 1781a95d6511303b848da45ee27b35018bb58087bdc6Nicholas Bellinger complete_all(&cmd->t_transport_stop_comp); 1782019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return; 1783019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig } 1784019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1785019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig cmd->t_state = TRANSPORT_PROCESSING; 17861a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger cmd->transport_state |= CMD_T_ACTIVE|CMD_T_BUSY|CMD_T_SENT; 1787019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig spin_unlock_irq(&cmd->t_state_lock); 1788a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger /* 1789a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger * Perform WRITE_INSERT of PI using software emulation when backend 1790a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger * device has PI enabled, if the transport has not already generated 1791a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger * PI using hardware WRITE_INSERT offload. 1792a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger */ 1793a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger if (cmd->prot_op == TARGET_PROT_DOUT_INSERT) { 1794a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger if (!(cmd->se_sess->sup_prot_ops & TARGET_PROT_DOUT_INSERT)) 1795a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger sbc_dif_generate(cmd); 1796a84bf9eedb550e38376008f32fcf0610867d3067Nicholas Bellinger } 1797019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 17981a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger if (target_handle_task_attr(cmd)) { 17991a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger spin_lock_irq(&cmd->t_state_lock); 18001a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger cmd->transport_state &= ~CMD_T_BUSY|CMD_T_SENT; 18011a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger spin_unlock_irq(&cmd->t_state_lock); 18021a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger return; 18031a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger } 18041a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger 18051a398b973184342f30ab97711b9c38fd75df0384Nicholas Bellinger __target_execute_cmd(cmd); 1806c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 180770baf0ab3b2608727515086bee4c484a93e22880Christoph HellwigEXPORT_SYMBOL(target_execute_cmd); 1808c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1809c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger/* 18105f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig * Process all commands up to the last received ORDERED task attribute which 18115f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig * requires another blocking boundary 18125f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig */ 18135f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwigstatic void target_restart_delayed_cmds(struct se_device *dev) 18145f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig{ 18155f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig for (;;) { 18165f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig struct se_cmd *cmd; 18175f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 18185f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig spin_lock(&dev->delayed_cmd_lock); 18195f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig if (list_empty(&dev->delayed_cmd_list)) { 18205f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig spin_unlock(&dev->delayed_cmd_lock); 18215f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig break; 18225f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig } 18235f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 18245f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig cmd = list_entry(dev->delayed_cmd_list.next, 18255f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig struct se_cmd, se_delayed_node); 18265f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig list_del(&cmd->se_delayed_node); 18275f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig spin_unlock(&dev->delayed_cmd_lock); 18285f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 18295f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig __target_execute_cmd(cmd); 18305f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 18315f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig if (cmd->sam_task_attr == MSG_ORDERED_TAG) 18325f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig break; 18335f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig } 18345f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig} 18355f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig 18365f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig/* 183735e0e757537b9239172e35db773dd062727fd612Christoph Hellwig * Called from I/O completion to determine which dormant/delayed 1838c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * and ordered cmds need to have their tasks added to the execution queue. 1839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic void transport_complete_task_attr(struct se_cmd *cmd) 1841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 18425951146dea1ac8ff2f177477c907084d63913cadAndy Grover struct se_device *dev = cmd->se_dev; 1843c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1844019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV) 1845019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig return; 1846019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1847e66ecd505addaaf40e7d352796ba8d344f6359ddNicholas Bellinger if (cmd->sam_task_attr == MSG_SIMPLE_TAG) { 184833940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_dec_mb(&dev->simple_cmds); 1849c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev->dev_cur_ordered_id++; 18506708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Incremented dev->dev_cur_ordered_id: %u for" 1851c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " SIMPLE: %u\n", dev->dev_cur_ordered_id, 1852c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_ordered_id); 1853e66ecd505addaaf40e7d352796ba8d344f6359ddNicholas Bellinger } else if (cmd->sam_task_attr == MSG_HEAD_TAG) { 1854c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev->dev_cur_ordered_id++; 18556708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Incremented dev_cur_ordered_id: %u for" 1856c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " HEAD_OF_QUEUE: %u\n", dev->dev_cur_ordered_id, 1857c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_ordered_id); 1858e66ecd505addaaf40e7d352796ba8d344f6359ddNicholas Bellinger } else if (cmd->sam_task_attr == MSG_ORDERED_TAG) { 185933940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_dec_mb(&dev->dev_ordered_sync); 1860c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1861c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger dev->dev_cur_ordered_id++; 18626708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED:" 1863c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger " %u\n", dev->dev_cur_ordered_id, cmd->se_ordered_id); 1864c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1865c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 18665f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig target_restart_delayed_cmds(dev); 1867c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 1868c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1869e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwigstatic void transport_complete_qf(struct se_cmd *cmd) 187007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger{ 187107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger int ret = 0; 187207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 1873019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig transport_complete_task_attr(cmd); 1874e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig 1875e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) { 1876e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 1877e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig ret = cmd->se_tfo->queue_status(cmd); 1878082f58ac4a48d3f5cb4597232cb2ac6823a96f43Quinn Tran goto out; 1879e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig } 188007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 188107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger switch (cmd->data_direction) { 188207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger case DMA_FROM_DEVICE: 1883e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 188407bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_data_in(cmd); 188507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger break; 188607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger case DMA_TO_DEVICE: 188764577407085b7b117971f2bf35b0ef3ccd9c89f1Nicholas Bellinger if (cmd->se_cmd_flags & SCF_BIDI) { 188807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_data_in(cmd); 188907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger if (ret < 0) 1890e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig break; 189107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger } 189207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger /* Fall through for DMA_TO_DEVICE */ 189307bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger case DMA_NONE: 1894e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 189507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_status(cmd); 189607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger break; 189707bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger default: 189807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger break; 189907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger } 190007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 1901e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwigout: 1902e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig if (ret < 0) { 1903e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_handle_queue_full(cmd, cmd->se_dev); 1904e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig return; 1905e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig } 1906e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_lun_remove_cmd(cmd); 1907e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_cmd_check_stop_to_fabric(cmd); 190807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger} 190907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 191007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellingerstatic void transport_handle_queue_full( 191107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger struct se_cmd *cmd, 1912e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig struct se_device *dev) 191307bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger{ 191407bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger spin_lock_irq(&dev->qf_cmd_lock); 191507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger list_add_tail(&cmd->se_qf_node, &cmd->se_dev->qf_cmd_list); 191633940d09937276cd3c81f2874faf43e37c2db0e2Joern Engel atomic_inc_mb(&dev->dev_qf_count); 191707bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger spin_unlock_irq(&cmd->se_dev->qf_cmd_lock); 191807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 191907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger schedule_work(&cmd->se_dev->qf_work_queue); 192007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger} 192107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 1922bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellingerstatic bool target_check_read_strip(struct se_cmd *cmd) 1923bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger{ 1924bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger sense_reason_t rc; 1925bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger 1926bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger if (!(cmd->se_sess->sup_prot_ops & TARGET_PROT_DIN_STRIP)) { 1927bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger rc = sbc_dif_read_strip(cmd); 1928bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger if (rc) { 1929bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger cmd->pi_err = rc; 1930bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger return true; 1931bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger } 1932bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger } 1933bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger 1934bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger return false; 1935bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger} 1936bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger 193735e0e757537b9239172e35db773dd062727fd612Christoph Hellwigstatic void target_complete_ok_work(struct work_struct *work) 1938c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 193935e0e757537b9239172e35db773dd062727fd612Christoph Hellwig struct se_cmd *cmd = container_of(work, struct se_cmd, work); 194027a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini int ret; 194135e0e757537b9239172e35db773dd062727fd612Christoph Hellwig 1942c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 1943c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Check if we need to move delayed/dormant tasks from cmds on the 1944c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * delayed execution list after a HEAD_OF_QUEUE or ORDERED Task 1945c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Attribute. 1946c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1947019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig transport_complete_task_attr(cmd); 1948019c4ca621488739b1bfb7597a14ac7f0cbcc908Christoph Hellwig 1949c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 195007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger * Check to schedule QUEUE_FULL work, or execute an existing 195107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger * cmd->transport_qf_callback() 195207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger */ 195307bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger if (atomic_read(&cmd->se_dev->dev_qf_count) != 0) 195407bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger schedule_work(&cmd->se_dev->qf_work_queue); 195507bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 195607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger /* 1957d5829eac5f7cfff89c6d1cf11717eee97cf030d0Paolo Bonzini * Check if we need to send a sense buffer from 1958c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * the struct se_cmd in question. 1959c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1960c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) { 196127a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini WARN_ON(!cmd->scsi_status); 196227a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini ret = transport_send_check_condition_and_sense( 196327a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini cmd, 0, 1); 196427a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini if (ret == -EAGAIN || ret == -ENOMEM) 196527a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini goto queue_full; 196627a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini 196727a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini transport_lun_remove_cmd(cmd); 196827a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini transport_cmd_check_stop_to_fabric(cmd); 196927a2709912ac19c755d34c79fe11994b0bf8082bPaolo Bonzini return; 1970c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 1971c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 197225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * Check for a callback, used by amongst other things 1973a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger * XDWRITE_READ_10 and COMPARE_AND_WRITE emulation. 1974c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 1975a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger if (cmd->transport_complete_callback) { 1976a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger sense_reason_t rc; 1977a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger 1978a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger rc = cmd->transport_complete_callback(cmd); 1979a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger if (!rc && !(cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE_POST)) { 1980a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger return; 1981a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger } else if (rc) { 1982a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger ret = transport_send_check_condition_and_sense(cmd, 1983a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger rc, 0); 1984a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 1985a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger goto queue_full; 1986a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger 1987a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger transport_lun_remove_cmd(cmd); 1988a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger transport_cmd_check_stop_to_fabric(cmd); 1989a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger return; 1990a2890087499ae530362139aaf6c120f438e1e679Nicholas Bellinger } 1991a6b0133c19af1ab268ed1f4414efa2782896a870Nicholas Bellinger } 1992c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 1993c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (cmd->data_direction) { 1994c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_FROM_DEVICE: 1995c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&cmd->se_lun->lun_sep_lock); 1996e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (cmd->se_lun->lun_sep) { 1997e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_lun->lun_sep->sep_stats.tx_data_octets += 1998c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->data_length; 1999c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2000c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&cmd->se_lun->lun_sep_lock); 2001bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger /* 2002bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger * Perform READ_STRIP of PI using software emulation when 2003bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger * backend had PI enabled, if the transport will not be 2004bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger * performing hardware READ_STRIP offload. 2005bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger */ 2006bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger if (cmd->prot_op == TARGET_PROT_DIN_STRIP && 2007bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger target_check_read_strip(cmd)) { 2008bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger ret = transport_send_check_condition_and_sense(cmd, 2009bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger cmd->pi_err, 0); 2010bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 2011bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger goto queue_full; 2012bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger 2013bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger transport_lun_remove_cmd(cmd); 2014bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger transport_cmd_check_stop_to_fabric(cmd); 2015bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger return; 2016bc0058695a74c0e9aef8bf9582a096ce4924f690Nicholas Bellinger } 2017c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2018e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 201907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_data_in(cmd); 2020f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 202107bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger goto queue_full; 2022c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2023c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_TO_DEVICE: 2024c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&cmd->se_lun->lun_sep_lock); 2025e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (cmd->se_lun->lun_sep) { 2026e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_lun->lun_sep->sep_stats.rx_data_octets += 2027c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->data_length; 2028c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2029c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&cmd->se_lun->lun_sep_lock); 2030c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2031c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Check if we need to send READ payload for BIDI-COMMAND 2032c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 203364577407085b7b117971f2bf35b0ef3ccd9c89f1Nicholas Bellinger if (cmd->se_cmd_flags & SCF_BIDI) { 2034c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_lock(&cmd->se_lun->lun_sep_lock); 2035e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (cmd->se_lun->lun_sep) { 2036e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_lun->lun_sep->sep_stats.tx_data_octets += 2037c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->data_length; 2038c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2039c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger spin_unlock(&cmd->se_lun->lun_sep_lock); 204007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_data_in(cmd); 2041f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 204207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger goto queue_full; 2043c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2044c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2045c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* Fall through for DMA_TO_DEVICE */ 2046c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case DMA_NONE: 2047e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 204807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger ret = cmd->se_tfo->queue_status(cmd); 2049f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) 205007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger goto queue_full; 2051c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2052c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 2053c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2054c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2055c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2056c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_lun_remove_cmd(cmd); 2057c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_cmd_check_stop_to_fabric(cmd); 205807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger return; 205907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 206007bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellingerqueue_full: 20616708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Handling complete_ok QUEUE_FULL: se_cmd: %p," 206207bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger " data_direction: %d\n", cmd, cmd->data_direction); 2063e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig cmd->t_state = TRANSPORT_COMPLETE_QF_OK; 2064e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_handle_queue_full(cmd, cmd->se_dev); 2065c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2066c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 20676708bb27bb2703da238f21f516034263348af5beAndy Groverstatic inline void transport_free_sgl(struct scatterlist *sgl, int nents) 2068c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2069ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover struct scatterlist *sg; 2070ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover int count; 2071c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 20726708bb27bb2703da238f21f516034263348af5beAndy Grover for_each_sg(sgl, sg, nents, count) 20736708bb27bb2703da238f21f516034263348af5beAndy Grover __free_page(sg_page(sg)); 2074c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 20756708bb27bb2703da238f21f516034263348af5beAndy Grover kfree(sgl); 20766708bb27bb2703da238f21f516034263348af5beAndy Grover} 2077c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 207847e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellingerstatic inline void transport_reset_sgl_orig(struct se_cmd *cmd) 207947e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger{ 208047e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger /* 208147e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger * Check for saved t_data_sg that may be used for COMPARE_AND_WRITE 208247e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger * emulation, and free + reset pointers if necessary.. 208347e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger */ 208447e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger if (!cmd->t_data_sg_orig) 208547e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger return; 208647e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger 208747e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger kfree(cmd->t_data_sg); 208847e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger cmd->t_data_sg = cmd->t_data_sg_orig; 208947e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger cmd->t_data_sg_orig = NULL; 209047e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger cmd->t_data_nents = cmd->t_data_nents_orig; 209147e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger cmd->t_data_nents_orig = 0; 209247e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger} 209347e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger 20946708bb27bb2703da238f21f516034263348af5beAndy Groverstatic inline void transport_free_pages(struct se_cmd *cmd) 20956708bb27bb2703da238f21f516034263348af5beAndy Grover{ 209647e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger if (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) { 209747e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger transport_reset_sgl_orig(cmd); 20986708bb27bb2703da238f21f516034263348af5beAndy Grover return; 209947e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger } 210047e459e622f07c2564e6be8412d75389d2a807b8Nicholas Bellinger transport_reset_sgl_orig(cmd); 21016708bb27bb2703da238f21f516034263348af5beAndy Grover 21026708bb27bb2703da238f21f516034263348af5beAndy Grover transport_free_sgl(cmd->t_data_sg, cmd->t_data_nents); 2103ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover cmd->t_data_sg = NULL; 2104ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover cmd->t_data_nents = 0; 2105c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 21066708bb27bb2703da238f21f516034263348af5beAndy Grover transport_free_sgl(cmd->t_bidi_data_sg, cmd->t_bidi_data_nents); 2107ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover cmd->t_bidi_data_sg = NULL; 2108ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover cmd->t_bidi_data_nents = 0; 2109acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg 2110acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg transport_free_sgl(cmd->t_prot_sg, cmd->t_prot_nents); 2111acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg cmd->t_prot_sg = NULL; 2112acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg cmd->t_prot_nents = 0; 2113c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2114c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2115d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig/** 2116e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig * transport_release_cmd - free a command 2117e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig * @cmd: command to free 2118e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig * 2119e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig * This routine unconditionally frees a command, and reference counting 2120e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig * or list removal must be done in the caller. 2121e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig */ 2122d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellingerstatic int transport_release_cmd(struct se_cmd *cmd) 2123e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig{ 2124e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig BUG_ON(!cmd->se_tfo); 2125e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig 2126c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover if (cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) 2127e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig core_tmr_release_req(cmd->se_tmr_req); 2128e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig if (cmd->t_task_cdb != cmd->__t_task_cdb) 2129e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig kfree(cmd->t_task_cdb); 2130e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig /* 21317481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger * If this cmd has been setup with target_get_sess_cmd(), drop 21327481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger * the kref and call ->release_cmd() in kref callback. 2133e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig */ 2134ca24976ac815aeb17bf1707a96231409c57afac2Nicholas Bellinger return target_put_sess_cmd(cmd->se_sess, cmd); 2135e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig} 2136e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig 2137e26d99aed42ec6cdc9540d19c77ac5d4dd2c5b00Christoph Hellwig/** 2138d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig * transport_put_cmd - release a reference to a command 2139d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig * @cmd: command to release 2140d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig * 2141d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig * This routine releases our reference to the command and frees it if possible. 2142d3df7825aed2e69e12732f9e32ef9093b01302d8Christoph Hellwig */ 2143d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellingerstatic int transport_put_cmd(struct se_cmd *cmd) 2144c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2145c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_free_pages(cmd); 2146d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger return transport_release_cmd(cmd); 2147c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2148c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 21494949314c7283ea4f9ade182ca599583b89f7edd6Andy Grovervoid *transport_kmap_data_sg(struct se_cmd *cmd) 215005d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover{ 2151ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover struct scatterlist *sg = cmd->t_data_sg; 21524949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover struct page **pages; 21534949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover int i; 215405d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover 215505d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover /* 2156ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover * We need to take into account a possible offset here for fabrics like 2157ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover * tcm_loop who may be using a contig buffer from the SCSI midlayer for 2158ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover * control CDBs passed as SGLs via transport_generic_map_mem_to_cmd() 215905d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover */ 21604949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover if (!cmd->t_data_nents) 21614949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return NULL; 21623717ef0c63e90686d959158e9728a13a49229be6Paolo Bonzini 21633717ef0c63e90686d959158e9728a13a49229be6Paolo Bonzini BUG_ON(!sg); 21643717ef0c63e90686d959158e9728a13a49229be6Paolo Bonzini if (cmd->t_data_nents == 1) 21654949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return kmap(sg_page(sg)) + sg->offset; 21664949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover 21674949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover /* >1 page. use vmap */ 21684949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover pages = kmalloc(sizeof(*pages) * cmd->t_data_nents, GFP_KERNEL); 2169de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (!pages) 21704949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return NULL; 21714949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover 21724949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover /* convert sg[] to pages[] */ 21734949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, i) { 21744949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover pages[i] = sg_page(sg); 21754949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover } 21764949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover 21774949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover cmd->t_data_vmap = vmap(pages, cmd->t_data_nents, VM_MAP, PAGE_KERNEL); 21784949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover kfree(pages); 2179de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig if (!cmd->t_data_vmap) 21804949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return NULL; 21814949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover 21824949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return cmd->t_data_vmap + cmd->t_data_sg[0].offset; 218305d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover} 21844949314c7283ea4f9ade182ca599583b89f7edd6Andy GroverEXPORT_SYMBOL(transport_kmap_data_sg); 218505d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover 21864949314c7283ea4f9ade182ca599583b89f7edd6Andy Grovervoid transport_kunmap_data_sg(struct se_cmd *cmd) 218705d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover{ 2188a1edf9cf6d1efed2981fcf6e4caa704fbb1bd093Andy Grover if (!cmd->t_data_nents) { 21894949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover return; 2190a1edf9cf6d1efed2981fcf6e4caa704fbb1bd093Andy Grover } else if (cmd->t_data_nents == 1) { 21914949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover kunmap(sg_page(cmd->t_data_sg)); 2192a1edf9cf6d1efed2981fcf6e4caa704fbb1bd093Andy Grover return; 2193a1edf9cf6d1efed2981fcf6e4caa704fbb1bd093Andy Grover } 21944949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover 21954949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover vunmap(cmd->t_data_vmap); 21964949314c7283ea4f9ade182ca599583b89f7edd6Andy Grover cmd->t_data_vmap = NULL; 219705d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover} 21984949314c7283ea4f9ade182ca599583b89f7edd6Andy GroverEXPORT_SYMBOL(transport_kunmap_data_sg); 219905d1c7c0d0db4cc25548d9aadebb416888a82327Andy Grover 2200c5ff8d6bc3ebc363d77d71791080fefb07ae9017Nicholas Bellingerint 2201200939940e040fa11609956a09c78a5782310c61Nicholas Bellingertarget_alloc_sgl(struct scatterlist **sgl, unsigned int *nents, u32 length, 2202200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger bool zero_page) 2203c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2204200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger struct scatterlist *sg; 2205ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover struct page *page; 2206200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger gfp_t zero_flag = (zero_page) ? __GFP_ZERO : 0; 2207200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger unsigned int nent; 2208ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover int i = 0; 2209c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2210200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger nent = DIV_ROUND_UP(length, PAGE_SIZE); 2211200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger sg = kmalloc(sizeof(struct scatterlist) * nent, GFP_KERNEL); 2212200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger if (!sg) 2213ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover return -ENOMEM; 2214c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2215200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger sg_init_table(sg, nent); 22169db9da332250dbe662995703a4dcdd692112f0c3roland@purestorage.com 2217ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover while (length) { 2218ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover u32 page_len = min_t(u32, length, PAGE_SIZE); 22199db9da332250dbe662995703a4dcdd692112f0c3roland@purestorage.com page = alloc_page(GFP_KERNEL | zero_flag); 2220ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover if (!page) 2221ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover goto out; 2222c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2223200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger sg_set_page(&sg[i], page, page_len, 0); 2224ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover length -= page_len; 2225ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover i++; 2226c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2227200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger *sgl = sg; 2228200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger *nents = nent; 2229c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2230c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2231ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Groverout: 2232d0e27c88d795fb9647153063ec48051fd84e1731Yi Zou while (i > 0) { 2233ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover i--; 2234200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger __free_page(sg_page(&sg[i])); 2235c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2236200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger kfree(sg); 2237ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover return -ENOMEM; 2238c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2239c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2240a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover/* 2241b16a35b050e70c8376250b563785e3038c4b6393Andy Grover * Allocate any required resources to execute the command. For writes we 2242b16a35b050e70c8376250b563785e3038c4b6393Andy Grover * might not have the payload yet, so notify the fabric via a call to 2243b16a35b050e70c8376250b563785e3038c4b6393Andy Grover * ->write_pending instead. Otherwise place it on the execution queue. 2244c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2245de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigsense_reason_t 2246de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtransport_generic_new_cmd(struct se_cmd *cmd) 2247c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2248c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret = 0; 2249c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2250c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2251c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Determine is the TCM fabric module has already allocated physical 2252c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * memory, and is directly calling transport_generic_map_mem_to_cmd() 2253ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover * beforehand. 2254c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2255ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) && 2256ec98f7825c6eaa4a9afb0eb518826efc8a2ed4a2Andy Grover cmd->data_length) { 2257200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger bool zero_flag = !(cmd->se_cmd_flags & SCF_SCSI_DATA_CDB); 2258200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger 22598cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger if ((cmd->se_cmd_flags & SCF_BIDI) || 22608cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE)) { 22618cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger u32 bidi_length; 22628cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger 22638cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger if (cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE) 22648cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger bidi_length = cmd->t_task_nolb * 22658cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger cmd->se_dev->dev_attrib.block_size; 22668cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger else 22678cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger bidi_length = cmd->data_length; 22688cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger 22698cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger ret = target_alloc_sgl(&cmd->t_bidi_data_sg, 22708cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger &cmd->t_bidi_data_nents, 22718cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger bidi_length, zero_flag); 22728cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger if (ret < 0) 22738cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 22748cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger } 22758cefe07b5e9c2b0212ad6809a219e4489807a746Nicholas Bellinger 227619f9361af7dfa0bb1f98c7619544ed71d2dded39Sagi Grimberg if (cmd->prot_op != TARGET_PROT_NORMAL) { 2277acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg ret = target_alloc_sgl(&cmd->t_prot_sg, 2278acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg &cmd->t_prot_nents, 2279acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg cmd->prot_length, true); 2280acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg if (ret < 0) 2281acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 2282acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg } 2283acb2bde3e32100f1ab50e38f0db03660a1cb0a06Sagi Grimberg 2284200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger ret = target_alloc_sgl(&cmd->t_data_sg, &cmd->t_data_nents, 2285200939940e040fa11609956a09c78a5782310c61Nicholas Bellinger cmd->data_length, zero_flag); 2286c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (ret < 0) 2287de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 2288c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2289c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2290c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig * If this command is not a write we can execute it right here, 2291c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig * for write buffers we need to notify the fabric driver first 2292c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig * and let it call back once the write buffers are ready. 2293c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 22945f41a31d0a49a014adb1588edd0cc7f7e30cc55bChristoph Hellwig target_add_to_state_list(cmd); 2295885e7b0e181c14e4d0ddd26c688bad2b84c1ada9Roland Dreier if (cmd->data_direction != DMA_TO_DEVICE || cmd->data_length == 0) { 2296c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig target_execute_cmd(cmd); 2297c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig return 0; 2298c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig } 2299862e6389a78992d4ee44bf4f60051fe560470320Nicholas Bellinger transport_cmd_check_stop(cmd, false, true); 2300c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig 2301c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig ret = cmd->se_tfo->write_pending(cmd); 2302c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig if (ret == -EAGAIN || ret == -ENOMEM) 2303c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig goto queue_full; 2304c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig 2305de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig /* fabric drivers should only return -EAGAIN or -ENOMEM as error */ 2306de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig WARN_ON(ret); 2307de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig 2308b69c1fcf0a7cb2b7dff12ce4e8506b395431a52cNicholas Bellinger return (!ret) ? 0 : TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; 2309da0f7619913751d45fc3cda652789379f4f435fbChristoph Hellwig 2310c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwigqueue_full: 2311c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig pr_debug("Handling write_pending QUEUE__FULL: se_cmd: %p\n", cmd); 2312c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig cmd->t_state = TRANSPORT_COMPLETE_QF_WP; 2313c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig transport_handle_queue_full(cmd, cmd->se_dev); 2314c3196f0cf0061ae62660b3d9a6ce736bef817abaChristoph Hellwig return 0; 2315c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2316a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy GroverEXPORT_SYMBOL(transport_generic_new_cmd); 2317c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2318e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwigstatic void transport_write_pending_qf(struct se_cmd *cmd) 231907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger{ 2320f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger int ret; 2321f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger 2322f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger ret = cmd->se_tfo->write_pending(cmd); 2323f147abb475ab47ce620cf3d18de5b3192c9fa7edNicholas Bellinger if (ret == -EAGAIN || ret == -ENOMEM) { 2324e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig pr_debug("Handling write_pending QUEUE__FULL: se_cmd: %p\n", 2325e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig cmd); 2326e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig transport_handle_queue_full(cmd, cmd->se_dev); 2327e057f53308a5f071556ee80586b99ee755bf07f5Christoph Hellwig } 232807bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger} 232907bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger 2330d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellingerint transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) 2331c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2332c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger unsigned long flags; 2333d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger int ret = 0; 2334d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger 2335d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD)) { 2336c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover if (wait_for_tasks && (cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)) 2337d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger transport_wait_for_tasks(cmd); 2338d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger 2339d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger ret = transport_release_cmd(cmd); 2340d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger } else { 2341d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger if (wait_for_tasks) 2342d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger transport_wait_for_tasks(cmd); 2343c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger /* 2344c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger * Handle WRITE failure case where transport_generic_new_cmd() 2345c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger * has already added se_cmd to state_list, but fabric has 2346c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger * failed command before I/O submission. 2347c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger */ 2348c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger if (cmd->state_active) { 2349c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger spin_lock_irqsave(&cmd->t_state_lock, flags); 2350c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger target_remove_from_state_list(cmd); 2351c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2352c130480b129fbfd7932ad7af3f4ffcea630b027fNicholas Bellinger } 2353d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger 235482f1c8a4e7739eae9f1c32c2c419efdc19b8af41Christoph Hellwig if (cmd->se_lun) 2355c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_lun_remove_cmd(cmd); 2356c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2357d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger ret = transport_put_cmd(cmd); 2358c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2359d5ddad4168348337d98d6b8f156a3892de444411Nicholas Bellinger return ret; 2360c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2361c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_generic_free_cmd); 2362c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2363a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger/* target_get_sess_cmd - Add command to active ->sess_cmd_list 2364a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger * @se_sess: session to reference 2365a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger * @se_cmd: command descriptor to add 2366a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * @ack_kref: Signal that fabric will perform an ack target_put_sess_cmd() 2367a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger */ 236820361e69ba0b52880f9a692bb80aceb989bf0e77Nicholas Bellingerint target_get_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd, 2369bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier bool ack_kref) 2370a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger{ 2371a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger unsigned long flags; 2372bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier int ret = 0; 2373a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2374a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger /* 2375a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * Add a second kref if the fabric caller is expecting to handle 2376a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * fabric acknowledgement that requires two target_put_sess_cmd() 2377a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger * invocations before se_cmd descriptor release. 2378a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger */ 23790bcc297e2b45c12baf735e1dc1f163e71ea55e16Christophe Vu-Brugier if (ack_kref) { 2380a63607855224702ea17e6016ecf3f7d544e83625Nicholas Bellinger kref_get(&se_cmd->cmd_kref); 238186715569d085addc635c2b55ee8acb79d3a7fbbfNicholas Bellinger se_cmd->se_cmd_flags |= SCF_ACK_KREF; 238286715569d085addc635c2b55ee8acb79d3a7fbbfNicholas Bellinger } 23837481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger 2384a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); 2385bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier if (se_sess->sess_tearing_down) { 2386bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier ret = -ESHUTDOWN; 2387bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier goto out; 2388bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier } 2389a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger list_add_tail(&se_cmd->se_cmd_list, &se_sess->sess_cmd_list); 2390bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreierout: 2391a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); 2392bc187ea6c3b3d20bd190f3ee90c954aee0ce8aadRoland Dreier return ret; 2393a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger} 239420361e69ba0b52880f9a692bb80aceb989bf0e77Nicholas BellingerEXPORT_SYMBOL(target_get_sess_cmd); 2395a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 23967481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellingerstatic void target_release_cmd_kref(struct kref *kref) 2397a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger{ 23987481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger struct se_cmd *se_cmd = container_of(kref, struct se_cmd, cmd_kref); 23997481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger struct se_session *se_sess = se_cmd->se_sess; 2400a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2401a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger if (list_empty(&se_cmd->se_cmd_list)) { 2402ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1Joern Engel spin_unlock(&se_sess->sess_cmd_lock); 2403ffc32d5259d107a3aa1b822e22f20b69cb9ec0a5Nicholas Bellinger se_cmd->se_tfo->release_cmd(se_cmd); 24047481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger return; 2405a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger } 2406a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger if (se_sess->sess_tearing_down && se_cmd->cmd_wait_set) { 2407ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1Joern Engel spin_unlock(&se_sess->sess_cmd_lock); 2408a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger complete(&se_cmd->cmd_wait_comp); 24097481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger return; 2410a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger } 2411a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger list_del(&se_cmd->se_cmd_list); 2412ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1Joern Engel spin_unlock(&se_sess->sess_cmd_lock); 2413a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 24147481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger se_cmd->se_tfo->release_cmd(se_cmd); 24157481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger} 24167481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger 24177481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger/* target_put_sess_cmd - Check for active I/O shutdown via kref_put 24187481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger * @se_sess: session to reference 24197481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger * @se_cmd: command descriptor to drop 24207481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger */ 24217481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellingerint target_put_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd) 24227481deb413be132a22193e8a0bce88b311ecb3c2Nicholas Bellinger{ 24230ed6e189e3f6ac3a25383ed5cc8b0ac24c9b97b7Nicholas Bellinger if (!se_sess) { 24240ed6e189e3f6ac3a25383ed5cc8b0ac24c9b97b7Nicholas Bellinger se_cmd->se_tfo->release_cmd(se_cmd); 24250ed6e189e3f6ac3a25383ed5cc8b0ac24c9b97b7Nicholas Bellinger return 1; 24260ed6e189e3f6ac3a25383ed5cc8b0ac24c9b97b7Nicholas Bellinger } 2427ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1Joern Engel return kref_put_spinlock_irqsave(&se_cmd->cmd_kref, target_release_cmd_kref, 2428ccf5ae83a6cf3d9cfe9a7038bfe7cd38ab03d5e1Joern Engel &se_sess->sess_cmd_lock); 2429a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger} 2430a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas BellingerEXPORT_SYMBOL(target_put_sess_cmd); 2431a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 24321c7b13fe65269960f63082eafccede547191ab02Roland Dreier/* target_sess_cmd_list_set_waiting - Flag all commands in 24331c7b13fe65269960f63082eafccede547191ab02Roland Dreier * sess_cmd_list to complete cmd_wait_comp. Set 24341c7b13fe65269960f63082eafccede547191ab02Roland Dreier * sess_tearing_down so no more commands are queued. 24351c7b13fe65269960f63082eafccede547191ab02Roland Dreier * @se_sess: session to flag 2436a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger */ 24371c7b13fe65269960f63082eafccede547191ab02Roland Dreiervoid target_sess_cmd_list_set_waiting(struct se_session *se_sess) 2438a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger{ 2439a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger struct se_cmd *se_cmd; 2440a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger unsigned long flags; 2441a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2442a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); 24439b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger if (se_sess->sess_tearing_down) { 24449b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); 24459b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger return; 24469b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger } 24471c7b13fe65269960f63082eafccede547191ab02Roland Dreier se_sess->sess_tearing_down = 1; 24489b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); 2449a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 24509b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list) 2451a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger se_cmd->cmd_wait_set = 1; 2452a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2453a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); 2454a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger} 24551c7b13fe65269960f63082eafccede547191ab02Roland DreierEXPORT_SYMBOL(target_sess_cmd_list_set_waiting); 2456a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2457a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger/* target_wait_for_sess_cmds - Wait for outstanding descriptors 2458a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger * @se_sess: session to wait for active I/O 2459a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger */ 2460be646c2d2ba8e2e56596d72633705f8286698c25Joern Engelvoid target_wait_for_sess_cmds(struct se_session *se_sess) 2461a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger{ 2462a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger struct se_cmd *se_cmd, *tmp_cmd; 24639b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger unsigned long flags; 2464a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2465a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger list_for_each_entry_safe(se_cmd, tmp_cmd, 24669b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger &se_sess->sess_wait_list, se_cmd_list) { 2467a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger list_del(&se_cmd->se_cmd_list); 2468a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2469a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" 2470a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger " %d\n", se_cmd, se_cmd->t_state, 2471a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger se_cmd->se_tfo->get_cmd_state(se_cmd)); 2472a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2473be646c2d2ba8e2e56596d72633705f8286698c25Joern Engel wait_for_completion(&se_cmd->cmd_wait_comp); 2474be646c2d2ba8e2e56596d72633705f8286698c25Joern Engel pr_debug("After cmd_wait_comp: se_cmd: %p t_state: %d" 2475be646c2d2ba8e2e56596d72633705f8286698c25Joern Engel " fabric state: %d\n", se_cmd, se_cmd->t_state, 2476be646c2d2ba8e2e56596d72633705f8286698c25Joern Engel se_cmd->se_tfo->get_cmd_state(se_cmd)); 2477a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2478a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger se_cmd->se_tfo->release_cmd(se_cmd); 2479a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger } 24809b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger 24819b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); 24829b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger WARN_ON(!list_empty(&se_sess->sess_cmd_list)); 24839b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); 24849b31a328e344e62e7cc98ae574edcb7b674719bbNicholas Bellinger 2485a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger} 2486a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas BellingerEXPORT_SYMBOL(target_wait_for_sess_cmds); 2487a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 24885277797dc4ed873d067477d84e910b39d113f649Nicholas Bellingerstatic int transport_clear_lun_ref_thread(void *p) 2489c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 24908359cf43b9dccddeebb0d247146719a14ce6371aJörn Engel struct se_lun *lun = p; 2491c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 24925277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger percpu_ref_kill(&lun->lun_ref); 24935277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger 24945277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger wait_for_completion(&lun->lun_ref_comp); 2495c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger complete(&lun->lun_shutdown_comp); 2496c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2497c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2498c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2499c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 25005277797dc4ed873d067477d84e910b39d113f649Nicholas Bellingerint transport_clear_lun_ref(struct se_lun *lun) 2501c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2502c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct task_struct *kt; 2503c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 25045277797dc4ed873d067477d84e910b39d113f649Nicholas Bellinger kt = kthread_run(transport_clear_lun_ref_thread, lun, 2505c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger "tcm_cl_%u", lun->unpacked_lun); 2506c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (IS_ERR(kt)) { 25076708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Unable to start clear_lun thread\n"); 2508e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover return PTR_ERR(kt); 2509c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2510c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger wait_for_completion(&lun->lun_shutdown_comp); 2511c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2512c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2513c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2514c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2515d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger/** 2516d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger * transport_wait_for_tasks - wait for completion to occur 2517d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger * @cmd: command to wait 2518c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * 2519d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger * Called from frontend fabric context to wait for storage engine 2520d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger * to pause and/or release frontend generated struct se_cmd. 2521c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2522a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellingerbool transport_wait_for_tasks(struct se_cmd *cmd) 2523c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2524c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned long flags; 2525c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2526a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_irqsave(&cmd->t_state_lock, flags); 2527c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD) && 2528c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover !(cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)) { 2529d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2530a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger return false; 2531d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger } 2532cb4f4d3c7398a709b48d397e0520ee2509a953a4Christoph Hellwig 2533c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover if (!(cmd->se_cmd_flags & SCF_SUPPORTED_SAM_OPCODE) && 2534c8e31f26feeb03dc6f51bff68135cc58431e099bAndy Grover !(cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)) { 2535d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2536a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger return false; 2537d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger } 25387d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig 25393d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger if (!(cmd->transport_state & CMD_T_ACTIVE)) { 2540d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2541a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger return false; 2542d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger } 2543c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 25447d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig cmd->transport_state |= CMD_T_STOP; 2545c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 25466708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("wait_for_tasks: Stopping %p ITT: 0x%08x" 25477d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig " i_state: %d, t_state: %d, CMD_T_STOP\n", 2548f2da9dbdb54f2e9fa00dd01af6ff2ab06b4d90b7Christoph Hellwig cmd, cmd->se_tfo->get_task_tag(cmd), 2549f2da9dbdb54f2e9fa00dd01af6ff2ab06b4d90b7Christoph Hellwig cmd->se_tfo->get_cmd_state(cmd), cmd->t_state); 2550c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2551a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2552c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2553a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover wait_for_completion(&cmd->t_transport_stop_comp); 2554c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2555a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_irqsave(&cmd->t_state_lock, flags); 25567d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig cmd->transport_state &= ~(CMD_T_ACTIVE | CMD_T_STOP); 2557c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 255835d1efe80500a55f9aa01b305a6714ec78c33764Masanari Iida pr_debug("wait_for_tasks: Stopped wait_for_completion(" 2559a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover "&cmd->t_transport_stop_comp) for ITT: 0x%08x\n", 2560e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->get_task_tag(cmd)); 2561c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2562d14921d6ad192868184686b3af5bb99cf3380510Nicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2563a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger 2564a17f091d1a7c570804cfc2c77701634da88f8ecfNicholas Bellinger return true; 2565c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2566d14921d6ad192868184686b3af5bb99cf3380510Nicholas BellingerEXPORT_SYMBOL(transport_wait_for_tasks); 2567c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2568c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerstatic int transport_get_sense_codes( 2569c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_cmd *cmd, 2570c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u8 *asc, 2571c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u8 *ascq) 2572c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2573c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *asc = cmd->scsi_asc; 2574c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger *ascq = cmd->scsi_ascq; 2575c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2576c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2577c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2578c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 257976736db3e291246fbce9db856706af3454b0b078Sagi Grimbergstatic 258076736db3e291246fbce9db856706af3454b0b078Sagi Grimbergvoid transport_err_sector_info(unsigned char *buffer, sector_t bad_sector) 258176736db3e291246fbce9db856706af3454b0b078Sagi Grimberg{ 258276736db3e291246fbce9db856706af3454b0b078Sagi Grimberg /* Place failed LBA in sense data information descriptor 0. */ 258376736db3e291246fbce9db856706af3454b0b078Sagi Grimberg buffer[SPC_ADD_SENSE_LEN_OFFSET] = 0xc; 258476736db3e291246fbce9db856706af3454b0b078Sagi Grimberg buffer[SPC_DESC_TYPE_OFFSET] = 0; /* Information */ 258576736db3e291246fbce9db856706af3454b0b078Sagi Grimberg buffer[SPC_ADDITIONAL_DESC_LEN_OFFSET] = 0xa; 258676736db3e291246fbce9db856706af3454b0b078Sagi Grimberg buffer[SPC_VALIDITY_OFFSET] = 0x80; 258776736db3e291246fbce9db856706af3454b0b078Sagi Grimberg 258876736db3e291246fbce9db856706af3454b0b078Sagi Grimberg /* Descriptor Information: failing sector */ 258976736db3e291246fbce9db856706af3454b0b078Sagi Grimberg put_unaligned_be64(bad_sector, &buffer[12]); 259076736db3e291246fbce9db856706af3454b0b078Sagi Grimberg} 259176736db3e291246fbce9db856706af3454b0b078Sagi Grimberg 2592de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigint 2593de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwigtransport_send_check_condition_and_sense(struct se_cmd *cmd, 2594de103c93aff0bed0ae984274e5dc8b95899badabChristoph Hellwig sense_reason_t reason, int from_transport) 2595c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2596c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned char *buffer = cmd->sense_buffer; 2597c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger unsigned long flags; 2598c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger u8 asc = 0, ascq = 0; 2599c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2600a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_lock_irqsave(&cmd->t_state_lock, flags); 2601c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { 2602a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2603c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2604c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2605c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_cmd_flags |= SCF_SENT_CHECK_CONDITION; 2606a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2607c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2608c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!reason && from_transport) 2609c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger goto after_reason; 2610c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2611c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (!from_transport) 2612c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->se_cmd_flags |= SCF_EMULATED_TASK_SENSE; 26139c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier 2614c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2615c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Actual SENSE DATA, see SPC-3 7.23.2 SPC_SENSE_KEY_OFFSET uses 2616c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * SENSE KEY values from include/scsi/scsi.h 2617c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2618c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (reason) { 2619ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke case TCM_NO_SENSE: 2620ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke /* CURRENT ERROR */ 2621ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke buffer[0] = 0x70; 2622ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2623ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke /* Not Ready */ 2624ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY; 2625ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke /* NO ADDITIONAL SENSE INFORMATION */ 2626ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke buffer[SPC_ASC_KEY_OFFSET] = 0; 2627ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke buffer[SPC_ASCQ_KEY_OFFSET] = 0; 2628ba829137bfd167623363548aa385be769c6b2664Hannes Reinecke break; 2629c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_NON_EXISTENT_LUN: 2630eb39d34004888afcc0a44d9c36383cd69fa3b3b9Nicholas Bellinger /* CURRENT ERROR */ 26319c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26329c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2633eb39d34004888afcc0a44d9c36383cd69fa3b3b9Nicholas Bellinger /* ILLEGAL REQUEST */ 26349c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2635eb39d34004888afcc0a44d9c36383cd69fa3b3b9Nicholas Bellinger /* LOGICAL UNIT NOT SUPPORTED */ 26369c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x25; 2637eb39d34004888afcc0a44d9c36383cd69fa3b3b9Nicholas Bellinger break; 2638c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_UNSUPPORTED_SCSI_OPCODE: 2639c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_SECTOR_COUNT_TOO_MANY: 2640c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26419c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26429c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2643c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ILLEGAL REQUEST */ 26449c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2645c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* INVALID COMMAND OPERATION CODE */ 26469c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x20; 2647c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2648c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_UNKNOWN_MODE_PAGE: 2649c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26509c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26519c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2652c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ILLEGAL REQUEST */ 26539c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2654c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* INVALID FIELD IN CDB */ 26559c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x24; 2656c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2657c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_CHECK_CONDITION_ABORT_CMD: 2658c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26599c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26609c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2661c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ABORTED COMMAND */ 26629c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2663c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* BUS DEVICE RESET FUNCTION OCCURRED */ 26649c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x29; 26659c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; 2666c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2667c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_INCORRECT_AMOUNT_OF_DATA: 2668c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26699c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26709c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2671c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ABORTED COMMAND */ 26729c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2673c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* WRITE ERROR */ 26749c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x0c; 2675c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* NOT ENOUGH UNSOLICITED DATA */ 26769c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = 0x0d; 2677c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2678c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_INVALID_CDB_FIELD: 2679c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26809c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26819c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 26829fbc8909876a2160044e71d376848973b9bfdc3fRoland Dreier /* ILLEGAL REQUEST */ 26839c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2684c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* INVALID FIELD IN CDB */ 26859c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x24; 2686c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2687c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_INVALID_PARAMETER_LIST: 2688c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 26899c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 26909c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 26919fbc8909876a2160044e71d376848973b9bfdc3fRoland Dreier /* ILLEGAL REQUEST */ 26929c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2693c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* INVALID FIELD IN PARAMETER LIST */ 26949c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x26; 2695c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2696bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier case TCM_PARAMETER_LIST_LENGTH_ERROR: 2697bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier /* CURRENT ERROR */ 2698bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier buffer[0] = 0x70; 2699bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2700bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier /* ILLEGAL REQUEST */ 2701bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2702bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier /* PARAMETER LIST LENGTH ERROR */ 2703bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x1a; 2704bb992e72f9b751fceb04afeb7736b6a3e50effcfRoland Dreier break; 2705c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_UNEXPECTED_UNSOLICITED_DATA: 2706c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27079c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27089c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2709c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ABORTED COMMAND */ 27109c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2711c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* WRITE ERROR */ 27129c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x0c; 2713c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* UNEXPECTED_UNSOLICITED_DATA */ 27149c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = 0x0c; 2715c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2716c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_SERVICE_CRC_ERROR: 2717c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27189c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27199c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2720c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ABORTED COMMAND */ 27219c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2722c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* PROTOCOL SERVICE CRC ERROR */ 27239c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x47; 2724c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* N/A */ 27259c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = 0x05; 2726c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2727c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_SNACK_REJECTED: 2728c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27299c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27309c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2731c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* ABORTED COMMAND */ 27329c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ABORTED_COMMAND; 2733c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* READ ERROR */ 27349c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x11; 2735c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* FAILED RETRANSMISSION REQUEST */ 27369c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = 0x13; 2737c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2738c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_WRITE_PROTECTED: 2739c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27409c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27419c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2742c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* DATA PROTECT */ 27439c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = DATA_PROTECT; 2744c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* WRITE PROTECTED */ 27459c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x27; 2746c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2747e2397c704429025bc6b331a970f699e52f34283eRoland Dreier case TCM_ADDRESS_OUT_OF_RANGE: 2748e2397c704429025bc6b331a970f699e52f34283eRoland Dreier /* CURRENT ERROR */ 27499c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27509c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2751e2397c704429025bc6b331a970f699e52f34283eRoland Dreier /* ILLEGAL REQUEST */ 27529c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2753e2397c704429025bc6b331a970f699e52f34283eRoland Dreier /* LOGICAL BLOCK ADDRESS OUT OF RANGE */ 27549c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = 0x21; 2755e2397c704429025bc6b331a970f699e52f34283eRoland Dreier break; 2756c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_CHECK_CONDITION_UNIT_ATTENTION: 2757c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27589c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27599c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2760c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* UNIT ATTENTION */ 27619c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; 2762c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger core_scsi3_ua_for_check_condition(cmd, &asc, &ascq); 27639c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = asc; 27649c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = ascq; 2765c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2766c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_CHECK_CONDITION_NOT_READY: 2767c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 27689c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 27699c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2770c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* Not Ready */ 27719c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY; 2772c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger transport_get_sense_codes(cmd, &asc, &ascq); 27739c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASC_KEY_OFFSET] = asc; 27749c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ASCQ_KEY_OFFSET] = ascq; 2775c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2776818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger case TCM_MISCOMPARE_VERIFY: 2777818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger /* CURRENT ERROR */ 2778818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger buffer[0] = 0x70; 2779818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2780818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger buffer[SPC_SENSE_KEY_OFFSET] = MISCOMPARE; 2781818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger /* MISCOMPARE DURING VERIFY OPERATION */ 2782818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger buffer[SPC_ASC_KEY_OFFSET] = 0x1d; 2783818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger buffer[SPC_ASCQ_KEY_OFFSET] = 0x00; 2784818b571ca053e19be336de1cc75c01dd5445e969Nicholas Bellinger break; 2785fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED: 2786fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* CURRENT ERROR */ 2787fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[0] = 0x70; 2788fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2789fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* ILLEGAL REQUEST */ 2790fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2791fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* LOGICAL BLOCK GUARD CHECK FAILED */ 2792fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2793fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASCQ_KEY_OFFSET] = 0x01; 279476736db3e291246fbce9db856706af3454b0b078Sagi Grimberg transport_err_sector_info(buffer, cmd->bad_sector); 2795fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger break; 2796fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: 2797fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* CURRENT ERROR */ 2798fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[0] = 0x70; 2799fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2800fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* ILLEGAL REQUEST */ 2801fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2802fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */ 2803fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2804fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASCQ_KEY_OFFSET] = 0x02; 280576736db3e291246fbce9db856706af3454b0b078Sagi Grimberg transport_err_sector_info(buffer, cmd->bad_sector); 2806fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger break; 2807fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: 2808fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* CURRENT ERROR */ 2809fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[0] = 0x70; 2810fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2811fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* ILLEGAL REQUEST */ 2812fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; 2813fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ 2814fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2815fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; 281676736db3e291246fbce9db856706af3454b0b078Sagi Grimberg transport_err_sector_info(buffer, cmd->bad_sector); 2817fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1efNicholas Bellinger break; 2818c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 2819c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 2820c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* CURRENT ERROR */ 28219c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[0] = 0x70; 28229c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; 2823ad6732820c56664be7d022002907ba62b981bd85Jörn Engel /* 2824ad6732820c56664be7d022002907ba62b981bd85Jörn Engel * Returning ILLEGAL REQUEST would cause immediate IO errors on 2825ad6732820c56664be7d022002907ba62b981bd85Jörn Engel * Solaris initiators. Returning NOT READY instead means the 2826ad6732820c56664be7d022002907ba62b981bd85Jörn Engel * operations will be retried a finite number of times and we 2827ad6732820c56664be7d022002907ba62b981bd85Jörn Engel * can survive intermittent errors. 2828ad6732820c56664be7d022002907ba62b981bd85Jörn Engel */ 2829ad6732820c56664be7d022002907ba62b981bd85Jörn Engel buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY; 2830c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* LOGICAL UNIT COMMUNICATION FAILURE */ 283118a9df42d53fabfa43b78be1104838cc8b9762e1Hannes Reinecke buffer[SPC_ASC_KEY_OFFSET] = 0x08; 2832c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2833c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2834c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2835c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * This code uses linux/include/scsi/scsi.h SAM status codes! 2836c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2837c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->scsi_status = SAM_STAT_CHECK_CONDITION; 2838c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2839c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * Automatically padded, this value is encoded in the fabric's 2840c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * data_length response PDU containing the SCSI defined sense data. 2841c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 28429c58b7ddd70dd7bfaac4ca87131f36d10aaba441Roland Dreier cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; 2843c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2844c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerafter_reason: 2845e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 284607bde79a5c355dbca66ca4318645aa17b4c0d859Nicholas Bellinger return cmd->se_tfo->queue_status(cmd); 2847c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2848c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_send_check_condition_and_sense); 2849c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2850c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingerint transport_check_aborted_status(struct se_cmd *cmd, int send_status) 2851c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2852c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier if (!(cmd->transport_state & CMD_T_ABORTED)) 2853c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier return 0; 2854c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 285568259b5aac13a57cba797b9605ed9812158f0e72Alex Leung /* 285668259b5aac13a57cba797b9605ed9812158f0e72Alex Leung * If cmd has been aborted but either no status is to be sent or it has 285768259b5aac13a57cba797b9605ed9812158f0e72Alex Leung * already been sent, just return 285868259b5aac13a57cba797b9605ed9812158f0e72Alex Leung */ 285968259b5aac13a57cba797b9605ed9812158f0e72Alex Leung if (!send_status || !(cmd->se_cmd_flags & SCF_SEND_DELAYED_TAS)) 2860c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier return 1; 28618b1e1244db85d58f7c612870ec2c1afd9098ae93Andy Grover 2862c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier pr_debug("Sending delayed SAM_STAT_TASK_ABORTED status for CDB: 0x%02x ITT: 0x%08x\n", 2863c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier cmd->t_task_cdb[0], cmd->se_tfo->get_task_tag(cmd)); 28648b1e1244db85d58f7c612870ec2c1afd9098ae93Andy Grover 286568259b5aac13a57cba797b9605ed9812158f0e72Alex Leung cmd->se_cmd_flags &= ~SCF_SEND_DELAYED_TAS; 286629f4c090079f442ea2723d292e4e64f0b6ac1f27Nicholas Bellinger cmd->scsi_status = SAM_STAT_TASK_ABORTED; 2867e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 2868c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier cmd->se_tfo->queue_status(cmd); 2869c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier 2870c18bc7d8d34103d4bae47db180b508413f98dc36Roland Dreier return 1; 2871c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2872c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas BellingerEXPORT_SYMBOL(transport_check_aborted_status); 2873c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2874c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellingervoid transport_send_task_abort(struct se_cmd *cmd) 2875c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2876c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger unsigned long flags; 2877c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger 2878c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger spin_lock_irqsave(&cmd->t_state_lock, flags); 287968259b5aac13a57cba797b9605ed9812158f0e72Alex Leung if (cmd->se_cmd_flags & (SCF_SENT_CHECK_CONDITION)) { 2880c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2881c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger return; 2882c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger } 2883c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2884c252f003470a99d319db4ebd12f4a9e4710a65dbNicholas Bellinger 2885c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger /* 2886c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * If there are still expected incoming fabric WRITEs, we wait 2887c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * until until they have completed before sending a TASK_ABORTED 2888c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * response. This response with TASK_ABORTED status will be 2889c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger * queued back to fabric module by transport_check_aborted_status(). 2890c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger */ 2891c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger if (cmd->data_direction == DMA_TO_DEVICE) { 2892e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover if (cmd->se_tfo->write_pending_status(cmd) != 0) { 28937d680f3b74dd6f0f57569eeeee8c257790ceaa96Christoph Hellwig cmd->transport_state |= CMD_T_ABORTED; 289468259b5aac13a57cba797b9605ed9812158f0e72Alex Leung cmd->se_cmd_flags |= SCF_SEND_DELAYED_TAS; 289529f4c090079f442ea2723d292e4e64f0b6ac1f27Nicholas Bellinger return; 2896c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2897c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2898c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->scsi_status = SAM_STAT_TASK_ABORTED; 28998b1e1244db85d58f7c612870ec2c1afd9098ae93Andy Grover 290072b59d6ee8adaa51f70377db0a1917ed489bead8Roland Dreier transport_lun_remove_cmd(cmd); 290172b59d6ee8adaa51f70377db0a1917ed489bead8Roland Dreier 29026708bb27bb2703da238f21f516034263348af5beAndy Grover pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x," 2903a1d8b49abd60ba5d09e7c968731abcb0f8f1cbf6Andy Grover " ITT: 0x%08x\n", cmd->t_task_cdb[0], 2904e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->get_task_tag(cmd)); 29058b1e1244db85d58f7c612870ec2c1afd9098ae93Andy Grover 2906e5c0d6ad557b32f431a70a4efba820430f6ff88bRoland Dreier trace_target_cmd_complete(cmd); 2907e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->queue_status(cmd); 2908c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2909c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2910af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwigstatic void target_tmr_work(struct work_struct *work) 2911c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2912af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig struct se_cmd *cmd = container_of(work, struct se_cmd, work); 29135951146dea1ac8ff2f177477c907084d63913cadAndy Grover struct se_device *dev = cmd->se_dev; 2914c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger struct se_tmr_req *tmr = cmd->se_tmr_req; 2915c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger int ret; 2916c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2917c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger switch (tmr->function) { 29185c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_ABORT_TASK: 29193d28934aaae5e924afedf0f5cb42e1316514da6bNicholas Bellinger core_tmr_abort_task(dev, tmr, cmd->se_sess); 2920c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 29215c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_ABORT_TASK_SET: 29225c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_CLEAR_ACA: 29235c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_CLEAR_TASK_SET: 2924c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->response = TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED; 2925c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 29265c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_LUN_RESET: 2927c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger ret = core_tmr_lun_reset(dev, tmr, NULL, NULL); 2928c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->response = (!ret) ? TMR_FUNCTION_COMPLETE : 2929c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger TMR_FUNCTION_REJECTED; 2930c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 29315c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_TARGET_WARM_RESET: 2932c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->response = TMR_FUNCTION_REJECTED; 2933c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 29345c6cd613196558ba50ba97268b6d225c8d2f56d6Nicholas Bellinger case TMR_TARGET_COLD_RESET: 2935c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->response = TMR_FUNCTION_REJECTED; 2936c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2937c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger default: 29386708bb27bb2703da238f21f516034263348af5beAndy Grover pr_err("Uknown TMR function: 0x%02x.\n", 2939c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->function); 2940c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger tmr->response = TMR_FUNCTION_REJECTED; 2941c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger break; 2942c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger } 2943c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2944c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger cmd->t_state = TRANSPORT_ISTATE_PROCESSING; 2945e3d6f909ed803d92a5ac9b4a2c087e0eae9b90d0Andy Grover cmd->se_tfo->queue_tm_rsp(cmd); 2946c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2947b7b8bef7f8c1c9b3358127608e867db7cd928022Christoph Hellwig transport_cmd_check_stop_to_fabric(cmd); 2948c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2949c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger 2950af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwigint transport_generic_handle_tmr( 2951af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig struct se_cmd *cmd) 2952c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger{ 2953f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger unsigned long flags; 2954f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger 2955f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger spin_lock_irqsave(&cmd->t_state_lock, flags); 2956f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger cmd->transport_state |= CMD_T_ACTIVE; 2957f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger spin_unlock_irqrestore(&cmd->t_state_lock, flags); 2958f15e9cd910c4d9da7de43f2181f362082fc45f0fNicholas Bellinger 2959af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig INIT_WORK(&cmd->work, target_tmr_work); 2960af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph Hellwig queue_work(cmd->se_dev->tmr_wq, &cmd->work); 2961c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger return 0; 2962c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5Nicholas Bellinger} 2963af8772926f019b7bddd7477b8de5f3b0f12bad21Christoph HellwigEXPORT_SYMBOL(transport_generic_handle_tmr); 2964