aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryant G. Ly <bryantly@linux.vnet.ibm.com>2017-04-21 21:40:50 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2017-05-02 01:21:45 -0400
commit4ec5bf0ea83930b96addf6b78225bf0355459d7f (patch)
tree7369ecac6c53dacd520b4442ccfc99903fd33cef
parentc2d26f18dcbc84799457852292c66967ff6626f1 (diff)
target/user: PGR Support
This adds initial PGR support for just TCMU, since tcmu doesn't have the necessary IT_NEXUS info to process PGR in userspace, so have those commands be processed in kernel. HA support is not available yet, we will work on it if this patch is acceptable. Signed-off-by: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_configfs.c10
-rw-r--r--drivers/target/target_core_device.c38
-rw-r--r--drivers/target/target_core_pr.c2
-rw-r--r--drivers/target/target_core_pscsi.c3
-rw-r--r--include/target/target_core_backend.h1
5 files changed, 47 insertions, 7 deletions
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index a34a86652b96..e7b62bc239a7 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -1400,7 +1400,7 @@ static ssize_t target_pr_res_holder_show(struct config_item *item, char *page)
1400 struct se_device *dev = pr_to_dev(item); 1400 struct se_device *dev = pr_to_dev(item);
1401 int ret; 1401 int ret;
1402 1402
1403 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 1403 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1404 return sprintf(page, "Passthrough\n"); 1404 return sprintf(page, "Passthrough\n");
1405 1405
1406 spin_lock(&dev->dev_reservation_lock); 1406 spin_lock(&dev->dev_reservation_lock);
@@ -1540,7 +1540,7 @@ static ssize_t target_pr_res_type_show(struct config_item *item, char *page)
1540{ 1540{
1541 struct se_device *dev = pr_to_dev(item); 1541 struct se_device *dev = pr_to_dev(item);
1542 1542
1543 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 1543 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1544 return sprintf(page, "SPC_PASSTHROUGH\n"); 1544 return sprintf(page, "SPC_PASSTHROUGH\n");
1545 else if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) 1545 else if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
1546 return sprintf(page, "SPC2_RESERVATIONS\n"); 1546 return sprintf(page, "SPC2_RESERVATIONS\n");
@@ -1553,7 +1553,7 @@ static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
1553{ 1553{
1554 struct se_device *dev = pr_to_dev(item); 1554 struct se_device *dev = pr_to_dev(item);
1555 1555
1556 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 1556 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1557 return 0; 1557 return 0;
1558 1558
1559 return sprintf(page, "APTPL Bit Status: %s\n", 1559 return sprintf(page, "APTPL Bit Status: %s\n",
@@ -1565,7 +1565,7 @@ static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item,
1565{ 1565{
1566 struct se_device *dev = pr_to_dev(item); 1566 struct se_device *dev = pr_to_dev(item);
1567 1567
1568 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 1568 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1569 return 0; 1569 return 0;
1570 1570
1571 return sprintf(page, "Ready to process PR APTPL metadata..\n"); 1571 return sprintf(page, "Ready to process PR APTPL metadata..\n");
@@ -1611,7 +1611,7 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
1611 u16 tpgt = 0; 1611 u16 tpgt = 0;
1612 u8 type = 0; 1612 u8 type = 0;
1613 1613
1614 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 1614 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
1615 return count; 1615 return count;
1616 if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) 1616 if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
1617 return count; 1617 return count;
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index c754ae33bf7b..c4845678eb91 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -1045,6 +1045,8 @@ passthrough_parse_cdb(struct se_cmd *cmd,
1045 sense_reason_t (*exec_cmd)(struct se_cmd *cmd)) 1045 sense_reason_t (*exec_cmd)(struct se_cmd *cmd))
1046{ 1046{
1047 unsigned char *cdb = cmd->t_task_cdb; 1047 unsigned char *cdb = cmd->t_task_cdb;
1048 struct se_device *dev = cmd->se_dev;
1049 unsigned int size;
1048 1050
1049 /* 1051 /*
1050 * Clear a lun set in the cdb if the initiator talking to use spoke 1052 * Clear a lun set in the cdb if the initiator talking to use spoke
@@ -1076,6 +1078,42 @@ passthrough_parse_cdb(struct se_cmd *cmd,
1076 return TCM_NO_SENSE; 1078 return TCM_NO_SENSE;
1077 } 1079 }
1078 1080
1081 /*
1082 * For PERSISTENT RESERVE IN/OUT, RELEASE, and RESERVE we need to
1083 * emulate the response, since tcmu does not have the information
1084 * required to process these commands.
1085 */
1086 if (!(dev->transport->transport_flags &
1087 TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
1088 if (cdb[0] == PERSISTENT_RESERVE_IN) {
1089 cmd->execute_cmd = target_scsi3_emulate_pr_in;
1090 size = (cdb[7] << 8) + cdb[8];
1091 return target_cmd_size_check(cmd, size);
1092 }
1093 if (cdb[0] == PERSISTENT_RESERVE_OUT) {
1094 cmd->execute_cmd = target_scsi3_emulate_pr_out;
1095 size = (cdb[7] << 8) + cdb[8];
1096 return target_cmd_size_check(cmd, size);
1097 }
1098
1099 if (cdb[0] == RELEASE || cdb[0] == RELEASE_10) {
1100 cmd->execute_cmd = target_scsi2_reservation_release;
1101 if (cdb[0] == RELEASE_10)
1102 size = (cdb[7] << 8) | cdb[8];
1103 else
1104 size = cmd->data_length;
1105 return target_cmd_size_check(cmd, size);
1106 }
1107 if (cdb[0] == RESERVE || cdb[0] == RESERVE_10) {
1108 cmd->execute_cmd = target_scsi2_reservation_reserve;
1109 if (cdb[0] == RESERVE_10)
1110 size = (cdb[7] << 8) | cdb[8];
1111 else
1112 size = cmd->data_length;
1113 return target_cmd_size_check(cmd, size);
1114 }
1115 }
1116
1079 /* Set DATA_CDB flag for ops that should have it */ 1117 /* Set DATA_CDB flag for ops that should have it */
1080 switch (cdb[0]) { 1118 switch (cdb[0]) {
1081 case READ_6: 1119 case READ_6:
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index e18051185846..129ca572673c 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -4147,7 +4147,7 @@ target_check_reservation(struct se_cmd *cmd)
4147 return 0; 4147 return 0;
4148 if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) 4148 if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
4149 return 0; 4149 return 0;
4150 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) 4150 if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
4151 return 0; 4151 return 0;
4152 4152
4153 spin_lock(&dev->dev_reservation_lock); 4153 spin_lock(&dev->dev_reservation_lock);
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index 94cda7991e80..8943a62eb203 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -1081,7 +1081,8 @@ static const struct target_backend_ops pscsi_ops = {
1081 .name = "pscsi", 1081 .name = "pscsi",
1082 .owner = THIS_MODULE, 1082 .owner = THIS_MODULE,
1083 .transport_flags = TRANSPORT_FLAG_PASSTHROUGH | 1083 .transport_flags = TRANSPORT_FLAG_PASSTHROUGH |
1084 TRANSPORT_FLAG_PASSTHROUGH_ALUA, 1084 TRANSPORT_FLAG_PASSTHROUGH_ALUA |
1085 TRANSPORT_FLAG_PASSTHROUGH_PGR,
1085 .attach_hba = pscsi_attach_hba, 1086 .attach_hba = pscsi_attach_hba,
1086 .detach_hba = pscsi_detach_hba, 1087 .detach_hba = pscsi_detach_hba,
1087 .pmode_enable_hba = pscsi_pmode_enable_hba, 1088 .pmode_enable_hba = pscsi_pmode_enable_hba,
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h
index 1b0f447ce850..e475531565fd 100644
--- a/include/target/target_core_backend.h
+++ b/include/target/target_core_backend.h
@@ -10,6 +10,7 @@
10 * backend module. 10 * backend module.
11 */ 11 */
12#define TRANSPORT_FLAG_PASSTHROUGH_ALUA 0x2 12#define TRANSPORT_FLAG_PASSTHROUGH_ALUA 0x2
13#define TRANSPORT_FLAG_PASSTHROUGH_PGR 0x4
13 14
14struct request_queue; 15struct request_queue;
15struct scatterlist; 16struct scatterlist;