|
@@ -179,7 +179,7 @@ static void tcm_loop_submission_work(struct work_struct *work)
|
|
struct tcm_loop_hba *tl_hba;
|
|
struct tcm_loop_hba *tl_hba;
|
|
struct tcm_loop_tpg *tl_tpg;
|
|
struct tcm_loop_tpg *tl_tpg;
|
|
struct scatterlist *sgl_bidi = NULL;
|
|
struct scatterlist *sgl_bidi = NULL;
|
|
- u32 sgl_bidi_count = 0;
|
|
|
|
|
|
+ u32 sgl_bidi_count = 0, transfer_length;
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host);
|
|
tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host);
|
|
@@ -213,12 +213,21 @@ static void tcm_loop_submission_work(struct work_struct *work)
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- if (!scsi_prot_sg_count(sc) && scsi_get_prot_op(sc) != SCSI_PROT_NORMAL)
|
|
|
|
|
|
+ transfer_length = scsi_transfer_length(sc);
|
|
|
|
+ if (!scsi_prot_sg_count(sc) &&
|
|
|
|
+ scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) {
|
|
se_cmd->prot_pto = true;
|
|
se_cmd->prot_pto = true;
|
|
|
|
+ /*
|
|
|
|
+ * loopback transport doesn't support
|
|
|
|
+ * WRITE_GENERATE, READ_STRIP protection
|
|
|
|
+ * information operations, go ahead unprotected.
|
|
|
|
+ */
|
|
|
|
+ transfer_length = scsi_bufflen(sc);
|
|
|
|
+ }
|
|
|
|
|
|
rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd,
|
|
rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd,
|
|
&tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun,
|
|
&tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun,
|
|
- scsi_bufflen(sc), tcm_loop_sam_attr(sc),
|
|
|
|
|
|
+ transfer_length, tcm_loop_sam_attr(sc),
|
|
sc->sc_data_direction, 0,
|
|
sc->sc_data_direction, 0,
|
|
scsi_sglist(sc), scsi_sg_count(sc),
|
|
scsi_sglist(sc), scsi_sg_count(sc),
|
|
sgl_bidi, sgl_bidi_count,
|
|
sgl_bidi, sgl_bidi_count,
|