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

Commit b41e9c7b authored by Pierre Ossman's avatar Pierre Ossman
Browse files

mmc_block: use proper sg iterators



Signed-off-by: default avatarPierre Ossman <drzeus@drzeus.cx>
parent a84756c5
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -213,7 +213,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
	struct mmc_blk_data *md = mq->data;
	struct mmc_card *card = md->queue.card;
	struct mmc_blk_request brq;
	int ret = 1, sg_pos, data_size;
	int ret = 1, data_size, i;
	struct scatterlist *sg;

	mmc_claim_host(card->host);

@@ -267,18 +268,22 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)

		mmc_queue_bounce_pre(mq);

		/*
		 * Adjust the sg list so it is the same size as the
		 * request.
		 */
		if (brq.data.blocks !=
		    (req->nr_sectors >> (md->block_bits - 9))) {
			data_size = brq.data.blocks * brq.data.blksz;
			for (sg_pos = 0; sg_pos < brq.data.sg_len; sg_pos++) {
				data_size -= mq->sg[sg_pos].length;
			for_each_sg(brq.data.sg, sg, brq.data.sg_len, i) {
				data_size -= sg->length;
				if (data_size <= 0) {
					mq->sg[sg_pos].length += data_size;
					sg_pos++;
					sg->length += data_size;
					i++;
					break;
				}
			}
			brq.data.sg_len = sg_pos;
			brq.data.sg_len = i;
		}

		mmc_wait_for_req(card->host, &brq.mrq);