diff options
| -rw-r--r-- | drivers/dax/device.c | 6 | ||||
| -rw-r--r-- | fs/dax.c | 13 | ||||
| -rw-r--r-- | include/linux/uio.h | 2 |
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 | ||
| 538 | static const struct address_space_operations dev_dax_aops = { | ||
| 539 | .set_page_dirty = noop_set_page_dirty, | ||
| 540 | .invalidatepage = noop_invalidatepage, | ||
| 541 | }; | ||
| 542 | |||
| 538 | static int dax_open(struct inode *inode, struct file *filp) | 543 | static 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; |
| @@ -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); |
| 1137 | out: | ||
| 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) | |||
| 172 | static __always_inline __must_check | 172 | static __always_inline __must_check |
| 173 | size_t copy_to_iter_mcsafe(void *addr, size_t bytes, struct iov_iter *i) | 173 | size_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); |
