diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-02-13 20:32:11 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-02-13 21:09:45 -0500 |
commit | afd73f1b60fc5883ea4982f68e9522e77b28f1e5 (patch) | |
tree | c8bfb7f917842b9cc8d0f0f24e71f3be869ba420 /drivers/target/target_core_sbc.c | |
parent | f7b7c06f386c5e990acb87a8bc96137b9f978977 (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.c | 8 |
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 | ||
39 | static sense_reason_t | 39 | static sense_reason_t |
40 | sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool); | ||
41 | |||
42 | static sense_reason_t | ||
40 | sbc_emulate_readcapacity(struct se_cmd *cmd) | 43 | sbc_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 | } |