Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afd73f1b authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

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: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent f7b7c06f
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -494,6 +494,11 @@ fd_execute_write_same(struct se_cmd *cmd)
		target_complete_cmd(cmd, SAM_STAT_GOOD);
		target_complete_cmd(cmd, SAM_STAT_GOOD);
		return 0;
		return 0;
	}
	}
	if (cmd->prot_op) {
		pr_err("WRITE_SAME: Protection information with FILEIO"
		       " backends not supported\n");
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
	}
	sg = &cmd->t_data_sg[0];
	sg = &cmd->t_data_sg[0];


	if (cmd->t_data_nents > 1 ||
	if (cmd->t_data_nents > 1 ||
+5 −0
Original line number Original line Diff line number Diff line
@@ -464,6 +464,11 @@ iblock_execute_write_same(struct se_cmd *cmd)
	sector_t block_lba = cmd->t_task_lba;
	sector_t block_lba = cmd->t_task_lba;
	sector_t sectors = sbc_get_write_same_sectors(cmd);
	sector_t sectors = sbc_get_write_same_sectors(cmd);


	if (cmd->prot_op) {
		pr_err("WRITE_SAME: Protection information with IBLOCK"
		       " backends not supported\n");
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
	}
	sg = &cmd->t_data_sg[0];
	sg = &cmd->t_data_sg[0];


	if (cmd->t_data_nents > 1 ||
	if (cmd->t_data_nents > 1 ||
+8 −0
Original line number Original line Diff line number Diff line
@@ -36,6 +36,9 @@
#include "target_core_ua.h"
#include "target_core_ua.h"
#include "target_core_alua.h"
#include "target_core_alua.h"


static sense_reason_t
sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, bool);

static sense_reason_t
static sense_reason_t
sbc_emulate_readcapacity(struct se_cmd *cmd)
sbc_emulate_readcapacity(struct se_cmd *cmd)
{
{
@@ -254,6 +257,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops *o
	struct se_device *dev = cmd->se_dev;
	struct se_device *dev = cmd->se_dev;
	sector_t end_lba = dev->transport->get_blocks(dev) + 1;
	sector_t end_lba = dev->transport->get_blocks(dev) + 1;
	unsigned int sectors = sbc_get_write_same_sectors(cmd);
	unsigned int sectors = sbc_get_write_same_sectors(cmd);
	sense_reason_t ret;


	if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
	if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
		pr_err("WRITE_SAME PBDATA and LBDATA"
		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
	if (!ops->execute_write_same)
	if (!ops->execute_write_same)
		return TCM_UNSUPPORTED_SCSI_OPCODE;
		return TCM_UNSUPPORTED_SCSI_OPCODE;


	ret = sbc_check_prot(dev, cmd, &cmd->t_task_cdb[0], sectors, true);
	if (ret)
		return ret;

	cmd->execute_cmd = ops->execute_write_same;
	cmd->execute_cmd = ops->execute_write_same;
	return 0;
	return 0;
}
}