diff options
Diffstat (limited to 'fs/ocfs2/mmap.c')
-rw-r--r-- | fs/ocfs2/mmap.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c index 904f39ff5340..cd75508b1c8a 100644 --- a/fs/ocfs2/mmap.c +++ b/fs/ocfs2/mmap.c | |||
@@ -60,24 +60,23 @@ static inline int ocfs2_vm_op_unblock_sigs(sigset_t *oldset) | |||
60 | return sigprocmask(SIG_SETMASK, oldset, NULL); | 60 | return sigprocmask(SIG_SETMASK, oldset, NULL); |
61 | } | 61 | } |
62 | 62 | ||
63 | static struct page *ocfs2_nopage(struct vm_area_struct * area, | 63 | static struct page *ocfs2_fault(struct vm_area_struct *area, |
64 | unsigned long address, | 64 | struct fault_data *fdata) |
65 | int *type) | ||
66 | { | 65 | { |
67 | struct page *page = NOPAGE_SIGBUS; | 66 | struct page *page = NULL; |
68 | sigset_t blocked, oldset; | 67 | sigset_t blocked, oldset; |
69 | int ret; | 68 | int ret; |
70 | 69 | ||
71 | mlog_entry("(area=%p, address=%lu, type=%p)\n", area, address, | 70 | mlog_entry("(area=%p, page offset=%lu)\n", area, fdata->pgoff); |
72 | type); | ||
73 | 71 | ||
74 | ret = ocfs2_vm_op_block_sigs(&blocked, &oldset); | 72 | ret = ocfs2_vm_op_block_sigs(&blocked, &oldset); |
75 | if (ret < 0) { | 73 | if (ret < 0) { |
74 | fdata->type = VM_FAULT_SIGBUS; | ||
76 | mlog_errno(ret); | 75 | mlog_errno(ret); |
77 | goto out; | 76 | goto out; |
78 | } | 77 | } |
79 | 78 | ||
80 | page = filemap_nopage(area, address, type); | 79 | page = filemap_fault(area, fdata); |
81 | 80 | ||
82 | ret = ocfs2_vm_op_unblock_sigs(&oldset); | 81 | ret = ocfs2_vm_op_unblock_sigs(&oldset); |
83 | if (ret < 0) | 82 | if (ret < 0) |
@@ -209,7 +208,7 @@ out: | |||
209 | } | 208 | } |
210 | 209 | ||
211 | static struct vm_operations_struct ocfs2_file_vm_ops = { | 210 | static struct vm_operations_struct ocfs2_file_vm_ops = { |
212 | .nopage = ocfs2_nopage, | 211 | .fault = ocfs2_fault, |
213 | .page_mkwrite = ocfs2_page_mkwrite, | 212 | .page_mkwrite = ocfs2_page_mkwrite, |
214 | }; | 213 | }; |
215 | 214 | ||
@@ -226,7 +225,7 @@ int ocfs2_mmap(struct file *file, struct vm_area_struct *vma) | |||
226 | ocfs2_meta_unlock(file->f_dentry->d_inode, lock_level); | 225 | ocfs2_meta_unlock(file->f_dentry->d_inode, lock_level); |
227 | out: | 226 | out: |
228 | vma->vm_ops = &ocfs2_file_vm_ops; | 227 | vma->vm_ops = &ocfs2_file_vm_ops; |
229 | vma->vm_flags |= VM_CAN_INVALIDATE; | 228 | vma->vm_flags |= VM_CAN_INVALIDATE | VM_CAN_NONLINEAR; |
230 | return 0; | 229 | return 0; |
231 | } | 230 | } |
232 | 231 | ||