Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6bb7a96 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by Jens Axboe
Browse files

scsi: simplify the bidi completion



Let's use blk_end_request_all() instead of blk_end_bidi_request().

Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 1822952b
Loading
Loading
Loading
Loading
+13 −30
Original line number Diff line number Diff line
@@ -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 */