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:
parent
fe31ece37e
commit
f01bd0f0ac
38
fs/dax.c
38
fs/dax.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue