Lines Matching refs:miter

789  * @miter: sg mapping iter to be started
795 * Starts mapping iterator @miter.
800 void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
803 memset(miter, 0, sizeof(struct sg_mapping_iter));
805 __sg_page_iter_start(&miter->piter, sgl, nents, 0);
807 miter->__flags = flags;
811 static bool sg_miter_get_next_page(struct sg_mapping_iter *miter)
813 if (!miter->__remaining) {
816 if (!__sg_page_iter_next(&miter->piter))
819 sg = miter->piter.sg;
821 miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset;
822 miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT;
823 miter->__offset &= PAGE_SIZE - 1;
824 miter->__remaining = sg->offset + sg->length -
825 (miter->piter.sg_pgoffset << PAGE_SHIFT) -
826 miter->__offset;
827 miter->__remaining = min_t(unsigned long, miter->__remaining,
828 PAGE_SIZE - miter->__offset);
836 * @miter: sg mapping iter to be skipped
840 * Sets the offset of @miter to its current location plus @offset bytes.
841 * If mapping iterator @miter has been proceeded by sg_miter_next(), this
842 * stops @miter.
848 * true if @miter contains the valid mapping. false if end of sg
851 bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset)
853 sg_miter_stop(miter);
858 if (!sg_miter_get_next_page(miter))
861 consumed = min_t(off_t, offset, miter->__remaining);
862 miter->__offset += consumed;
863 miter->__remaining -= consumed;
873 * @miter: sg mapping iter to proceed
876 * Proceeds @miter to the next mapping. @miter should have been started
877 * using sg_miter_start(). On successful return, @miter->page,
878 * @miter->addr and @miter->length point to the current mapping.
884 * true if @miter contains the next mapping. false if end of sg
887 bool sg_miter_next(struct sg_mapping_iter *miter)
889 sg_miter_stop(miter);
895 if (!sg_miter_get_next_page(miter))
898 miter->page = sg_page_iter_page(&miter->piter);
899 miter->consumed = miter->length = miter->__remaining;
901 if (miter->__flags & SG_MITER_ATOMIC)
902 miter->addr = kmap_atomic(miter->page) + miter->__offset;
904 miter->addr = kmap(miter->page) + miter->__offset;
912 * @miter: sg mapping iter to be stopped
915 * Stops mapping iterator @miter. @miter should have been started
923 void sg_miter_stop(struct sg_mapping_iter *miter)
925 WARN_ON(miter->consumed > miter->length);
928 if (miter->addr) {
929 miter->__offset += miter->consumed;
930 miter->__remaining -= miter->consumed;
932 if (miter->__flags & SG_MITER_TO_SG)
933 flush_dcache_page(miter->page);
935 if (miter->__flags & SG_MITER_ATOMIC) {
937 kunmap_atomic(miter->addr);
939 kunmap(miter->page);
941 miter->page = NULL;
942 miter->addr = NULL;
943 miter->length = 0;
944 miter->consumed = 0;
966 struct sg_mapping_iter miter;
974 sg_miter_start(&miter, sgl, nents, sg_flags);
976 if (!sg_miter_skip(&miter, skip))
979 while ((offset < buflen) && sg_miter_next(&miter)) {
982 len = min(miter.length, buflen - offset);
985 memcpy(buf + offset, miter.addr, len);
987 memcpy(miter.addr, buf + offset, len);
992 sg_miter_stop(&miter);
1081 struct sg_mapping_iter miter;
1084 sg_miter_start(&miter, sgl, nents, sg_flags);
1086 if (!sg_miter_skip(&miter, skip))
1089 while (offset < buflen && sg_miter_next(&miter)) {
1092 len = min(miter.length, buflen - offset);
1093 memset(miter.addr, 0, len);
1098 sg_miter_stop(&miter);