diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2016-05-11 00:00:29 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-05-11 00:00:29 -0400 |
| commit | e4d35be584be88a3db3fa5635a97c62a2ec5aafe (patch) | |
| tree | fc22a7fb65697306edd71411959ccee6df60c64d /include/linux/pmem.h | |
| parent | 99d825822eade8d827a1817357cbf3f889a552d6 (diff) | |
| parent | 38b78a5f18584db6fa7441e0f4531b283b0e6725 (diff) | |
| download | linux-next-e4d35be584be88a3db3fa5635a97c62a2ec5aafe.tar.gz linux-next-e4d35be584be88a3db3fa5635a97c62a2ec5aafe.zip | |
Merge branch 'ovl-fixes' into for-linus
Diffstat (limited to 'include/linux/pmem.h')
| -rw-r--r-- | include/linux/pmem.h | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/include/linux/pmem.h b/include/linux/pmem.h index 3ec5309e29f3..57d146fe44dd 100644 --- a/include/linux/pmem.h +++ b/include/linux/pmem.h @@ -42,6 +42,13 @@ static inline void arch_memcpy_to_pmem(void __pmem *dst, const void *src, BUG(); } +static inline int arch_memcpy_from_pmem(void *dst, const void __pmem *src, + size_t n) +{ + BUG(); + return -EFAULT; +} + static inline size_t arch_copy_from_iter_pmem(void __pmem *addr, size_t bytes, struct iov_iter *i) { @@ -65,20 +72,33 @@ static inline void arch_invalidate_pmem(void __pmem *addr, size_t size) } #endif -/* - * Architectures that define ARCH_HAS_PMEM_API must provide - * implementations for arch_memcpy_to_pmem(), arch_wmb_pmem(), - * arch_copy_from_iter_pmem(), arch_clear_pmem(), arch_wb_cache_pmem() - * and arch_has_wmb_pmem(). - */ -static inline void memcpy_from_pmem(void *dst, void __pmem const *src, size_t size) +static inline bool arch_has_pmem_api(void) { - memcpy(dst, (void __force const *) src, size); + return IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API); } -static inline bool arch_has_pmem_api(void) +static inline int default_memcpy_from_pmem(void *dst, void __pmem const *src, + size_t size) { - return IS_ENABLED(CONFIG_ARCH_HAS_PMEM_API); + memcpy(dst, (void __force *) src, size); + return 0; +} + +/* + * memcpy_from_pmem - read from persistent memory with error handling + * @dst: destination buffer + * @src: source buffer + * @size: transfer length + * + * Returns 0 on success negative error code on failure. + */ +static inline int memcpy_from_pmem(void *dst, void __pmem const *src, + size_t size) +{ + if (arch_has_pmem_api()) + return arch_memcpy_from_pmem(dst, src, size); + else + return default_memcpy_from_pmem(dst, src, size); } /** |
