|
@@ -672,33 +672,6 @@ void scsi_release_buffers(struct scsi_cmnd *cmd)
|
|
|
}
|
|
|
EXPORT_SYMBOL(scsi_release_buffers);
|
|
|
|
|
|
-/*
|
|
|
- * Bidi commands Must be complete as a whole, both sides at once. If
|
|
|
- * part of the bytes were written and lld returned scsi_in()->resid
|
|
|
- * and/or scsi_out()->resid this information will be left in
|
|
|
- * req->resid_len and req->next_rq->resid_len. The upper-layer driver
|
|
|
- * can decide what to do with this information.
|
|
|
- */
|
|
|
-static void scsi_end_bidi_request(struct scsi_cmnd *cmd)
|
|
|
-{
|
|
|
- struct request *req = cmd->request;
|
|
|
-
|
|
|
- req->resid_len = scsi_out(cmd)->resid;
|
|
|
- req->next_rq->resid_len = scsi_in(cmd)->resid;
|
|
|
-
|
|
|
- /* The req and req->next_rq have not been completed */
|
|
|
- BUG_ON(blk_end_bidi_request(req, 0, blk_rq_bytes(req),
|
|
|
- blk_rq_bytes(req->next_rq)));
|
|
|
-
|
|
|
- scsi_release_buffers(cmd);
|
|
|
-
|
|
|
- /*
|
|
|
- * This will goose the queue request function at the end, so we don't
|
|
|
- * need to worry about launching another command.
|
|
|
- */
|
|
|
- scsi_next_command(cmd);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Function: scsi_io_completion()
|
|
|
*
|
|
@@ -772,12 +745,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
|
|
|
if (!sense_deferred)
|
|
|
error = -EIO;
|
|
|
}
|
|
|
+
|
|
|
+ req->resid_len = scsi_get_resid(cmd);
|
|
|
+
|
|
|
if (scsi_bidi_cmnd(cmd)) {
|
|
|
- /* will also release_buffers */
|
|
|
- scsi_end_bidi_request(cmd);
|
|
|
+ /*
|
|
|
+ * Bidi commands Must be complete as a whole,
|
|
|
+ * both sides at once.
|
|
|
+ */
|
|
|
+ req->next_rq->resid_len = scsi_in(cmd)->resid;
|
|
|
+
|
|
|
+ blk_end_request_all(req, 0);
|
|
|
+
|
|
|
+ scsi_release_buffers(cmd);
|
|
|
+ scsi_next_command(cmd);
|
|
|
return;
|
|
|
}
|
|
|
- req->resid_len = scsi_get_resid(cmd);
|
|
|
}
|
|
|
|
|
|
BUG_ON(blk_bidi_rq(req)); /* bidi not support for !blk_pc_request yet */
|