| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /******************************************************************************* |
|---|
| 2 | 3 | * Filename: target_core_alua.c |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 6 | 7 | * (c) Copyright 2009-2013 Datera, Inc. |
|---|
| 7 | 8 | * |
|---|
| 8 | 9 | * Nicholas A. Bellinger <nab@kernel.org> |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 11 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 12 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 13 | | - * (at your option) any later version. |
|---|
| 14 | | - * |
|---|
| 15 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 16 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 17 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 18 | | - * GNU General Public License for more details. |
|---|
| 19 | | - * |
|---|
| 20 | | - * You should have received a copy of the GNU General Public License |
|---|
| 21 | | - * along with this program; if not, write to the Free Software |
|---|
| 22 | | - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|---|
| 23 | 10 | * |
|---|
| 24 | 11 | ******************************************************************************/ |
|---|
| 25 | 12 | |
|---|
| .. | .. |
|---|
| 268 | 255 | } |
|---|
| 269 | 256 | transport_kunmap_data_sg(cmd); |
|---|
| 270 | 257 | |
|---|
| 271 | | - target_complete_cmd(cmd, GOOD); |
|---|
| 258 | + target_complete_cmd_with_length(cmd, GOOD, rd_len + 4); |
|---|
| 272 | 259 | return 0; |
|---|
| 273 | 260 | } |
|---|
| 274 | 261 | |
|---|
| .. | .. |
|---|
| 451 | 438 | pr_debug("[%s]: ALUA TG Port not available, " |
|---|
| 452 | 439 | "SenseKey: NOT_READY, ASC/ASCQ: " |
|---|
| 453 | 440 | "0x04/0x%02x\n", |
|---|
| 454 | | - cmd->se_tfo->get_fabric_name(), alua_ascq); |
|---|
| 441 | + cmd->se_tfo->fabric_name, alua_ascq); |
|---|
| 455 | 442 | |
|---|
| 456 | 443 | cmd->scsi_asc = 0x04; |
|---|
| 457 | 444 | cmd->scsi_ascq = alua_ascq; |
|---|
| .. | .. |
|---|
| 690 | 677 | |
|---|
| 691 | 678 | if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) |
|---|
| 692 | 679 | return 0; |
|---|
| 693 | | - if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) |
|---|
| 680 | + if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) |
|---|
| 694 | 681 | return 0; |
|---|
| 695 | 682 | |
|---|
| 696 | 683 | /* |
|---|
| .. | .. |
|---|
| 910 | 897 | return (ret < 0) ? -EIO : 0; |
|---|
| 911 | 898 | } |
|---|
| 912 | 899 | |
|---|
| 913 | | -/* |
|---|
| 914 | | - * Called with tg_pt_gp->tg_pt_gp_transition_mutex held |
|---|
| 915 | | - */ |
|---|
| 916 | 900 | static int core_alua_update_tpg_primary_metadata( |
|---|
| 917 | 901 | struct t10_alua_tg_pt_gp *tg_pt_gp) |
|---|
| 918 | 902 | { |
|---|
| .. | .. |
|---|
| 920 | 904 | struct t10_wwn *wwn = &tg_pt_gp->tg_pt_gp_dev->t10_wwn; |
|---|
| 921 | 905 | char *path; |
|---|
| 922 | 906 | int len, rc; |
|---|
| 907 | + |
|---|
| 908 | + lockdep_assert_held(&tg_pt_gp->tg_pt_gp_transition_mutex); |
|---|
| 923 | 909 | |
|---|
| 924 | 910 | md_buf = kzalloc(ALUA_MD_BUF_LEN, GFP_KERNEL); |
|---|
| 925 | 911 | if (!md_buf) { |
|---|
| .. | .. |
|---|
| 1104 | 1090 | struct t10_alua_tg_pt_gp *tg_pt_gp; |
|---|
| 1105 | 1091 | int primary, valid_states, rc = 0; |
|---|
| 1106 | 1092 | |
|---|
| 1107 | | - if (l_dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) |
|---|
| 1093 | + if (l_dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) |
|---|
| 1108 | 1094 | return -ENODEV; |
|---|
| 1109 | 1095 | |
|---|
| 1110 | 1096 | valid_states = l_tg_pt_gp->tg_pt_gp_alua_supported_states; |
|---|
| .. | .. |
|---|
| 1229 | 1215 | |
|---|
| 1230 | 1216 | if (se_tpg->se_tpg_tfo->tpg_get_tag != NULL) { |
|---|
| 1231 | 1217 | path = kasprintf(GFP_KERNEL, "%s/alua/%s/%s+%hu/lun_%llu", |
|---|
| 1232 | | - db_root, se_tpg->se_tpg_tfo->get_fabric_name(), |
|---|
| 1218 | + db_root, se_tpg->se_tpg_tfo->fabric_name, |
|---|
| 1233 | 1219 | se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg), |
|---|
| 1234 | 1220 | se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg), |
|---|
| 1235 | 1221 | lun->unpacked_lun); |
|---|
| 1236 | 1222 | } else { |
|---|
| 1237 | 1223 | path = kasprintf(GFP_KERNEL, "%s/alua/%s/%s/lun_%llu", |
|---|
| 1238 | | - db_root, se_tpg->se_tpg_tfo->get_fabric_name(), |
|---|
| 1224 | + db_root, se_tpg->se_tpg_tfo->fabric_name, |
|---|
| 1239 | 1225 | se_tpg->se_tpg_tfo->tpg_get_wwn(se_tpg), |
|---|
| 1240 | 1226 | lun->unpacked_lun); |
|---|
| 1241 | 1227 | } |
|---|
| .. | .. |
|---|
| 1760 | 1746 | * can be made while we are releasing struct t10_alua_tg_pt_gp. |
|---|
| 1761 | 1747 | */ |
|---|
| 1762 | 1748 | spin_lock(&dev->t10_alua.tg_pt_gps_lock); |
|---|
| 1763 | | - list_del(&tg_pt_gp->tg_pt_gp_list); |
|---|
| 1764 | | - dev->t10_alua.alua_tg_pt_gps_counter--; |
|---|
| 1749 | + if (tg_pt_gp->tg_pt_gp_valid_id) { |
|---|
| 1750 | + list_del(&tg_pt_gp->tg_pt_gp_list); |
|---|
| 1751 | + dev->t10_alua.alua_tg_pt_gps_count--; |
|---|
| 1752 | + } |
|---|
| 1765 | 1753 | spin_unlock(&dev->t10_alua.tg_pt_gps_lock); |
|---|
| 1766 | 1754 | |
|---|
| 1767 | 1755 | /* |
|---|
| .. | .. |
|---|
| 1931 | 1919 | unsigned char buf[TG_PT_GROUP_NAME_BUF]; |
|---|
| 1932 | 1920 | int move = 0; |
|---|
| 1933 | 1921 | |
|---|
| 1934 | | - if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || |
|---|
| 1922 | + if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || |
|---|
| 1935 | 1923 | (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) |
|---|
| 1936 | 1924 | return -ENODEV; |
|---|
| 1937 | 1925 | |
|---|
| .. | .. |
|---|
| 2188 | 2176 | unsigned long tmp; |
|---|
| 2189 | 2177 | int ret; |
|---|
| 2190 | 2178 | |
|---|
| 2191 | | - if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || |
|---|
| 2179 | + if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || |
|---|
| 2192 | 2180 | (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) |
|---|
| 2193 | 2181 | return -ENODEV; |
|---|
| 2194 | 2182 | |
|---|
| .. | .. |
|---|
| 2274 | 2262 | |
|---|
| 2275 | 2263 | int core_setup_alua(struct se_device *dev) |
|---|
| 2276 | 2264 | { |
|---|
| 2277 | | - if (!(dev->transport->transport_flags & |
|---|
| 2265 | + if (!(dev->transport_flags & |
|---|
| 2278 | 2266 | TRANSPORT_FLAG_PASSTHROUGH_ALUA) && |
|---|
| 2279 | 2267 | !(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) { |
|---|
| 2280 | 2268 | struct t10_alua_lu_gp_member *lu_gp_mem; |
|---|