236
237 error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 0,
238 &xip_mem, &xip_pfn);
239 if (likely(!error))
240 goto found;
241 if (error != -ENODATA)
242 return VM_FAULT_OOM;
243
244
245 if ((vma->vm_flags & (VM_WRITE | VM_MAYWRITE)) &&
246 (vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) &&
247 (!(mapping->host->i_sb->s_flags & MS_RDONLY))) {
248 int err;
249
250
251 mutex_lock(&xip_sparse_mutex);
252 error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 1,
253 &xip_mem, &xip_pfn);
254 mutex_unlock(&xip_sparse_mutex);
255 if (error)
256 return VM_FAULT_SIGBUS;
257
258 __xip_unmap(mapping, vmf->pgoff);
259
260found:
261 err = vm_insert_mixed(vma, (unsigned long)vmf->virtual_address,
262 xip_pfn);
263 if (err == -ENOMEM)
264 return VM_FAULT_OOM;
265 BUG_ON(err);
266 return VM_FAULT_NOPAGE;
267 } else {
268 int err, ret = VM_FAULT_OOM;
269
270 mutex_lock(&xip_sparse_mutex);
271 write_seqcount_begin(&xip_sparse_seq);
272 error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 0,
273 &xip_mem, &xip_pfn);
274 if (unlikely(!error)) {
275 write_seqcount_end(&xip_sparse_seq);
276 mutex_unlock(&xip_sparse_mutex);