|
@@ -2320,7 +2320,7 @@ block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
|
|
struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
|
|
unsigned long end;
|
|
unsigned long end;
|
|
loff_t size;
|
|
loff_t size;
|
|
- int ret = -EINVAL;
|
|
|
|
|
|
+ int ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */
|
|
|
|
|
|
lock_page(page);
|
|
lock_page(page);
|
|
size = i_size_read(inode);
|
|
size = i_size_read(inode);
|
|
@@ -2340,10 +2340,14 @@ block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
|
|
if (!ret)
|
|
if (!ret)
|
|
ret = block_commit_write(page, 0, end);
|
|
ret = block_commit_write(page, 0, end);
|
|
|
|
|
|
-out_unlock:
|
|
|
|
- if (ret)
|
|
|
|
- ret = VM_FAULT_SIGBUS;
|
|
|
|
|
|
+ if (unlikely(ret)) {
|
|
|
|
+ if (ret == -ENOMEM)
|
|
|
|
+ ret = VM_FAULT_OOM;
|
|
|
|
+ else /* -ENOSPC, -EIO, etc */
|
|
|
|
+ ret = VM_FAULT_SIGBUS;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+out_unlock:
|
|
unlock_page(page);
|
|
unlock_page(page);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|