Skip to content

Commit 0a23f9f

Browse files
rhvgoyaldjbw
authored andcommitted
dax: Use new dax zero page method for zeroing a page
Use new dax native zero page method for zeroing page if I/O is page aligned. Otherwise fall back to direct_access() + memcpy(). This gets rid of one of the depenendency on block device in dax path. Signed-off-by: Vivek Goyal <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dan Williams <[email protected]>
1 parent cdf6cdc commit 0a23f9f

File tree

1 file changed

+23
-30
lines changed

1 file changed

+23
-30
lines changed

fs/dax.c

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,47 +1038,40 @@ static vm_fault_t dax_load_hole(struct xa_state *xas,
10381038
return ret;
10391039
}
10401040

1041-
static bool dax_range_is_aligned(struct block_device *bdev,
1042-
unsigned int offset, unsigned int length)
1043-
{
1044-
unsigned short sector_size = bdev_logical_block_size(bdev);
1045-
1046-
if (!IS_ALIGNED(offset, sector_size))
1047-
return false;
1048-
if (!IS_ALIGNED(length, sector_size))
1049-
return false;
1050-
1051-
return true;
1052-
}
1053-
10541041
int __dax_zero_page_range(struct block_device *bdev,
10551042
struct dax_device *dax_dev, sector_t sector,
10561043
unsigned int offset, unsigned int size)
10571044
{
1058-
if (dax_range_is_aligned(bdev, offset, size)) {
1059-
sector_t start_sector = sector + (offset >> 9);
1045+
pgoff_t pgoff;
1046+
long rc, id;
1047+
void *kaddr;
1048+
bool page_aligned = false;
10601049

1061-
return blkdev_issue_zeroout(bdev, start_sector,
1062-
size >> 9, GFP_NOFS, 0);
1063-
} else {
1064-
pgoff_t pgoff;
1065-
long rc, id;
1066-
void *kaddr;
10671050

1068-
rc = bdev_dax_pgoff(bdev, sector, PAGE_SIZE, &pgoff);
1069-
if (rc)
1070-
return rc;
1051+
if (IS_ALIGNED(sector << SECTOR_SHIFT, PAGE_SIZE) &&
1052+
IS_ALIGNED(size, PAGE_SIZE))
1053+
page_aligned = true;
1054+
1055+
rc = bdev_dax_pgoff(bdev, sector, PAGE_SIZE, &pgoff);
1056+
if (rc)
1057+
return rc;
10711058

1072-
id = dax_read_lock();
1059+
id = dax_read_lock();
1060+
1061+
if (page_aligned)
1062+
rc = dax_zero_page_range(dax_dev, pgoff, size >> PAGE_SHIFT);
1063+
else
10731064
rc = dax_direct_access(dax_dev, pgoff, 1, &kaddr, NULL);
1074-
if (rc < 0) {
1075-
dax_read_unlock(id);
1076-
return rc;
1077-
}
1065+
if (rc < 0) {
1066+
dax_read_unlock(id);
1067+
return rc;
1068+
}
1069+
1070+
if (!page_aligned) {
10781071
memset(kaddr + offset, 0, size);
10791072
dax_flush(dax_dev, kaddr + offset, size);
1080-
dax_read_unlock(id);
10811073
}
1074+
dax_read_unlock(id);
10821075
return 0;
10831076
}
10841077
EXPORT_SYMBOL_GPL(__dax_zero_page_range);

0 commit comments

Comments
 (0)