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

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 @@ static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
	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;
	}