From 103ec96b1336d3571b906a2d36b29e29df5e56fe Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Tue, 12 Jun 2012 16:20:29 +0200 Subject: [PATCH] --- yaml --- r: 320977 b: refs/heads/master c: 4fcf1c6205fcfc7a226a144ae4d83b7f5415cab8 h: refs/heads/master i: 320975: 6c5db1e1936cde51372c13c0eb5df1662aa160ad v: v3 --- [refs] | 2 +- trunk/include/linux/mm.h | 1 + trunk/mm/filemap.c | 19 +++++++++++++++++++ trunk/mm/filemap_xip.c | 1 + 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 7a14d733f0a5..5bcf7df6997e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 41c4d25f78c01ede13efee1f2e979f3f35dd26f6 +refs/heads/master: 4fcf1c6205fcfc7a226a144ae4d83b7f5415cab8 diff --git a/trunk/include/linux/mm.h b/trunk/include/linux/mm.h index b36d08ce5c57..15987d8e1d59 100644 --- a/trunk/include/linux/mm.h +++ b/trunk/include/linux/mm.h @@ -1411,6 +1411,7 @@ extern void truncate_inode_pages_range(struct address_space *, /* generic vm_area_ops exported for stackable file systems */ extern int filemap_fault(struct vm_area_struct *, struct vm_fault *); +extern int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf); /* mm/page-writeback.c */ int write_one_page(struct page *page, int wait); diff --git a/trunk/mm/filemap.c b/trunk/mm/filemap.c index a4a5260b0279..51efee65c2cc 100644 --- a/trunk/mm/filemap.c +++ b/trunk/mm/filemap.c @@ -1712,8 +1712,27 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) } EXPORT_SYMBOL(filemap_fault); +int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) +{ + struct page *page = vmf->page; + struct inode *inode = vma->vm_file->f_path.dentry->d_inode; + int ret = VM_FAULT_LOCKED; + + file_update_time(vma->vm_file); + lock_page(page); + if (page->mapping != inode->i_mapping) { + unlock_page(page); + ret = VM_FAULT_NOPAGE; + goto out; + } +out: + return ret; +} +EXPORT_SYMBOL(filemap_page_mkwrite); + const struct vm_operations_struct generic_file_vm_ops = { .fault = filemap_fault, + .page_mkwrite = filemap_page_mkwrite, }; /* This is used for a general mmap of a disk file */ diff --git a/trunk/mm/filemap_xip.c b/trunk/mm/filemap_xip.c index 213ca1f53409..80b34ef82dfe 100644 --- a/trunk/mm/filemap_xip.c +++ b/trunk/mm/filemap_xip.c @@ -304,6 +304,7 @@ static int xip_file_fault(struct vm_area_struct *vma, struct vm_fault *vmf) static const struct vm_operations_struct xip_file_vm_ops = { .fault = xip_file_fault, + .page_mkwrite = filemap_page_mkwrite, }; int xip_file_mmap(struct file * file, struct vm_area_struct * vma)