|
@@ -1618,14 +1618,17 @@ static void fuse_vma_close(struct vm_area_struct *vma)
|
|
|
static int fuse_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|
|
{
|
|
|
struct page *page = vmf->page;
|
|
|
- /*
|
|
|
- * Don't use page->mapping as it may become NULL from a
|
|
|
- * concurrent truncate.
|
|
|
- */
|
|
|
- struct inode *inode = vma->vm_file->f_mapping->host;
|
|
|
+ struct inode *inode = file_inode(vma->vm_file);
|
|
|
+
|
|
|
+ file_update_time(vma->vm_file);
|
|
|
+ lock_page(page);
|
|
|
+ if (page->mapping != inode->i_mapping) {
|
|
|
+ unlock_page(page);
|
|
|
+ return VM_FAULT_NOPAGE;
|
|
|
+ }
|
|
|
|
|
|
fuse_wait_on_page_writeback(inode, page->index);
|
|
|
- return 0;
|
|
|
+ return VM_FAULT_LOCKED;
|
|
|
}
|
|
|
|
|
|
static const struct vm_operations_struct fuse_file_vm_ops = {
|