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

libata sg chaining support fix

parent f1346372
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -4952,16 +4952,18 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
{
	int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
	struct scatterlist *sg = qc->__sg;
	struct scatterlist *lsg = sg_last(qc->__sg, qc->n_elem);
	struct ata_port *ap = qc->ap;
	struct page *page;
	unsigned char *buf;
	unsigned int offset, count;
	int no_more_sg = 0;

	if (qc->curbytes + bytes >= qc->nbytes)
		ap->hsm_task_state = HSM_ST_LAST;

next_sg:
	if (unlikely(qc->cursg == sg_last(qc->__sg, qc->n_elem))) {
	if (unlikely(no_more_sg)) {
		/*
		 * The end of qc->sg is reached and the device expects
		 * more data to transfer. In order not to overrun qc->sg
@@ -5023,6 +5025,9 @@ next_sg:
	qc->cursg_ofs += count;

	if (qc->cursg_ofs == sg->length) {
		if (qc->cursg == lsg)
			no_more_sg = 1;

		qc->cursg = sg_next(qc->cursg);
		qc->cursg_ofs = 0;
	}