+#ifndef HAVE_VM_OP_FAULT
+static int vvp_io_kernel_fault(struct vvp_fault_io *cfio)
+{
+ cfs_page_t *vmpage;
+
+ vmpage = filemap_nopage(cfio->ft_vma, cfio->nopage.ft_address,
+ cfio->nopage.ft_type);
+
+ if (vmpage == NOPAGE_SIGBUS) {
+ CDEBUG(D_PAGE, "got addr %lu type %lx - SIGBUS\n",
+ cfio->nopage.ft_address,(long)cfio->nopage.ft_type);
+ return -EFAULT;
+ } else if (vmpage == NOPAGE_OOM) {
+ CDEBUG(D_PAGE, "got addr %lu type %lx - OOM\n",
+ cfio->nopage.ft_address, (long)cfio->nopage.ft_type);
+ return -ENOMEM;
+ }
+
+ LL_CDEBUG_PAGE(D_PAGE, vmpage, "got addr %lu type %lx\n",
+ cfio->nopage.ft_address, (long)cfio->nopage.ft_type);
+
+ cfio->ft_vmpage = vmpage;
+ lock_page(vmpage);
+
+ return 0;
+}
+#else
+static int vvp_io_kernel_fault(struct vvp_fault_io *cfio)
+{
+ struct vm_fault *vmf = cfio->fault.ft_vmf;
+
+ cfio->fault.ft_flags = filemap_fault(cfio->ft_vma, vmf);
+
+ if (vmf->page) {
+ LL_CDEBUG_PAGE(D_PAGE, vmf->page, "got addr %p type NOPAGE\n",
+ vmf->virtual_address);
+ if (unlikely(!(cfio->fault.ft_flags & VM_FAULT_LOCKED))) {
+ lock_page(vmf->page);
+ cfio->fault.ft_flags &= VM_FAULT_LOCKED;
+ }
+
+ cfio->ft_vmpage = vmf->page;
+ return 0;
+ }
+
+ if (cfio->fault.ft_flags & VM_FAULT_SIGBUS) {
+ CDEBUG(D_PAGE, "got addr %p - SIGBUS\n", vmf->virtual_address);
+ return -EFAULT;
+ }
+
+ if (cfio->fault.ft_flags & VM_FAULT_OOM) {
+ CDEBUG(D_PAGE, "got addr %p - OOM\n", vmf->virtual_address);
+ return -ENOMEM;
+ }
+
+ if (cfio->fault.ft_flags & VM_FAULT_RETRY)
+ return -EAGAIN;
+
+ CERROR("unknow error in page fault %d!\n", cfio->fault.ft_flags);
+ return -EINVAL;
+}
+
+#endif
+