Message ID | 1499974037.7987.24.camel@haakon3.daterainc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 2017-07-13 at 12:27 -0700, Nicholas A. Bellinger wrote: > For the former, I've still never seen a host environment in the wild > over the last 15 years that generates underflow/overflow for DATA CDBs > with an LBA. So I'm reluctant to randomly allow this for all cases and > fabrics, considering no host environment actually requires it. > > That said, I do understand libiscsi generates this for WRITE_VERIFY, but > I'm still undecided if that's a good enough a reason to enable it for > all cases in upstream. > > For the latter item, it's fine to drop the legacy block_size != 512 > check, and I'll take a patch for that separate from the other bit. Hello Nic, Thanks for considering to drop the block_size != 512 check. There is one side effect of the current code for handling WRITE underflows that has not yet been mentioned in this e-mail thread. The current implementation of the iSCSI target driver does not discard the entire immediate data buffer if the size of that buffer is larger than the data buffer size derived from the SCSI CDB (EDTL). Because of this the iSCSI target driver will attempt to parse some of the immediate data as an iSCSI PDU. This can cause very weird failures and error messages. I think we should address this and also that we should make sure that any iSCSI PDUs that follow a too large immediate data buffer are parsed correctly. Bart.-- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index c28e3b58150b..6cd49fe578a7 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -1164,23 +1164,6 @@ target_cmd_size_check(struct se_cmd *cmd, unsigned int size) " %u does not match SCSI CDB Length: %u for SAM Opcode:" " 0x%02x\n", cmd->se_tfo->get_fabric_name(), cmd->data_length, size, cmd->t_task_cdb[0]); - - if (cmd->data_direction == DMA_TO_DEVICE && - cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { - pr_err("Rejecting underflow/overflow WRITE data\n"); - return TCM_INVALID_CDB_FIELD; - } - /* - * Reject READ_* or WRITE_* with overflow/underflow for - * type SCF_SCSI_DATA_CDB. - */ - if (dev->dev_attrib.block_size != 512) { - pr_err("Failing OVERFLOW/UNDERFLOW for LBA op" - " CDB on non 512-byte sector setup subsystem" - " plugin: %s\n", dev->transport->name); - /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ - return TCM_INVALID_CDB_FIELD; - } /* * For the overflow case keep the existing fabric provided * ->data_length. Otherwise for the underflow case, reset