From 75a52a7bc999b15d23b7bbb006d42a70715e7bd9 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 10 Feb 2015 14:43:09 +0000 Subject: [PATCH] scst_local: Rework data direction detection code (merge r5989 from trunk) git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/2.2.x@6076 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst_local/scst_local.c | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/scst_local/scst_local.c b/scst_local/scst_local.c index 89db74641..2e4e6b0dc 100644 --- a/scst_local/scst_local.c +++ b/scst_local/scst_local.c @@ -1067,23 +1067,8 @@ static int scst_local_queuecommand_lck(struct scsi_cmnd *SCpnt, sgl_count = scsi_sg_count(SCpnt); #endif - dir = SCST_DATA_NONE; - switch (SCpnt->request->next_rq ? DMA_BIDIRECTIONAL : - SCpnt->sc_data_direction) { - case DMA_TO_DEVICE: - dir = SCST_DATA_WRITE; - scst_cmd_set_expected(scst_cmd, dir, scsi_bufflen(SCpnt)); - scst_cmd_set_noio_mem_alloc(scst_cmd); - scst_cmd_set_tgt_sg(scst_cmd, sgl, sgl_count); - break; - case DMA_FROM_DEVICE: - dir = SCST_DATA_READ; - scst_cmd_set_expected(scst_cmd, dir, scsi_bufflen(SCpnt)); - scst_cmd_set_noio_mem_alloc(scst_cmd); - scst_cmd_set_tgt_sg(scst_cmd, sgl, sgl_count); - break; - case DMA_BIDIRECTIONAL: -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24)) + if (scsi_bidi_cmnd(SCpnt)) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 24) /* Some of these symbols are only defined after 2.6.24 */ dir = SCST_DATA_BIDI; scst_cmd_set_expected(scst_cmd, dir, scsi_bufflen(SCpnt)); @@ -1093,13 +1078,20 @@ static int scst_local_queuecommand_lck(struct scsi_cmnd *SCpnt, scst_cmd_set_tgt_sg(scst_cmd, scsi_in(SCpnt)->table.sgl, scsi_in(SCpnt)->table.nents); scst_cmd_set_tgt_out_sg(scst_cmd, sgl, sgl_count); - break; #endif - case DMA_NONE: - default: + } else if (SCpnt->sc_data_direction == DMA_TO_DEVICE) { + dir = SCST_DATA_WRITE; + scst_cmd_set_expected(scst_cmd, dir, scsi_bufflen(SCpnt)); + scst_cmd_set_noio_mem_alloc(scst_cmd); + scst_cmd_set_tgt_sg(scst_cmd, sgl, sgl_count); + } else if (SCpnt->sc_data_direction == DMA_FROM_DEVICE) { + dir = SCST_DATA_READ; + scst_cmd_set_expected(scst_cmd, dir, scsi_bufflen(SCpnt)); + scst_cmd_set_noio_mem_alloc(scst_cmd); + scst_cmd_set_tgt_sg(scst_cmd, sgl, sgl_count); + } else { dir = SCST_DATA_NONE; scst_cmd_set_expected(scst_cmd, dir, 0); - break; } /* Save the correct thing below depending on version */