Lines Matching refs:miter

446  * @miter: sg mapping iter to be started
451 * Starts mapping iterator @miter.
456 void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
459 memset(miter, 0, sizeof(struct sg_mapping_iter));
461 __sg_page_iter_start(&miter->piter, sgl, nents, 0);
463 miter->__flags = flags;
467 static bool sg_miter_get_next_page(struct sg_mapping_iter *miter)
469 if (!miter->__remaining) {
473 if (!__sg_page_iter_next(&miter->piter))
476 sg = miter->piter.sg;
477 pgoffset = miter->piter.sg_pgoffset;
479 miter->__offset = pgoffset ? 0 : sg->offset;
480 miter->__remaining = sg->offset + sg->length -
481 (pgoffset << PAGE_SHIFT) - miter->__offset;
482 miter->__remaining = min_t(unsigned long, miter->__remaining,
483 PAGE_SIZE - miter->__offset);
491 * @miter: sg mapping iter to be skipped
495 * Sets the offset of @miter to its current location plus @offset bytes.
496 * If mapping iterator @miter has been proceeded by sg_miter_next(), this
497 * stops @miter.
500 * Don't care if @miter is stopped, or not proceeded yet.
504 * true if @miter contains the valid mapping. false if end of sg
507 bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset)
509 sg_miter_stop(miter);
514 if (!sg_miter_get_next_page(miter))
517 consumed = min_t(off_t, offset, miter->__remaining);
518 miter->__offset += consumed;
519 miter->__remaining -= consumed;
529 * @miter: sg mapping iter to proceed
532 * Proceeds @miter to the next mapping. @miter should have been started
533 * using sg_miter_start(). On successful return, @miter->page,
534 * @miter->addr and @miter->length point to the current mapping.
538 * till @miter is stopped. May sleep if !SG_MITER_ATOMIC.
541 * true if @miter contains the next mapping. false if end of sg
544 bool sg_miter_next(struct sg_mapping_iter *miter)
546 sg_miter_stop(miter);
552 if (!sg_miter_get_next_page(miter))
555 miter->page = sg_page_iter_page(&miter->piter);
556 miter->consumed = miter->length = miter->__remaining;
558 if (miter->__flags & SG_MITER_ATOMIC)
559 miter->addr = kmap_atomic(miter->page) + miter->__offset;
561 miter->addr = kmap(miter->page) + miter->__offset;
569 * @miter: sg mapping iter to be stopped
572 * Stops mapping iterator @miter. @miter should have been started
581 void sg_miter_stop(struct sg_mapping_iter *miter)
583 WARN_ON(miter->consumed > miter->length);
586 if (miter->addr) {
587 miter->__offset += miter->consumed;
588 miter->__remaining -= miter->consumed;
590 if ((miter->__flags & SG_MITER_TO_SG) &&
591 !PageSlab(miter->page))
592 flush_kernel_dcache_page(miter->page);
594 if (miter->__flags & SG_MITER_ATOMIC) {
596 kunmap_atomic(miter->addr);
598 kunmap(miter->page);
600 miter->page = NULL;
601 miter->addr = NULL;
602 miter->length = 0;
603 miter->consumed = 0;
626 struct sg_mapping_iter miter;
635 sg_miter_start(&miter, sgl, nents, sg_flags);
637 if (!sg_miter_skip(&miter, skip))
642 while (sg_miter_next(&miter) && offset < buflen) {
645 len = min(miter.length, buflen - offset);
648 memcpy(buf + offset, miter.addr, len);
650 memcpy(miter.addr, buf + offset, len);
655 sg_miter_stop(&miter);