{
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
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;
}