aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2018-06-08 18:16:44 -0400
committerDan Williams <dan.j.williams@intel.com>2018-06-08 18:16:44 -0400
commit930218affeadd1325ea17e053f0dcecf218f5a4f (patch)
tree203c293668a88e03b9f292cf4d5a294ca8a4275a /include/linux
parentb56845794e1e93121acb74ca325db965035d5545 (diff)
parent5d8beee20d89e34ff1dcb0da84adf7607858c59d (diff)
Merge branch 'for-4.18/mcsafe' into libnvdimm-for-next
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/dax.h5
-rw-r--r--include/linux/device-mapper.h5
-rw-r--r--include/linux/string.h4
-rw-r--r--include/linux/uio.h15
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
25extern struct attribute_group dax_attribute_group; 28extern 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);
126size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, 129size_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);
131size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
132 size_t bytes, struct iov_iter *i);
128void dax_flush(struct dax_device *dax_dev, void *addr, size_t size); 133void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
129 134
130ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter, 135ssize_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 */
134typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff, 134typedef 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);
136typedef size_t (*dm_dax_copy_from_iter_fn)(struct dm_target *ti, pgoff_t pgoff, 136typedef 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);
147extern void * memchr(const void *,int,__kernel_size_t); 147extern void * memchr(const void *,int,__kernel_size_t);
148#endif 148#endif
149#ifndef __HAVE_ARCH_MEMCPY_MCSAFE 149#ifndef __HAVE_ARCH_MEMCPY_MCSAFE
150static inline __must_check int memcpy_mcsafe(void *dst, const void *src, 150static 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
158size_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
157static __always_inline __must_check 163static __always_inline __must_check
158size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i) 164size_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
172static __always_inline __must_check
173size_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
166size_t iov_iter_zero(size_t bytes, struct iov_iter *); 181size_t iov_iter_zero(size_t bytes, struct iov_iter *);
167unsigned long iov_iter_alignment(const struct iov_iter *i); 182unsigned long iov_iter_alignment(const struct iov_iter *i);
168unsigned long iov_iter_gap_alignment(const struct iov_iter *i); 183unsigned long iov_iter_gap_alignment(const struct iov_iter *i);