|
@@ -453,6 +453,28 @@ void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
|
|
|
}
|
|
|
EXPORT_SYMBOL(sg_miter_start);
|
|
|
|
|
|
+static bool sg_miter_get_next_page(struct sg_mapping_iter *miter)
|
|
|
+{
|
|
|
+ if (!miter->__remaining) {
|
|
|
+ struct scatterlist *sg;
|
|
|
+ unsigned long pgoffset;
|
|
|
+
|
|
|
+ if (!__sg_page_iter_next(&miter->piter))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ sg = miter->piter.sg;
|
|
|
+ pgoffset = miter->piter.sg_pgoffset;
|
|
|
+
|
|
|
+ miter->__offset = pgoffset ? 0 : sg->offset;
|
|
|
+ miter->__remaining = sg->offset + sg->length -
|
|
|
+ (pgoffset << PAGE_SHIFT) - miter->__offset;
|
|
|
+ miter->__remaining = min_t(unsigned long, miter->__remaining,
|
|
|
+ PAGE_SIZE - miter->__offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* sg_miter_next - proceed mapping iterator to the next mapping
|
|
|
* @miter: sg mapping iter to proceed
|
|
@@ -478,22 +500,9 @@ bool sg_miter_next(struct sg_mapping_iter *miter)
|
|
|
* Get to the next page if necessary.
|
|
|
* __remaining, __offset is adjusted by sg_miter_stop
|
|
|
*/
|
|
|
- if (!miter->__remaining) {
|
|
|
- struct scatterlist *sg;
|
|
|
- unsigned long pgoffset;
|
|
|
-
|
|
|
- if (!__sg_page_iter_next(&miter->piter))
|
|
|
- return false;
|
|
|
-
|
|
|
- sg = miter->piter.sg;
|
|
|
- pgoffset = miter->piter.sg_pgoffset;
|
|
|
+ if (!sg_miter_get_next_page(miter))
|
|
|
+ return false;
|
|
|
|
|
|
- miter->__offset = pgoffset ? 0 : sg->offset;
|
|
|
- miter->__remaining = sg->offset + sg->length -
|
|
|
- (pgoffset << PAGE_SHIFT) - miter->__offset;
|
|
|
- miter->__remaining = min_t(unsigned long, miter->__remaining,
|
|
|
- PAGE_SIZE - miter->__offset);
|
|
|
- }
|
|
|
miter->page = sg_page_iter_page(&miter->piter);
|
|
|
miter->consumed = miter->length = miter->__remaining;
|
|
|
|