diff options
| -rw-r--r-- | lib/scatterlist.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/scatterlist.c b/lib/scatterlist.c index a1cf8cae60e7..c35b929435f3 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c | |||
| @@ -453,6 +453,28 @@ void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl, | |||
| 453 | } | 453 | } |
| 454 | EXPORT_SYMBOL(sg_miter_start); | 454 | EXPORT_SYMBOL(sg_miter_start); |
| 455 | 455 | ||
| 456 | static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) | ||
| 457 | { | ||
| 458 | if (!miter->__remaining) { | ||
| 459 | struct scatterlist *sg; | ||
| 460 | unsigned long pgoffset; | ||
| 461 | |||
| 462 | if (!__sg_page_iter_next(&miter->piter)) | ||
| 463 | return false; | ||
| 464 | |||
| 465 | sg = miter->piter.sg; | ||
| 466 | pgoffset = miter->piter.sg_pgoffset; | ||
| 467 | |||
| 468 | miter->__offset = pgoffset ? 0 : sg->offset; | ||
| 469 | miter->__remaining = sg->offset + sg->length - | ||
| 470 | (pgoffset << PAGE_SHIFT) - miter->__offset; | ||
| 471 | miter->__remaining = min_t(unsigned long, miter->__remaining, | ||
| 472 | PAGE_SIZE - miter->__offset); | ||
| 473 | } | ||
| 474 | |||
| 475 | return true; | ||
| 476 | } | ||
| 477 | |||
| 456 | /** | 478 | /** |
| 457 | * sg_miter_next - proceed mapping iterator to the next mapping | 479 | * sg_miter_next - proceed mapping iterator to the next mapping |
| 458 | * @miter: sg mapping iter to proceed | 480 | * @miter: sg mapping iter to proceed |
| @@ -478,22 +500,9 @@ bool sg_miter_next(struct sg_mapping_iter *miter) | |||
| 478 | * Get to the next page if necessary. | 500 | * Get to the next page if necessary. |
| 479 | * __remaining, __offset is adjusted by sg_miter_stop | 501 | * __remaining, __offset is adjusted by sg_miter_stop |
| 480 | */ | 502 | */ |
| 481 | if (!miter->__remaining) { | 503 | if (!sg_miter_get_next_page(miter)) |
| 482 | struct scatterlist *sg; | 504 | return false; |
| 483 | unsigned long pgoffset; | ||
| 484 | |||
| 485 | if (!__sg_page_iter_next(&miter->piter)) | ||
| 486 | return false; | ||
| 487 | |||
| 488 | sg = miter->piter.sg; | ||
| 489 | pgoffset = miter->piter.sg_pgoffset; | ||
| 490 | 505 | ||
| 491 | miter->__offset = pgoffset ? 0 : sg->offset; | ||
| 492 | miter->__remaining = sg->offset + sg->length - | ||
| 493 | (pgoffset << PAGE_SHIFT) - miter->__offset; | ||
| 494 | miter->__remaining = min_t(unsigned long, miter->__remaining, | ||
| 495 | PAGE_SIZE - miter->__offset); | ||
| 496 | } | ||
| 497 | miter->page = sg_page_iter_page(&miter->piter); | 506 | miter->page = sg_page_iter_page(&miter->piter); |
| 498 | miter->consumed = miter->length = miter->__remaining; | 507 | miter->consumed = miter->length = miter->__remaining; |
| 499 | 508 | ||
