Skip to content

Commit 679c8bd

Browse files
Christoph Hellwigstellarhopper
authored andcommitted
dax: export a low-level __dax_zero_page_range helper
This allows XFS to perform zeroing using the iomap infrastructure and avoid buffer heads. Reviewed-by: Jan Kara <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]> [vishal: fix conflicts with dax-error-handling] Signed-off-by: Vishal Verma <[email protected]>
1 parent 3dc2916 commit 679c8bd

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

fs/dax.c

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,23 @@ int dax_pfn_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
947947
}
948948
EXPORT_SYMBOL_GPL(dax_pfn_mkwrite);
949949

950+
int __dax_zero_page_range(struct block_device *bdev, sector_t sector,
951+
unsigned int offset, unsigned int length)
952+
{
953+
struct blk_dax_ctl dax = {
954+
.sector = sector,
955+
.size = PAGE_SIZE,
956+
};
957+
958+
if (dax_map_atomic(bdev, &dax) < 0)
959+
return PTR_ERR(dax.addr);
960+
clear_pmem(dax.addr + offset, length);
961+
wmb_pmem();
962+
dax_unmap_atomic(bdev, &dax);
963+
return 0;
964+
}
965+
EXPORT_SYMBOL_GPL(__dax_zero_page_range);
966+
950967
/**
951968
* dax_zero_page_range - zero a range within a page of a DAX file
952969
* @inode: The file being truncated
@@ -982,23 +999,11 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length,
982999
bh.b_bdev = inode->i_sb->s_bdev;
9831000
bh.b_size = PAGE_SIZE;
9841001
err = get_block(inode, index, &bh, 0);
985-
if (err < 0)
1002+
if (err < 0 || !buffer_written(&bh))
9861003
return err;
987-
if (buffer_written(&bh)) {
988-
struct block_device *bdev = bh.b_bdev;
989-
struct blk_dax_ctl dax = {
990-
.sector = to_sector(&bh, inode),
991-
.size = PAGE_SIZE,
992-
};
9931004

994-
if (dax_map_atomic(bdev, &dax) < 0)
995-
return PTR_ERR(dax.addr);
996-
clear_pmem(dax.addr + offset, length);
997-
wmb_pmem();
998-
dax_unmap_atomic(bdev, &dax);
999-
}
1000-
1001-
return 0;
1005+
return __dax_zero_page_range(bh.b_bdev, to_sector(&bh, inode),
1006+
offset, length);
10021007
}
10031008
EXPORT_SYMBOL_GPL(dax_zero_page_range);
10041009

include/linux/dax.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@ int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t);
1414

1515
#ifdef CONFIG_FS_DAX
1616
struct page *read_dax_sector(struct block_device *bdev, sector_t n);
17+
int __dax_zero_page_range(struct block_device *bdev, sector_t sector,
18+
unsigned int offset, unsigned int length);
1719
#else
1820
static inline struct page *read_dax_sector(struct block_device *bdev,
1921
sector_t n)
2022
{
2123
return ERR_PTR(-ENXIO);
2224
}
25+
static inline int __dax_zero_page_range(struct block_device *bdev,
26+
sector_t sector, unsigned int offset, unsigned int length)
27+
{
28+
return -ENXIO;
29+
}
2330
#endif
2431

2532
#ifdef CONFIG_TRANSPARENT_HUGEPAGE

0 commit comments

Comments
 (0)