diff options
Diffstat (limited to 'lib')
-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 | ||