diff options
| author | Dan Williams <dan.j.williams@intel.com> | 2018-06-08 18:16:44 -0400 |
|---|---|---|
| committer | Dan Williams <dan.j.williams@intel.com> | 2018-06-08 18:16:44 -0400 |
| commit | 930218affeadd1325ea17e053f0dcecf218f5a4f (patch) | |
| tree | 203c293668a88e03b9f292cf4d5a294ca8a4275a /include/linux | |
| parent | b56845794e1e93121acb74ca325db965035d5545 (diff) | |
| parent | 5d8beee20d89e34ff1dcb0da84adf7607858c59d (diff) | |
Merge branch 'for-4.18/mcsafe' into libnvdimm-for-next
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/dax.h | 5 | ||||
| -rw-r--r-- | include/linux/device-mapper.h | 5 | ||||
| -rw-r--r-- | include/linux/string.h | 4 | ||||
| -rw-r--r-- | include/linux/uio.h | 15 |
4 files changed, 25 insertions, 4 deletions
diff --git a/include/linux/dax.h b/include/linux/dax.h index 25bab6abb695..b51db4264c83 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h | |||
| @@ -20,6 +20,9 @@ struct dax_operations { | |||
| 20 | /* copy_from_iter: required operation for fs-dax direct-i/o */ | 20 | /* copy_from_iter: required operation for fs-dax direct-i/o */ |
| 21 | size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t, | 21 | size_t (*copy_from_iter)(struct dax_device *, pgoff_t, void *, size_t, |
| 22 | struct iov_iter *); | 22 | struct iov_iter *); |
| 23 | /* copy_to_iter: required operation for fs-dax direct-i/o */ | ||
| 24 | size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t, | ||
| 25 | struct iov_iter *); | ||
| 23 | }; | 26 | }; |
| 24 | 27 | ||
| 25 | extern struct attribute_group dax_attribute_group; | 28 | extern struct attribute_group dax_attribute_group; |
| @@ -125,6 +128,8 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, | |||
| 125 | void **kaddr, pfn_t *pfn); | 128 | void **kaddr, pfn_t *pfn); |
| 126 | size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, | 129 | size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, |
| 127 | size_t bytes, struct iov_iter *i); | 130 | size_t bytes, struct iov_iter *i); |
| 131 | size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, | ||
| 132 | size_t bytes, struct iov_iter *i); | ||
| 128 | void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); | 133 | void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); |
| 129 | 134 | ||
| 130 | ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, | 135 | ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, |
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 31fef7c34185..6fb0808e87c8 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
| @@ -133,7 +133,7 @@ typedef int (*dm_busy_fn) (struct dm_target *ti); | |||
| 133 | */ | 133 | */ |
| 134 | typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff, | 134 | typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff, |
| 135 | long nr_pages, void **kaddr, pfn_t *pfn); | 135 | long nr_pages, void **kaddr, pfn_t *pfn); |
| 136 | typedef size_t (*dm_dax_copy_from_iter_fn)(struct dm_target *ti, pgoff_t pgoff, | 136 | typedef size_t (*dm_dax_copy_iter_fn)(struct dm_target *ti, pgoff_t pgoff, |
| 137 | void *addr, size_t bytes, struct iov_iter *i); | 137 | void *addr, size_t bytes, struct iov_iter *i); |
| 138 | #define PAGE_SECTORS (PAGE_SIZE / 512) | 138 | #define PAGE_SECTORS (PAGE_SIZE / 512) |
| 139 | 139 | ||
| @@ -184,7 +184,8 @@ struct target_type { | |||
| 184 | dm_iterate_devices_fn iterate_devices; | 184 | dm_iterate_devices_fn iterate_devices; |
| 185 | dm_io_hints_fn io_hints; | 185 | dm_io_hints_fn io_hints; |
| 186 | dm_dax_direct_access_fn direct_access; | 186 | dm_dax_direct_access_fn direct_access; |
| 187 | dm_dax_copy_from_iter_fn dax_copy_from_iter; | 187 | dm_dax_copy_iter_fn dax_copy_from_iter; |
| 188 | dm_dax_copy_iter_fn dax_copy_to_iter; | ||
| 188 | 189 | ||
| 189 | /* For internal device-mapper use. */ | 190 | /* For internal device-mapper use. */ |
| 190 | struct list_head list; | 191 | struct list_head list; |
diff --git a/include/linux/string.h b/include/linux/string.h index dd39a690c841..4a5a0eb7df51 100644 --- a/include/linux/string.h +++ b/include/linux/string.h | |||
| @@ -147,8 +147,8 @@ extern int memcmp(const void *,const void *,__kernel_size_t); | |||
| 147 | extern void * memchr(const void *,int,__kernel_size_t); | 147 | extern void * memchr(const void *,int,__kernel_size_t); |
| 148 | #endif | 148 | #endif |
| 149 | #ifndef __HAVE_ARCH_MEMCPY_MCSAFE | 149 | #ifndef __HAVE_ARCH_MEMCPY_MCSAFE |
| 150 | static inline __must_check int memcpy_mcsafe(void *dst, const void *src, | 150 | static inline __must_check unsigned long memcpy_mcsafe(void *dst, |
| 151 | size_t cnt) | 151 | const void *src, size_t cnt) |
| 152 | { | 152 | { |
| 153 | memcpy(dst, src, cnt); | 153 | memcpy(dst, src, cnt); |
| 154 | return 0; | 154 | return 0; |
diff --git a/include/linux/uio.h b/include/linux/uio.h index e67e12adb136..409c845d4cd3 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h | |||
| @@ -154,6 +154,12 @@ size_t _copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i); | |||
| 154 | #define _copy_from_iter_flushcache _copy_from_iter_nocache | 154 | #define _copy_from_iter_flushcache _copy_from_iter_nocache |
| 155 | #endif | 155 | #endif |
| 156 | 156 | ||
| 157 | #ifdef CONFIG_ARCH_HAS_UACCESS_MCSAFE | ||
| 158 | size_t _copy_to_iter_mcsafe(const void *addr, size_t bytes, struct iov_iter *i); | ||
| 159 | #else | ||
| 160 | #define _copy_to_iter_mcsafe _copy_to_iter | ||
| 161 | #endif | ||
| 162 | |||
| 157 | static __always_inline __must_check | 163 | static __always_inline __must_check |
| 158 | size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i) | 164 | size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i) |
| 159 | { | 165 | { |
| @@ -163,6 +169,15 @@ size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i) | |||
| 163 | return _copy_from_iter_flushcache(addr, bytes, i); | 169 | return _copy_from_iter_flushcache(addr, bytes, i); |
| 164 | } | 170 | } |
| 165 | 171 | ||
| 172 | static __always_inline __must_check | ||
| 173 | size_t copy_to_iter_mcsafe(void *addr, size_t bytes, struct iov_iter *i) | ||
| 174 | { | ||
| 175 | if (unlikely(!check_copy_size(addr, bytes, false))) | ||
| 176 | return 0; | ||
| 177 | else | ||
| 178 | return _copy_to_iter_mcsafe(addr, bytes, i); | ||
| 179 | } | ||
| 180 | |||
| 166 | size_t iov_iter_zero(size_t bytes, struct iov_iter *); | 181 | size_t iov_iter_zero(size_t bytes, struct iov_iter *); |
| 167 | unsigned long iov_iter_alignment(const struct iov_iter *i); | 182 | unsigned long iov_iter_alignment(const struct iov_iter *i); |
| 168 | unsigned long iov_iter_gap_alignment(const struct iov_iter *i); | 183 | unsigned long iov_iter_gap_alignment(const struct iov_iter *i); |
