aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_alua.c135
-rw-r--r--drivers/target/target_core_alua.h1
-rw-r--r--drivers/target/target_core_configfs.c28
-rw-r--r--drivers/target/target_core_device.c4
-rw-r--r--drivers/target/target_core_spc.c12
-rw-r--r--drivers/target/target_core_transport.c38
6 files changed, 65 insertions, 153 deletions
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index 15c127b780d8..b3302a9200a2 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -522,40 +522,26 @@ static inline int core_alua_state_transition(
522} 522}
523 523
524/* 524/*
525 * Used for alua_type SPC_ALUA_PASSTHROUGH and SPC2_ALUA_DISABLED
526 * in transport_cmd_sequencer(). This function is assigned to
527 * struct t10_alua *->state_check() in core_setup_alua()
528 */
529static int core_alua_state_check_nop(
530 struct se_cmd *cmd,
531 unsigned char *cdb,
532 u8 *alua_ascq)
533{
534 return 0;
535}
536
537/*
538 * Used for alua_type SPC3_ALUA_EMULATED in transport_cmd_sequencer().
539 * This function is assigned to struct t10_alua *->state_check() in
540 * core_setup_alua()
541 *
542 * Also, this function can return three different return codes to
543 * signal transport_generic_cmd_sequencer()
544 *
545 * return 1: Is used to signal LUN not accecsable, and check condition/not ready 525 * return 1: Is used to signal LUN not accecsable, and check condition/not ready
546 * return 0: Used to signal success 526 * return 0: Used to signal success
547 * reutrn -1: Used to signal failure, and invalid cdb field 527 * reutrn -1: Used to signal failure, and invalid cdb field
548 */ 528 */
549static int core_alua_state_check( 529int target_alua_state_check(struct se_cmd *cmd)
550 struct se_cmd *cmd,
551 unsigned char *cdb,
552 u8 *alua_ascq)
553{ 530{
531 struct se_device *dev = cmd->se_dev;
532 unsigned char *cdb = cmd->t_task_cdb;
554 struct se_lun *lun = cmd->se_lun; 533 struct se_lun *lun = cmd->se_lun;
555 struct se_port *port = lun->lun_sep; 534 struct se_port *port = lun->lun_sep;
556 struct t10_alua_tg_pt_gp *tg_pt_gp; 535 struct t10_alua_tg_pt_gp *tg_pt_gp;
557 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 536 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
558 int out_alua_state, nonop_delay_msecs; 537 int out_alua_state, nonop_delay_msecs;
538 u8 alua_ascq;
539 int ret;
540
541 if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
542 return 0;
543 if (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV)
544 return 0;
559 545
560 if (!port) 546 if (!port)
561 return 0; 547 return 0;
@@ -564,11 +550,11 @@ static int core_alua_state_check(
564 * access state: OFFLINE 550 * access state: OFFLINE
565 */ 551 */
566 if (atomic_read(&port->sep_tg_pt_secondary_offline)) { 552 if (atomic_read(&port->sep_tg_pt_secondary_offline)) {
567 *alua_ascq = ASCQ_04H_ALUA_OFFLINE;
568 pr_debug("ALUA: Got secondary offline status for local" 553 pr_debug("ALUA: Got secondary offline status for local"
569 " target port\n"); 554 " target port\n");
570 *alua_ascq = ASCQ_04H_ALUA_OFFLINE; 555 alua_ascq = ASCQ_04H_ALUA_OFFLINE;
571 return 1; 556 ret = 1;
557 goto out;
572 } 558 }
573 /* 559 /*
574 * Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the 560 * Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the
@@ -593,14 +579,18 @@ static int core_alua_state_check(
593 579
594 switch (out_alua_state) { 580 switch (out_alua_state) {
595 case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED: 581 case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED:
596 return core_alua_state_nonoptimized(cmd, cdb, 582 ret = core_alua_state_nonoptimized(cmd, cdb,
597 nonop_delay_msecs, alua_ascq); 583 nonop_delay_msecs, &alua_ascq);
584 break;
598 case ALUA_ACCESS_STATE_STANDBY: 585 case ALUA_ACCESS_STATE_STANDBY:
599 return core_alua_state_standby(cmd, cdb, alua_ascq); 586 ret = core_alua_state_standby(cmd, cdb, &alua_ascq);
587 break;
600 case ALUA_ACCESS_STATE_UNAVAILABLE: 588 case ALUA_ACCESS_STATE_UNAVAILABLE:
601 return core_alua_state_unavailable(cmd, cdb, alua_ascq); 589 ret = core_alua_state_unavailable(cmd, cdb, &alua_ascq);
590 break;
602 case ALUA_ACCESS_STATE_TRANSITION: 591 case ALUA_ACCESS_STATE_TRANSITION:
603 return core_alua_state_transition(cmd, cdb, alua_ascq); 592 ret = core_alua_state_transition(cmd, cdb, &alua_ascq);
593 break;
604 /* 594 /*
605 * OFFLINE is a secondary ALUA target port group access state, that is 595 * OFFLINE is a secondary ALUA target port group access state, that is
606 * handled above with struct se_port->sep_tg_pt_secondary_offline=1 596 * handled above with struct se_port->sep_tg_pt_secondary_offline=1
@@ -609,10 +599,27 @@ static int core_alua_state_check(
609 default: 599 default:
610 pr_err("Unknown ALUA access state: 0x%02x\n", 600 pr_err("Unknown ALUA access state: 0x%02x\n",
611 out_alua_state); 601 out_alua_state);
612 return -EINVAL; 602 ret = -EINVAL;
603 break;
613 } 604 }
614 605
615 return 0; 606out:
607 if (ret > 0) {
608 /*
609 * Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
610 * The ALUA additional sense code qualifier (ASCQ) is determined
611 * by the ALUA primary or secondary access state..
612 */
613 pr_debug("[%s]: ALUA TG Port not available, "
614 "SenseKey: NOT_READY, ASC/ASCQ: "
615 "0x04/0x%02x\n",
616 cmd->se_tfo->get_fabric_name(), alua_ascq);
617
618 cmd->scsi_asc = 0x04;
619 cmd->scsi_ascq = alua_ascq;
620 }
621
622 return ret;
616} 623}
617 624
618/* 625/*
@@ -1264,13 +1271,9 @@ void core_alua_free_lu_gp(struct t10_alua_lu_gp *lu_gp)
1264 1271
1265void core_alua_free_lu_gp_mem(struct se_device *dev) 1272void core_alua_free_lu_gp_mem(struct se_device *dev)
1266{ 1273{
1267 struct t10_alua *alua = &dev->t10_alua;
1268 struct t10_alua_lu_gp *lu_gp; 1274 struct t10_alua_lu_gp *lu_gp;
1269 struct t10_alua_lu_gp_member *lu_gp_mem; 1275 struct t10_alua_lu_gp_member *lu_gp_mem;
1270 1276
1271 if (alua->alua_type != SPC3_ALUA_EMULATED)
1272 return;
1273
1274 lu_gp_mem = dev->dev_alua_lu_gp_mem; 1277 lu_gp_mem = dev->dev_alua_lu_gp_mem;
1275 if (!lu_gp_mem) 1278 if (!lu_gp_mem)
1276 return; 1279 return;
@@ -1538,13 +1541,9 @@ void core_alua_free_tg_pt_gp(
1538 1541
1539void core_alua_free_tg_pt_gp_mem(struct se_port *port) 1542void core_alua_free_tg_pt_gp_mem(struct se_port *port)
1540{ 1543{
1541 struct t10_alua *alua = &port->sep_lun->lun_se_dev->t10_alua;
1542 struct t10_alua_tg_pt_gp *tg_pt_gp; 1544 struct t10_alua_tg_pt_gp *tg_pt_gp;
1543 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 1545 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
1544 1546
1545 if (alua->alua_type != SPC3_ALUA_EMULATED)
1546 return;
1547
1548 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; 1547 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
1549 if (!tg_pt_gp_mem) 1548 if (!tg_pt_gp_mem)
1550 return; 1549 return;
@@ -1636,14 +1635,10 @@ static void __core_alua_drop_tg_pt_gp_mem(
1636ssize_t core_alua_show_tg_pt_gp_info(struct se_port *port, char *page) 1635ssize_t core_alua_show_tg_pt_gp_info(struct se_port *port, char *page)
1637{ 1636{
1638 struct config_item *tg_pt_ci; 1637 struct config_item *tg_pt_ci;
1639 struct t10_alua *alua = &port->sep_lun->lun_se_dev->t10_alua;
1640 struct t10_alua_tg_pt_gp *tg_pt_gp; 1638 struct t10_alua_tg_pt_gp *tg_pt_gp;
1641 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 1639 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
1642 ssize_t len = 0; 1640 ssize_t len = 0;
1643 1641
1644 if (alua->alua_type != SPC3_ALUA_EMULATED)
1645 return len;
1646
1647 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; 1642 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
1648 if (!tg_pt_gp_mem) 1643 if (!tg_pt_gp_mem)
1649 return len; 1644 return len;
@@ -1686,13 +1681,9 @@ ssize_t core_alua_store_tg_pt_gp_info(
1686 tpg = port->sep_tpg; 1681 tpg = port->sep_tpg;
1687 lun = port->sep_lun; 1682 lun = port->sep_lun;
1688 1683
1689 if (dev->t10_alua.alua_type != SPC3_ALUA_EMULATED) { 1684 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
1690 pr_warn("SPC3_ALUA_EMULATED not enabled for" 1685 if (!tg_pt_gp_mem)
1691 " %s/tpgt_%hu/%s\n", tpg->se_tpg_tfo->tpg_get_wwn(tpg), 1686 return 0;
1692 tpg->se_tpg_tfo->tpg_get_tag(tpg),
1693 config_item_name(&lun->lun_group.cg_item));
1694 return -EINVAL;
1695 }
1696 1687
1697 if (count > TG_PT_GROUP_NAME_BUF) { 1688 if (count > TG_PT_GROUP_NAME_BUF) {
1698 pr_err("ALUA Target Port Group alias too large!\n"); 1689 pr_err("ALUA Target Port Group alias too large!\n");
@@ -1715,13 +1706,6 @@ ssize_t core_alua_store_tg_pt_gp_info(
1715 if (!tg_pt_gp_new) 1706 if (!tg_pt_gp_new)
1716 return -ENODEV; 1707 return -ENODEV;
1717 } 1708 }
1718 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
1719 if (!tg_pt_gp_mem) {
1720 if (tg_pt_gp_new)
1721 core_alua_put_tg_pt_gp_from_name(tg_pt_gp_new);
1722 pr_err("NULL struct se_port->sep_alua_tg_pt_gp_mem pointer\n");
1723 return -EINVAL;
1724 }
1725 1709
1726 spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); 1710 spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock);
1727 tg_pt_gp = tg_pt_gp_mem->tg_pt_gp; 1711 tg_pt_gp = tg_pt_gp_mem->tg_pt_gp;
@@ -2050,26 +2034,9 @@ ssize_t core_alua_store_secondary_write_metadata(
2050 2034
2051int core_setup_alua(struct se_device *dev) 2035int core_setup_alua(struct se_device *dev)
2052{ 2036{
2053 struct t10_alua *alua = &dev->t10_alua; 2037 if (dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV &&
2054 struct t10_alua_lu_gp_member *lu_gp_mem; 2038 !(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) {
2055 2039 struct t10_alua_lu_gp_member *lu_gp_mem;
2056 /*
2057 * If this device is from Target_Core_Mod/pSCSI, use the ALUA logic
2058 * of the Underlying SCSI hardware. In Linux/SCSI terms, this can
2059 * cause a problem because libata and some SATA RAID HBAs appear
2060 * under Linux/SCSI, but emulate SCSI logic themselves.
2061 */
2062 if ((dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) ||
2063 (dev->transport->transport_type == TRANSPORT_PLUGIN_PHBA_PDEV &&
2064 !dev->dev_attrib.emulate_alua)) {
2065 pr_debug("%s: Using SPC_ALUA_PASSTHROUGH, no ALUA"
2066 " emulation\n", dev->transport->name);
2067
2068 alua->alua_type = SPC_ALUA_PASSTHROUGH;
2069 alua->alua_state_check = &core_alua_state_check_nop;
2070 } else if (dev->transport->get_device_rev(dev) >= SCSI_3) {
2071 pr_debug("%s: Enabling ALUA Emulation for SPC-3"
2072 " device\n", dev->transport->name);
2073 2040
2074 /* 2041 /*
2075 * Associate this struct se_device with the default ALUA 2042 * Associate this struct se_device with the default ALUA
@@ -2079,8 +2046,6 @@ int core_setup_alua(struct se_device *dev)
2079 if (IS_ERR(lu_gp_mem)) 2046 if (IS_ERR(lu_gp_mem))
2080 return PTR_ERR(lu_gp_mem); 2047 return PTR_ERR(lu_gp_mem);
2081 2048
2082 alua->alua_type = SPC3_ALUA_EMULATED;
2083 alua->alua_state_check = &core_alua_state_check;
2084 spin_lock(&lu_gp_mem->lu_gp_mem_lock); 2049 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
2085 __core_alua_attach_lu_gp_mem(lu_gp_mem, 2050 __core_alua_attach_lu_gp_mem(lu_gp_mem,
2086 default_lu_gp); 2051 default_lu_gp);
@@ -2089,12 +2054,6 @@ int core_setup_alua(struct se_device *dev)
2089 pr_debug("%s: Adding to default ALUA LU Group:" 2054 pr_debug("%s: Adding to default ALUA LU Group:"
2090 " core/alua/lu_gps/default_lu_gp\n", 2055 " core/alua/lu_gps/default_lu_gp\n",
2091 dev->transport->name); 2056 dev->transport->name);
2092 } else {
2093 pr_debug("%s: Disabling ALUA Emulation for SPC-2"
2094 " device\n", dev->transport->name);
2095
2096 alua->alua_type = SPC2_ALUA_DISABLED;
2097 alua->alua_state_check = &core_alua_state_check_nop;
2098 } 2057 }
2099 2058
2100 return 0; 2059 return 0;
diff --git a/drivers/target/target_core_alua.h b/drivers/target/target_core_alua.h
index 5019157ffe69..a2af8aa15b98 100644
--- a/drivers/target/target_core_alua.h
+++ b/drivers/target/target_core_alua.h
@@ -132,5 +132,6 @@ extern ssize_t core_alua_show_secondary_write_metadata(struct se_lun *,
132extern ssize_t core_alua_store_secondary_write_metadata(struct se_lun *, 132extern ssize_t core_alua_store_secondary_write_metadata(struct se_lun *,
133 const char *, size_t); 133 const char *, size_t);
134extern int core_setup_alua(struct se_device *); 134extern int core_setup_alua(struct se_device *);
135extern int target_alua_state_check(struct se_cmd *cmd);
135 136
136#endif /* TARGET_CORE_ALUA_H */ 137#endif /* TARGET_CORE_ALUA_H */
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index 3d5570da41eb..7b473b66da7b 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -1615,15 +1615,9 @@ static ssize_t target_core_show_alua_lu_gp(void *p, char *page)
1615 struct t10_alua_lu_gp_member *lu_gp_mem; 1615 struct t10_alua_lu_gp_member *lu_gp_mem;
1616 ssize_t len = 0; 1616 ssize_t len = 0;
1617 1617
1618 if (dev->t10_alua.alua_type != SPC3_ALUA_EMULATED)
1619 return len;
1620
1621 lu_gp_mem = dev->dev_alua_lu_gp_mem; 1618 lu_gp_mem = dev->dev_alua_lu_gp_mem;
1622 if (!lu_gp_mem) { 1619 if (!lu_gp_mem)
1623 pr_err("NULL struct se_device->dev_alua_lu_gp_mem" 1620 return 0;
1624 " pointer\n");
1625 return -EINVAL;
1626 }
1627 1621
1628 spin_lock(&lu_gp_mem->lu_gp_mem_lock); 1622 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
1629 lu_gp = lu_gp_mem->lu_gp; 1623 lu_gp = lu_gp_mem->lu_gp;
@@ -1649,12 +1643,10 @@ static ssize_t target_core_store_alua_lu_gp(
1649 unsigned char buf[LU_GROUP_NAME_BUF]; 1643 unsigned char buf[LU_GROUP_NAME_BUF];
1650 int move = 0; 1644 int move = 0;
1651 1645
1652 if (dev->t10_alua.alua_type != SPC3_ALUA_EMULATED) { 1646 lu_gp_mem = dev->dev_alua_lu_gp_mem;
1653 pr_warn("SPC3_ALUA_EMULATED not enabled for %s/%s\n", 1647 if (!lu_gp_mem)
1654 config_item_name(&hba->hba_group.cg_item), 1648 return 0;
1655 config_item_name(&dev->dev_group.cg_item)); 1649
1656 return -EINVAL;
1657 }
1658 if (count > LU_GROUP_NAME_BUF) { 1650 if (count > LU_GROUP_NAME_BUF) {
1659 pr_err("ALUA LU Group Alias too large!\n"); 1651 pr_err("ALUA LU Group Alias too large!\n");
1660 return -EINVAL; 1652 return -EINVAL;
@@ -1675,14 +1667,6 @@ static ssize_t target_core_store_alua_lu_gp(
1675 if (!lu_gp_new) 1667 if (!lu_gp_new)
1676 return -ENODEV; 1668 return -ENODEV;
1677 } 1669 }
1678 lu_gp_mem = dev->dev_alua_lu_gp_mem;
1679 if (!lu_gp_mem) {
1680 if (lu_gp_new)
1681 core_alua_put_lu_gp_from_name(lu_gp_new);
1682 pr_err("NULL struct se_device->dev_alua_lu_gp_mem"
1683 " pointer\n");
1684 return -EINVAL;
1685 }
1686 1670
1687 spin_lock(&lu_gp_mem->lu_gp_mem_lock); 1671 spin_lock(&lu_gp_mem->lu_gp_mem_lock);
1688 lu_gp = lu_gp_mem->lu_gp; 1672 lu_gp = lu_gp_mem->lu_gp;
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 4ae1d3913821..3c3a3019ce7b 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -556,7 +556,8 @@ static void core_export_port(
556 list_add_tail(&port->sep_list, &dev->dev_sep_list); 556 list_add_tail(&port->sep_list, &dev->dev_sep_list);
557 spin_unlock(&dev->se_port_lock); 557 spin_unlock(&dev->se_port_lock);
558 558
559 if (dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) { 559 if (dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV &&
560 !(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) {
560 tg_pt_gp_mem = core_alua_allocate_tg_pt_gp_mem(port); 561 tg_pt_gp_mem = core_alua_allocate_tg_pt_gp_mem(port);
561 if (IS_ERR(tg_pt_gp_mem) || !tg_pt_gp_mem) { 562 if (IS_ERR(tg_pt_gp_mem) || !tg_pt_gp_mem) {
562 pr_err("Unable to allocate t10_alua_tg_pt" 563 pr_err("Unable to allocate t10_alua_tg_pt"
@@ -1398,7 +1399,6 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
1398 dev->dev_attrib.emulate_tas = DA_EMULATE_TAS; 1399 dev->dev_attrib.emulate_tas = DA_EMULATE_TAS;
1399 dev->dev_attrib.emulate_tpu = DA_EMULATE_TPU; 1400 dev->dev_attrib.emulate_tpu = DA_EMULATE_TPU;
1400 dev->dev_attrib.emulate_tpws = DA_EMULATE_TPWS; 1401 dev->dev_attrib.emulate_tpws = DA_EMULATE_TPWS;
1401 dev->dev_attrib.emulate_alua = DA_EMULATE_ALUA;
1402 dev->dev_attrib.enforce_pr_isids = DA_ENFORCE_PR_ISIDS; 1402 dev->dev_attrib.enforce_pr_isids = DA_ENFORCE_PR_ISIDS;
1403 dev->dev_attrib.is_nonrot = DA_IS_NONROT; 1403 dev->dev_attrib.is_nonrot = DA_IS_NONROT;
1404 dev->dev_attrib.emulate_rest_reord = DA_EMULATE_REST_REORD; 1404 dev->dev_attrib.emulate_rest_reord = DA_EMULATE_REST_REORD;
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index 862e4347f68f..7ecac453b11a 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -95,8 +95,7 @@ static int spc_emulate_inquiry_std(struct se_cmd *cmd, char *buf)
95 /* 95 /*
96 * Enable SCCS and TPGS fields for Emulated ALUA 96 * Enable SCCS and TPGS fields for Emulated ALUA
97 */ 97 */
98 if (dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) 98 spc_fill_alua_data(lun->lun_sep, buf);
99 spc_fill_alua_data(lun->lun_sep, buf);
100 99
101 buf[7] = 0x2; /* CmdQue=1 */ 100 buf[7] = 0x2; /* CmdQue=1 */
102 101
@@ -294,9 +293,6 @@ check_t10_vend_desc:
294 * Get the PROTOCOL IDENTIFIER as defined by spc4r17 293 * Get the PROTOCOL IDENTIFIER as defined by spc4r17
295 * section 7.5.1 Table 362 294 * section 7.5.1 Table 362
296 */ 295 */
297 if (dev->t10_alua.alua_type != SPC3_ALUA_EMULATED)
298 goto check_scsi_name;
299
300 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; 296 tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem;
301 if (!tg_pt_gp_mem) 297 if (!tg_pt_gp_mem)
302 goto check_lu_gp; 298 goto check_lu_gp;
@@ -1083,8 +1079,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1083 * MAINTENANCE_IN from SCC-2 1079 * MAINTENANCE_IN from SCC-2
1084 * Check for emulated MI_REPORT_TARGET_PGS 1080 * Check for emulated MI_REPORT_TARGET_PGS
1085 */ 1081 */
1086 if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS && 1082 if ((cdb[1] & 0x1f) == MI_REPORT_TARGET_PGS) {
1087 dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
1088 cmd->execute_cmd = 1083 cmd->execute_cmd =
1089 target_emulate_report_target_port_groups; 1084 target_emulate_report_target_port_groups;
1090 } 1085 }
@@ -1102,8 +1097,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
1102 * MAINTENANCE_OUT from SCC-2 1097 * MAINTENANCE_OUT from SCC-2
1103 * Check for emulated MO_SET_TARGET_PGS. 1098 * Check for emulated MO_SET_TARGET_PGS.
1104 */ 1099 */
1105 if (cdb[1] == MO_SET_TARGET_PGS && 1100 if (cdb[1] == MO_SET_TARGET_PGS) {
1106 dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) {
1107 cmd->execute_cmd = 1101 cmd->execute_cmd =
1108 target_emulate_set_target_port_groups; 1102 target_emulate_set_target_port_groups;
1109 } 1103 }
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index e996bdf480cf..c4c931b525d2 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -70,7 +70,6 @@ static void transport_handle_queue_full(struct se_cmd *cmd,
70static int transport_generic_get_mem(struct se_cmd *cmd); 70static int transport_generic_get_mem(struct se_cmd *cmd);
71static int target_get_sess_cmd(struct se_session *, struct se_cmd *, bool); 71static int target_get_sess_cmd(struct se_session *, struct se_cmd *, bool);
72static void transport_put_cmd(struct se_cmd *cmd); 72static void transport_put_cmd(struct se_cmd *cmd);
73static int transport_set_sense_codes(struct se_cmd *cmd, u8 asc, u8 ascq);
74static void target_complete_ok_work(struct work_struct *work); 73static void target_complete_ok_work(struct work_struct *work);
75 74
76int init_se_kmem_caches(void) 75int init_se_kmem_caches(void)
@@ -1103,7 +1102,6 @@ int target_setup_cmd_from_cdb(
1103 unsigned char *cdb) 1102 unsigned char *cdb)
1104{ 1103{
1105 struct se_device *dev = cmd->se_dev; 1104 struct se_device *dev = cmd->se_dev;
1106 u8 alua_ascq = 0;
1107 unsigned long flags; 1105 unsigned long flags;
1108 int ret; 1106 int ret;
1109 1107
@@ -1153,26 +1151,13 @@ int target_setup_cmd_from_cdb(
1153 return -EINVAL; 1151 return -EINVAL;
1154 } 1152 }
1155 1153
1156 ret = dev->t10_alua.alua_state_check(cmd, cdb, &alua_ascq); 1154 ret = target_alua_state_check(cmd);
1157 if (ret != 0) { 1155 if (ret) {
1158 /*
1159 * Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
1160 * The ALUA additional sense code qualifier (ASCQ) is determined
1161 * by the ALUA primary or secondary access state..
1162 */
1163 if (ret > 0) {
1164 pr_debug("[%s]: ALUA TG Port not available, "
1165 "SenseKey: NOT_READY, ASC/ASCQ: "
1166 "0x04/0x%02x\n",
1167 cmd->se_tfo->get_fabric_name(), alua_ascq);
1168
1169 transport_set_sense_codes(cmd, 0x04, alua_ascq);
1170 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
1171 cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
1172 return -EINVAL;
1173 }
1174 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; 1156 cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
1175 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; 1157 if (ret > 0)
1158 cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
1159 else
1160 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
1176 return -EINVAL; 1161 return -EINVAL;
1177 } 1162 }
1178 1163
@@ -2640,17 +2625,6 @@ static int transport_get_sense_codes(
2640 return 0; 2625 return 0;
2641} 2626}
2642 2627
2643static int transport_set_sense_codes(
2644 struct se_cmd *cmd,
2645 u8 asc,
2646 u8 ascq)
2647{
2648 cmd->scsi_asc = asc;
2649 cmd->scsi_ascq = ascq;
2650
2651 return 0;
2652}
2653
2654int transport_send_check_condition_and_sense( 2628int transport_send_check_condition_and_sense(
2655 struct se_cmd *cmd, 2629 struct se_cmd *cmd,
2656 u8 reason, 2630 u8 reason,