Skip to content

Commit cbad829

Browse files
Brian Fosterbrauner
authored andcommitted
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: Brian Foster <bfoster@redhat.com> Link: https://lore.kernel.org/r/20250207143253.314068-11-bfoster@redhat.com Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent e60837d commit cbad829

File tree

1 file changed

+13
-11
lines changed

1 file changed

+13
-11
lines changed

fs/iomap/buffered-io.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,17 +1341,16 @@ static inline int iomap_zero_iter_flush_and_stale(struct iomap_iter *i)
13411341

13421342
static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
13431343
{
1344-
loff_t pos = iter->pos;
1345-
loff_t length = iomap_length(iter);
1346-
loff_t written = 0;
1344+
u64 bytes = iomap_length(iter);
1345+
int status;
13471346

13481347
do {
13491348
struct folio *folio;
1350-
int status;
13511349
size_t offset;
1352-
size_t bytes = min_t(u64, SIZE_MAX, length);
1350+
loff_t pos = iter->pos;
13531351
bool ret;
13541352

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

1375-
pos += bytes;
1376-
length -= bytes;
1377-
written += bytes;
1378-
} while (length > 0);
1374+
status = iomap_iter_advance(iter, &bytes);
1375+
if (status)
1376+
break;
1377+
} while (bytes > 0);
13791378

13801379
if (did_zero)
13811380
*did_zero = true;
1382-
return written;
1381+
return status;
13831382
}
13841383

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

14341433
if (srcmap->type == IOMAP_HOLE ||
14351434
srcmap->type == IOMAP_UNWRITTEN) {
1436-
loff_t proc = iomap_length(&iter);
1435+
s64 proc;
14371436

14381437
if (range_dirty) {
14391438
range_dirty = false;
14401439
proc = iomap_zero_iter_flush_and_stale(&iter);
1440+
} else {
1441+
u64 length = iomap_length(&iter);
1442+
proc = iomap_iter_advance(&iter, &length);
14411443
}
14421444
iter.processed = proc;
14431445
continue;

0 commit comments

Comments
 (0)