From f9eda935755dbe9ccbdee17792df9bbdf9cdb855 Mon Sep 17 00:00:00 2001 From: Richard Sharpe Date: Mon, 9 Aug 2010 14:48:20 +0000 Subject: [PATCH] More correctly handle residuals according to the guidelines. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1944 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst_local/scst_local.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scst_local/scst_local.c b/scst_local/scst_local.c index 066a7eb9b..7b23683c6 100644 --- a/scst_local/scst_local.c +++ b/scst_local/scst_local.c @@ -1182,26 +1182,26 @@ static int scst_local_targ_xmit_response(struct scst_cmd *scst_cmd) * This might have to change to use the two status flags */ if (scst_cmd_get_is_send_status(scst_cmd)) { - int resid = 0; + int resid = 0, out_resid = 0; /* * Calculate the residual ... */ - switch (tgt_specific->cmnd->sc_data_direction) { - case DMA_TO_DEVICE: - resid = (signed)scst_cmd_get_bufflen(scst_cmd) - - scsi_bufflen(tgt_specific->cmnd); - break; - case DMA_FROM_DEVICE: - resid = (signed)scsi_bufflen(tgt_specific->cmnd) - - scst_cmd_get_resp_data_len(scst_cmd); - break; - default: - resid = 0; - break; + if (likely(!scst_get_resid(scst_cmd, &resid, &out_resid))) { + TRACE_DBG("No residuals for request %p", + tgt_specific->cmnd); + } else { + if (out_resid != 0) + PRINT_ERROR("Unable to return OUT residual %d " + "(op %02x)", out_resid, + tgt_specific->cmnd->cmnd[0]); } scsi_set_resid(tgt_specific->cmnd, resid); + /* + * It seems like there is no way to set out_resid ... + */ + (void)scst_local_send_resp(tgt_specific->cmnd, scst_cmd, tgt_specific->done, scst_cmd_get_status(scst_cmd));