anolis: dax: add helper to copy pmem range

ANBZ: #7740

Add a helper to copy two pmem rage in a file system, following
patch will use this helper.

Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
[ Gao Xiang: need to be deprecated after the following patch is reworked. ]
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Acked-by: Joseph Qi <joseph.qi@linux.alibaba.com>
Link: https://gitee.com/anolis/cloud-kernel/pulls/2794
This commit is contained in:
Xiaoguang Wang 2021-05-12 10:34:50 +08:00 committed by 小龙
parent fe31ece37e
commit f01bd0f0ac
2 changed files with 40 additions and 0 deletions

View File

@ -1157,6 +1157,44 @@ static sector_t dax_iomap_sector(const struct iomap *iomap, loff_t pos)
return (iomap->addr + (pos & PAGE_MASK) - iomap->offset) >> 9;
}
int dax_copy_range(struct block_device *bdev, struct dax_device *dax_dev,
u64 src_addr, u64 dst_addr, size_t size)
{
const sector_t src_sector = src_addr >> SECTOR_SHIFT;
const sector_t dst_sector = dst_addr >> SECTOR_SHIFT;
pgoff_t spgoff, dpgoff;
int id, rc;
long length;
void *saddr, *daddr;
rc = bdev_dax_pgoff(bdev, src_sector, size, &spgoff);
if (rc)
return rc;
rc = bdev_dax_pgoff(bdev, dst_sector, size, &dpgoff);
if (rc)
return rc;
id = dax_read_lock();
length = dax_direct_access(dax_dev, spgoff, PHYS_PFN(size), &saddr, NULL);
if (length < 0) {
rc = length;
goto out;
}
length = dax_direct_access(dax_dev, dpgoff, PHYS_PFN(size), &daddr, NULL);
if (length < 0) {
rc = length;
goto out;
}
rc = copy_mc_to_kernel(daddr, saddr, size);
out:
dax_read_unlock(id);
return rc;
}
EXPORT_SYMBOL_GPL(dax_copy_range);
int dax_iomap_direct_access(const struct iomap *iomap, loff_t pos,
size_t size, void **kaddr, pfn_t *pfnp)
{

View File

@ -281,6 +281,8 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
pgoff_t index);
int dax_copy_range(struct block_device *bdev, struct dax_device *dax_dev,
u64 src_addr, u64 dst_addr, size_t size);
int dax_iomap_direct_access(const struct iomap *iomap, loff_t pos,
size_t size, void **kaddr, pfn_t *pfnp);
int dax_dedupe_file_range_compare(struct inode *src, loff_t srcoff,