|
@@ -6401,18 +6401,23 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|
|
unsigned long zero_start;
|
|
|
loff_t size;
|
|
|
int ret;
|
|
|
+ int reserved = 0;
|
|
|
u64 page_start;
|
|
|
u64 page_end;
|
|
|
|
|
|
ret = btrfs_delalloc_reserve_space(inode, PAGE_CACHE_SIZE);
|
|
|
- if (!ret)
|
|
|
+ if (!ret) {
|
|
|
ret = btrfs_update_time(vma->vm_file);
|
|
|
+ reserved = 1;
|
|
|
+ }
|
|
|
if (ret) {
|
|
|
if (ret == -ENOMEM)
|
|
|
ret = VM_FAULT_OOM;
|
|
|
else /* -ENOSPC, -EIO, etc */
|
|
|
ret = VM_FAULT_SIGBUS;
|
|
|
- goto out;
|
|
|
+ if (reserved)
|
|
|
+ goto out;
|
|
|
+ goto out_noreserve;
|
|
|
}
|
|
|
|
|
|
ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */
|
|
@@ -6495,6 +6500,7 @@ out_unlock:
|
|
|
unlock_page(page);
|
|
|
out:
|
|
|
btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
|
|
|
+out_noreserve:
|
|
|
return ret;
|
|
|
}
|
|
|
|