aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_sbc.c
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2015-02-13 20:32:11 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2015-02-13 21:09:45 -0500
commitafd73f1b60fc5883ea4982f68e9522e77b28f1e5 (patch)
treec8bfb7f917842b9cc8d0f0f24e71f3be869ba420 /drivers/target/target_core_sbc.c
parentf7b7c06f386c5e990acb87a8bc96137b9f978977 (diff)
target: Perform PROTECT sanity checks for WRITE_SAME
This patch adds a call to sbc_check_prot() within sbc_setup_write_same() code to perform the various protection releated sanity checks, including failing if WRPROTECT or RDPROTECT is set for a backend device that has not advertised support for T10-PI. Also, since WRITE_SAME + T10-PI is currently not supported by IBLOCK + FILEIO backends, go ahead and fail if ->execute_write_same() is invoked with a non zero cmd->prot_op. Cc: Martin Petersen <martin.petersen@oracle.com> Cc: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_sbc.c')
-rw-r--r--drivers/target/target_core_sbc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index 1bb8b4a93a66..87cbbe220151 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -37,6 +37,9 @@
37#include "target_core_alua.h" 37#include "target_core_alua.h"
38 38
39static sense_reason_t 39static sense_reason_t
40sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool);
41
42static sense_reason_t
40sbc_emulate_readcapacity(struct se_cmd *cmd) 43sbc_emulate_readcapacity(struct se_cmd *cmd)
41{ 44{
42 struct se_device *dev = cmd->se_dev; 45 struct se_device *dev = cmd->se_dev;
@@ -254,6 +257,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
254 struct se_device *dev = cmd->se_dev; 257 struct se_device *dev = cmd->se_dev;
255 sector_t end_lba = dev->transport->get_blocks(dev) + 1; 258 sector_t end_lba = dev->transport->get_blocks(dev) + 1;
256 unsigned int sectors = sbc_get_write_same_sectors(cmd); 259 unsigned int sectors = sbc_get_write_same_sectors(cmd);
260 sense_reason_t ret;
257 261
258 if ((flags[0] & 0x04) || (flags[0] & 0x02)) { 262 if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
259 pr_err("WRITE_SAME PBDATA and LBDATA" 263 pr_err("WRITE_SAME PBDATA and LBDATA"
@@ -295,6 +299,10 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
295 if (!ops->execute_write_same) 299 if (!ops->execute_write_same)
296 return TCM_UNSUPPORTED_SCSI_OPCODE; 300 return TCM_UNSUPPORTED_SCSI_OPCODE;
297 301
302 ret = sbc_check_prot(dev, cmd, &cmd->t_task_cdb[0], sectors, true);
303 if (ret)
304 return ret;
305
298 cmd->execute_cmd = ops->execute_write_same; 306 cmd->execute_cmd = ops->execute_write_same;
299 return 0; 307 return 0;
300} 308}