Skip to content

Commit 80fce30

Browse files
Brian Fosterbrauner
authored andcommitted
dax: advance the iomap_iter on zero range
Update the DAX zero range iomap iter handler to advance the iter directly. Advance by the full length in the hole/unwritten case, or otherwise advance incrementally in the zeroing loop. In either case, return 0 or an error code for success or failure. Signed-off-by: Brian Foster <bfoster@redhat.com> Link: https://lore.kernel.org/r/20250224144757.237706-7-bfoster@redhat.com Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent e1dae77 commit 80fce30

1 file changed

Lines changed: 17 additions & 16 deletions

File tree

fs/dax.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,47 +1358,48 @@ static s64 dax_zero_iter(struct iomap_iter *iter, bool *did_zero)
13581358
{
13591359
const struct iomap *iomap = &iter->iomap;
13601360
const struct iomap *srcmap = iomap_iter_srcmap(iter);
1361-
loff_t pos = iter->pos;
13621361
u64 length = iomap_length(iter);
1363-
s64 written = 0;
1362+
s64 ret;
13641363

13651364
/* already zeroed? we're done. */
13661365
if (srcmap->type == IOMAP_HOLE || srcmap->type == IOMAP_UNWRITTEN)
1367-
return length;
1366+
return iomap_iter_advance(iter, &length);
13681367

13691368
/*
13701369
* invalidate the pages whose sharing state is to be changed
13711370
* because of CoW.
13721371
*/
13731372
if (iomap->flags & IOMAP_F_SHARED)
13741373
invalidate_inode_pages2_range(iter->inode->i_mapping,
1375-
pos >> PAGE_SHIFT,
1376-
(pos + length - 1) >> PAGE_SHIFT);
1374+
iter->pos >> PAGE_SHIFT,
1375+
(iter->pos + length - 1) >> PAGE_SHIFT);
13771376

13781377
do {
1378+
loff_t pos = iter->pos;
13791379
unsigned offset = offset_in_page(pos);
1380-
unsigned size = min_t(u64, PAGE_SIZE - offset, length);
13811380
pgoff_t pgoff = dax_iomap_pgoff(iomap, pos);
1382-
long rc;
13831381
int id;
13841382

1383+
length = min_t(u64, PAGE_SIZE - offset, length);
1384+
13851385
id = dax_read_lock();
1386-
if (IS_ALIGNED(pos, PAGE_SIZE) && size == PAGE_SIZE)
1387-
rc = dax_zero_page_range(iomap->dax_dev, pgoff, 1);
1386+
if (IS_ALIGNED(pos, PAGE_SIZE) && length == PAGE_SIZE)
1387+
ret = dax_zero_page_range(iomap->dax_dev, pgoff, 1);
13881388
else
1389-
rc = dax_memzero(iter, pos, size);
1389+
ret = dax_memzero(iter, pos, length);
13901390
dax_read_unlock(id);
13911391

1392-
if (rc < 0)
1393-
return rc;
1394-
pos += size;
1395-
length -= size;
1396-
written += size;
1392+
if (ret < 0)
1393+
return ret;
1394+
1395+
ret = iomap_iter_advance(iter, &length);
1396+
if (ret)
1397+
return ret;
13971398
} while (length > 0);
13981399

13991400
if (did_zero)
14001401
*did_zero = true;
1401-
return written;
1402+
return ret;
14021403
}
14031404

14041405
int dax_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,

0 commit comments

Comments
 (0)