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

iomap: advance the iter directly on unshare range



Modify unshare 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-10-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 1a1a3b57
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -1263,20 +1263,19 @@ EXPORT_SYMBOL_GPL(iomap_write_delalloc_release);
static loff_t iomap_unshare_iter(struct iomap_iter *iter)
{
	struct iomap *iomap = &iter->iomap;
	loff_t pos = iter->pos;
	loff_t length = iomap_length(iter);
	loff_t written = 0;
	u64 bytes = iomap_length(iter);
	int status;

	if (!iomap_want_unshare_iter(iter))
		return length;
		return iomap_iter_advance(iter, &bytes);

	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 (unlikely(status))
			return status;
@@ -1294,14 +1293,14 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)

		cond_resched();

		pos += bytes;
		written += bytes;
		length -= bytes;

		balance_dirty_pages_ratelimited(iter->inode->i_mapping);
	} while (length > 0);

	return written;
		status = iomap_iter_advance(iter, &bytes);
		if (status)
			break;
	} while (bytes > 0);

	return status;
}

int