|
@@ -174,6 +174,24 @@ static int tcm_loop_new_cmd_map(struct se_cmd *se_cmd)
|
|
|
sgl_bidi = sdb->table.sgl;
|
|
|
sgl_bidi_count = sdb->table.nents;
|
|
|
}
|
|
|
+ /*
|
|
|
+ * Because some userspace code via scsi-generic do not memset their
|
|
|
+ * associated read buffers, go ahead and do that here for type
|
|
|
+ * SCF_SCSI_CONTROL_SG_IO_CDB. Also note that this is currently
|
|
|
+ * guaranteed to be a single SGL for SCF_SCSI_CONTROL_SG_IO_CDB
|
|
|
+ * by target core in transport_generic_allocate_tasks() ->
|
|
|
+ * transport_generic_cmd_sequencer().
|
|
|
+ */
|
|
|
+ if (se_cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB &&
|
|
|
+ se_cmd->data_direction == DMA_FROM_DEVICE) {
|
|
|
+ struct scatterlist *sg = scsi_sglist(sc);
|
|
|
+ unsigned char *buf = kmap(sg_page(sg)) + sg->offset;
|
|
|
+
|
|
|
+ if (buf != NULL) {
|
|
|
+ memset(buf, 0, sg->length);
|
|
|
+ kunmap(sg_page(sg));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/* Tell the core about our preallocated memory */
|
|
|
ret = transport_generic_map_mem_to_cmd(se_cmd, scsi_sglist(sc),
|