@@ -27,17 +27,11 @@ static inline void iomap_iter_reset_iomap(struct iomap_iter *iter)
*/
static inline int iomap_iter_advance(struct iomap_iter *iter, s64 count)
{
- bool stale = iter->iomap.flags & IOMAP_F_STALE;
- int ret = 1;
-
if (WARN_ON_ONCE(count > iomap_length(iter)))
return -EIO;
iter->pos += count;
iter->len -= count;
- if (!iter->len || (!count && !stale))
- ret = 0;
-
- return ret;
+ return 0;
}
static inline void iomap_iter_done(struct iomap_iter *iter)
@@ -69,6 +63,7 @@ static inline void iomap_iter_done(struct iomap_iter *iter)
*/
int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
{
+ bool stale = iter->iomap.flags & IOMAP_F_STALE;
s64 processed;
int ret;
@@ -91,8 +86,18 @@ int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops)
return processed;
}
- /* advance and clear state from the previous iteration */
+ /*
+ * Advance the iter and clear state from the previous iteration. Use
+ * iter->len to determine whether to continue onto the next mapping.
+ * Explicitly terminate in the case where the current iter has not
+ * advanced at all (i.e. no work was done for some reason) unless the
+ * mapping has been marked stale and needs to be reprocessed.
+ */
ret = iomap_iter_advance(iter, processed);
+ if (!ret && iter->len > 0)
+ ret = 1;
+ if (ret > 0 && !iter->processed && !stale)
+ ret = 0;
iomap_iter_reset_iomap(iter);
if (ret <= 0)
return ret;