target: Add internal WRITE_STRIP support
This patch adds WRITE_STRIP support in target_write_prot_action() 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. (Use ilog2 instead of division and unlikely for pi_err - Sagi) Reviewed-by: Martin Petersen <martin.petersen@oracle.com> Reviewed-by: Sagi Grimberg <sagig@mellanox.com> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
aa58b53168
commit
5132d1e655
|
@ -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;
|
||||
|
|
|
@ -1740,6 +1740,7 @@ void __target_execute_cmd(struct se_cmd *cmd)
|
|||
|
||||
static int target_write_prot_action(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_write_prot_action(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 >> ilog2(cmd->se_dev->dev_attrib.block_size);
|
||||
cmd->pi_err = sbc_dif_verify_write(cmd, cmd->t_task_lba,
|
||||
sectors, 0, NULL, 0);
|
||||
if (unlikely(cmd->pi_err)) {
|
||||
spin_lock_irq(&cmd->t_state_lock);
|
||||
cmd->transport_state &= ~CMD_T_BUSY|CMD_T_SENT;
|
||||
spin_unlock_irq(&cmd->t_state_lock);
|
||||
transport_generic_request_failure(cmd, cmd->pi_err);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue