aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dax/device.c6
-rw-r--r--fs/dax.c13
-rw-r--r--include/linux/uio.h2
3 files changed, 9 insertions, 12 deletions
diff --git a/drivers/dax/device.c b/drivers/dax/device.c
index bbe4d72ca105..948806e57cee 100644
--- a/drivers/dax/device.c
+++ b/drivers/dax/device.c
@@ -535,6 +535,11 @@ static unsigned long dax_get_unmapped_area(struct file *filp,
535 return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags); 535 return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags);
536} 536}
537 537
538static const struct address_space_operations dev_dax_aops = {
539 .set_page_dirty = noop_set_page_dirty,
540 .invalidatepage = noop_invalidatepage,
541};
542
538static int dax_open(struct inode *inode, struct file *filp) 543static int dax_open(struct inode *inode, struct file *filp)
539{ 544{
540 struct dax_device *dax_dev = inode_dax(inode); 545 struct dax_device *dax_dev = inode_dax(inode);
@@ -544,6 +549,7 @@ static int dax_open(struct inode *inode, struct file *filp)
544 dev_dbg(&dev_dax->dev, "trace\n"); 549 dev_dbg(&dev_dax->dev, "trace\n");
545 inode->i_mapping = __dax_inode->i_mapping; 550 inode->i_mapping = __dax_inode->i_mapping;
546 inode->i_mapping->host = __dax_inode; 551 inode->i_mapping->host = __dax_inode;
552 inode->i_mapping->a_ops = &dev_dax_aops;
547 filp->f_mapping = inode->i_mapping; 553 filp->f_mapping = inode->i_mapping;
548 filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping); 554 filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);
549 filp->private_data = dev_dax; 555 filp->private_data = dev_dax;
diff --git a/fs/dax.c b/fs/dax.c
index f32d7125ad0f..b68ce484e1be 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -1120,21 +1120,12 @@ static vm_fault_t dax_load_hole(struct address_space *mapping, void *entry,
1120{ 1120{
1121 struct inode *inode = mapping->host; 1121 struct inode *inode = mapping->host;
1122 unsigned long vaddr = vmf->address; 1122 unsigned long vaddr = vmf->address;
1123 vm_fault_t ret = VM_FAULT_NOPAGE; 1123 pfn_t pfn = pfn_to_pfn_t(my_zero_pfn(vaddr));
1124 struct page *zero_page; 1124 vm_fault_t ret;
1125 pfn_t pfn;
1126
1127 zero_page = ZERO_PAGE(0);
1128 if (unlikely(!zero_page)) {
1129 ret = VM_FAULT_OOM;
1130 goto out;
1131 }
1132 1125
1133 pfn = page_to_pfn_t(zero_page);
1134 dax_insert_mapping_entry(mapping, vmf, entry, pfn, RADIX_DAX_ZERO_PAGE, 1126 dax_insert_mapping_entry(mapping, vmf, entry, pfn, RADIX_DAX_ZERO_PAGE,
1135 false); 1127 false);
1136 ret = vmf_insert_mixed(vmf->vma, vaddr, pfn); 1128 ret = vmf_insert_mixed(vmf->vma, vaddr, pfn);
1137out:
1138 trace_dax_load_hole(inode, vmf, ret); 1129 trace_dax_load_hole(inode, vmf, ret);
1139 return ret; 1130 return ret;
1140} 1131}
diff --git a/include/linux/uio.h b/include/linux/uio.h
index 409c845d4cd3..422b1c01ee0d 100644
--- a/include/linux/uio.h
+++ b/include/linux/uio.h
@@ -172,7 +172,7 @@ size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i)
172static __always_inline __must_check 172static __always_inline __must_check
173size_t copy_to_iter_mcsafe(void *addr, size_t bytes, struct iov_iter *i) 173size_t copy_to_iter_mcsafe(void *addr, size_t bytes, struct iov_iter *i)
174{ 174{
175 if (unlikely(!check_copy_size(addr, bytes, false))) 175 if (unlikely(!check_copy_size(addr, bytes, true)))
176 return 0; 176 return 0;
177 else 177 else
178 return _copy_to_iter_mcsafe(addr, bytes, i); 178 return _copy_to_iter_mcsafe(addr, bytes, i);