Unverified Commit cbad829c authored by Brian Foster's avatar Brian Foster Committed by Christian Brauner
Browse files

iomap: advance the iter directly on zero range



Modify zero range to advance the iter directly. Replace the local pos
and length calculations with direct advances and loop based on iter
state instead.

Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
Link: https://lore.kernel.org/r/20250207143253.314068-11-bfoster@redhat.com


Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent e60837da
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -1341,17 +1341,16 @@ static inline int iomap_zero_iter_flush_and_stale(struct iomap_iter *i)

static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
{
	loff_t pos = iter->pos;
	loff_t length = iomap_length(iter);
	loff_t written = 0;
	u64 bytes = iomap_length(iter);
	int status;

	do {
		struct folio *folio;
		int status;
		size_t offset;
		size_t bytes = min_t(u64, SIZE_MAX, length);
		loff_t pos = iter->pos;
		bool ret;

		bytes = min_t(u64, SIZE_MAX, bytes);
		status = iomap_write_begin(iter, pos, bytes, &folio);
		if (status)
			return status;
@@ -1372,14 +1371,14 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
		if (WARN_ON_ONCE(!ret))
			return -EIO;

		pos += bytes;
		length -= bytes;
		written += bytes;
	} while (length > 0);
		status = iomap_iter_advance(iter, &bytes);
		if (status)
			break;
	} while (bytes > 0);

	if (did_zero)
		*did_zero = true;
	return written;
	return status;
}

int
@@ -1433,11 +1432,14 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,

		if (srcmap->type == IOMAP_HOLE ||
		    srcmap->type == IOMAP_UNWRITTEN) {
			loff_t proc = iomap_length(&iter);
			s64 proc;

			if (range_dirty) {
				range_dirty = false;
				proc = iomap_zero_iter_flush_and_stale(&iter);
			} else {
				u64 length = iomap_length(&iter);
				proc = iomap_iter_advance(&iter, &length);
			}
			iter.processed = proc;
			continue;