Re: [PATCH v2 04/12] Target/sbc: don't return from sbc_check for non prot_sg

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 3/11/2014 4:21 AM, Nicholas A. Bellinger wrote:
On Sun, 2014-03-09 at 13:16 +0200, Sagi Grimberg wrote:
On 3/7/2014 10:33 PM, Martin K. Petersen wrote:
"nab" == Nicholas A Bellinger <nab@xxxxxxxxxxxxxxx> writes:
The alternative is to avoid this patch but then we might miss DIF
support when working against legacy initiators.
nab> Mmmm, not sure about this one..

nab> Considering that it's only the first two READ_10s that this effects
nab> before normal SCSI_PROT_*_PASS operation kicks in, I'm not sure if
nab> it's worth it to add these to tcm_loop..  Note that virtio-scsi +
nab> vhost-scsi would need similar bits as well..

The fact that initiator and target are capable of handling protection
information does not in any way guarantee that all reads and writes will
have PI included. We need to be able to turn off checking for things
like recovery and RAID.

So in my book it is crucial that both initiator and target do exactly
what they are told by the ULD. This means the initiator should only do
DIX if the prot_op tells it to.
Right, but what do we expect from the LLD to do when prot_op is
READ_STRIP/WRITE_GENERATE (non-DIX)?
I would expect that for WRITE_GENERATE the LLD will allocate protection
sg-list and compute DIF right?
And for READ_STRIP I would imagine that the LLD will "receive"
protection sg-list from the target and "strip"
it. Now since vhost_scsi/tcm_loop are calling target_submit_map_sgls()
they emulate both the initiator LLD
and the target LLD. So perhaps they should provide the target protection
sg-list for target to do checks and just
not pass it to scsi_cmnd. what do you think?

And on the target end you should only do
DIF transfers and checks if *PROTECT is set in the CDB.
So you don't think there is any value in offering target that can
protect it's stored data against legacy initiators?

Some HBAs support a mode in which they snoop (or silently issue)
INQUIRY/READ CAPACITY(16). And they will turn on protected transfers
behind the OS' back under the assumption that the OS is not aware of
DIF. Let's not go there!

Yes, this doesn't seem like a good isea to me as well.

So back to the original breakage..

I think resetting se_cmd->prot_op to TARGET_PROT_NORMAL when no
accompanying protection buffer has been passed by the fabric driver
makes the most sense here for the two pre-protection READ_10s headed
towards local tcm_loop + vhost-scsi ports.

Other than these two special fabric cases, allowing ib_iser (and other
fabrics that actually move data over the wire) to perform hardware
assisted READ_STRIP + WRITE_GENERATE is perfectly fine based on
scsi_cmnd prot_op hints or RDPROTECT + WRPROTECT CDB bits.

Are you referring to iser initiator or iser target? or both?


Care to re-spin this particular patch with this in mind..?

--nab


Hey Nic,

So if I understand the suggestion correctly, I'm facing a chicken and egg conflict loop here for isert. iser/iscsi calls target_setup_cmd_from_cdb() and then target_generic_new_cmd(). Meaning it allocates the data+protection buffers according the specification in se_cmd (set according to the CDB and the backstore configuration). So re resetting se_cmd->prot_op to TARGET_PROT_NORMAL when no accompanying protection buffer has been passed by the fabric driver would not allow isert to support ADD/STRIP since the allocation part comes after.

What we can do here is reset se_cmd->prot_op to TARGET_PROT_NORMAL in target_submit_cmd_map_sgls() *after* calling target_setup_cmd_from_cdb() . This will address tcm_loop & vhost_scsi but would keep
isert working also against legacy initiators.

Is the below acceptable?

diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index ed84783..f48256f 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1387,11 +1387,9 @@ int target_submit_cmd_map_sgls(struct se_cmd *se_cmd, struct se_session *se_sess
         */
        if ((!se_cmd->t_prot_sg || !se_cmd->t_prot_nents) &&
            (se_cmd->prot_op != TARGET_PROT_NORMAL)) {
-               pr_err("ERROR: protection information was requested but "
-                      "protection buffers weren't provided.\n");
-               transport_generic_request_failure(se_cmd,
- TCM_INVALID_CDB_FIELD);
-               return 0;
+               pr_debug("protection information was requested but "
+ "protection buffers weren't provided. continue unprotected...\n");
+               se_cmd->prot_op = TARGET_PROT_NORMAL;
        }

        /*

Sagi.
--
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




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux