On Mon, 2015-03-30 at 11:01 +0300, Sagi Grimberg wrote: > On 3/30/2015 6:28 AM, Nicholas A. Bellinger wrote: > > From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > > > > This patch adds WRITE_STRIP support in target_check_write_prot() that > > invokes sbc_dif_verify_write() for checking T10-PI metadata before > > submitting the I/O to a backend driver. > > > > Upon verify failure, the specific sense code is propigated up the > > failure path up to transport_generic_request_failure(). > > > > Also, update sbc_dif_verify_write() to only perform the subsequent > > protection metadata copy when a valid *sg is passed. > > > > Cc: Martin Petersen <martin.petersen@xxxxxxxxxx> > > Cc: Sagi Grimberg <sagig@xxxxxxxxxxxx> > > Cc: Christoph Hellwig <hch@xxxxxx> > > Signed-off-by: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx> > > --- > > drivers/target/target_core_sbc.c | 3 +++ > > drivers/target/target_core_transport.c | 16 ++++++++++++++++ > > 2 files changed, 19 insertions(+) > > > > diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c > > index 68373c9..ea23b9c 100644 > > --- a/drivers/target/target_core_sbc.c > > +++ b/drivers/target/target_core_sbc.c > > @@ -1342,6 +1342,9 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors, > > kunmap_atomic(paddr); > > kunmap_atomic(daddr); > > } > > + if (!sg) > > + return 0; > > + > > sbc_dif_copy_prot(cmd, sectors, false, sg, sg_off); > > > > return 0; > > diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c > > index 6a24151..51b62bd 100644 > > --- a/drivers/target/target_core_transport.c > > +++ b/drivers/target/target_core_transport.c > > @@ -1740,6 +1740,7 @@ void __target_execute_cmd(struct se_cmd *cmd) > > > > static int target_check_write_prot(struct se_cmd *cmd) > > { > > + u32 sectors; > > /* > > * Perform WRITE_INSERT of PI using software emulation when backend > > * device has PI enabled, if the transport has not already generated > > @@ -1750,6 +1751,21 @@ static int target_check_write_prot(struct se_cmd *cmd) > > if (!(cmd->se_sess->sup_prot_ops & TARGET_PROT_DOUT_INSERT)) > > sbc_dif_generate(cmd); > > break; > > + case TARGET_PROT_DOUT_STRIP: > > + if (cmd->se_sess->sup_prot_ops & TARGET_PROT_DOUT_STRIP) > > + break; > > + > > + sectors = cmd->data_length / cmd->se_dev->dev_attrib.block_size; > > Better to use data_length >> ilog2(block_size) and avoiding div in the > IO path. > Done. > > + cmd->pi_err = sbc_dif_verify_write(cmd, cmd->t_task_lba, > > + sectors, 0, NULL, 0); > > + if (cmd->pi_err) { > > unlikely() > Done. -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html