mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-14 21:01:29 +00:00
mm, dax: VMA with vm_ops->pfn_mkwrite wants to be write-notified
For VM_PFNMAP and VM_MIXEDMAP we use vm_ops->pfn_mkwrite instead of vm_ops->page_mkwrite to notify abort write access. This means we want vma->vm_page_prot to be write-protected if the VMA provides this vm_ops. A theoretical scenario that will cause these missed events is: On writable mapping with vm_ops->pfn_mkwrite, but without vm_ops->page_mkwrite: read fault followed by write access to the pfn. Writable pte will be set up on read fault and write fault will not be generated. I found it examining Dave's complaint on generic/080: http://lkml.kernel.org/g/20150831233803.GO3902@dastard Although I don't think it's the reason. It shouldn't be a problem for ext2/ext4 as they provide both pfn_mkwrite and page_mkwrite. [akpm@linux-foundation.org: add local vm_ops to avoid 80-cols mess] Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Yigal Korman <yigal@plexistor.com> Acked-by: Boaz Harrosh <boaz@plexistor.com> Cc: Matthew Wilcox <matthew.r.wilcox@intel.com> Cc: Jan Kara <jack@suse.cz> Cc: Dave Chinner <david@fromorbit.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
09f7298100
commit
8a04446ab0
@ -1490,13 +1490,14 @@ SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg)
|
||||
int vma_wants_writenotify(struct vm_area_struct *vma)
|
||||
{
|
||||
vm_flags_t vm_flags = vma->vm_flags;
|
||||
const struct vm_operations_struct *vm_ops = vma->vm_ops;
|
||||
|
||||
/* If it was private or non-writable, the write bit is already clear */
|
||||
if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED)))
|
||||
return 0;
|
||||
|
||||
/* The backer wishes to know when pages are first written to? */
|
||||
if (vma->vm_ops && vma->vm_ops->page_mkwrite)
|
||||
if (vm_ops && (vm_ops->page_mkwrite || vm_ops->pfn_mkwrite))
|
||||
return 1;
|
||||
|
||||
/* The open routine did something to the protections that pgprot_modify
|
||||
|
Loading…
Reference in New Issue
Block a user