target/qla2xxx: Honor max_data_sg_nents I/O transfer limit
This patch adds an optional fabric driver provided SGL limit that target-core will honor as it's own internal I/O maximum transfer length limit, as exposed by EVPD=0xb0 block limits parameters. This is required for handling cases when host I/O transfer length exceeds the requested EVPD block limits maximum transfer length. The initial user of this logic is qla2xxx, so that we can avoid having to reject I/Os from some legacy FC hosts where EVPD=0xb0 parameters are not honored. When se_cmd payload length exceeds the provided limit in target_check_max_data_sg_nents() code, se_cmd->data_length + se_cmd->prot_length are reset with se_cmd->residual_count plus underflow bit for outgoing TFO response callbacks. It also checks for existing CDB level underflow + overflow and recalculates final residual_count as necessary. Note this patch currently assumes 1:1 mapping of PAGE_SIZE per struct scatterlist entry. Reported-by: Craig Watson <craig.watson@vanguard-rugged.com> Cc: Craig Watson <craig.watson@vanguard-rugged.com> Tested-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Cc: Roland Dreier <roland@purestorage.com> Cc: Arun Easi <arun.easi@qlogic.com> Cc: Giridhar Malavali <giridhar.malavali@qlogic.com> Cc: Andrew Vasquez <andrew.vasquez@qlogic.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
@@ -5,6 +5,19 @@ struct target_core_fabric_ops {
|
||||
struct module *module;
|
||||
const char *name;
|
||||
size_t node_acl_size;
|
||||
/*
|
||||
* Limits number of scatterlist entries per SCF_SCSI_DATA_CDB payload.
|
||||
* Setting this value tells target-core to enforce this limit, and
|
||||
* report as INQUIRY EVPD=b0 MAXIMUM TRANSFER LENGTH.
|
||||
*
|
||||
* target-core will currently reset se_cmd->data_length to this
|
||||
* maximum size, and set UNDERFLOW residual count if length exceeds
|
||||
* this limit.
|
||||
*
|
||||
* XXX: Not all initiator hosts honor this block-limit EVPD
|
||||
* XXX: Currently assumes single PAGE_SIZE per scatterlist entry
|
||||
*/
|
||||
u32 max_data_sg_nents;
|
||||
char *(*get_fabric_name)(void);
|
||||
char *(*tpg_get_wwn)(struct se_portal_group *);
|
||||
u16 (*tpg_get_tag)(struct se_portal_group *);
|
||||
|
Reference in New Issue
Block a user