mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04: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. [[email protected]: add local vm_ops to avoid 80-cols mess] Signed-off-by: Kirill A. Shutemov <[email protected]> Cc: Yigal Korman <[email protected]> Acked-by: Boaz Harrosh <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Jan Kara <[email protected]> Cc: Dave Chinner <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
09f7298100
commit
8a04446ab0
1 file changed
+2
-1
@@ -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
|
||||
|
||||
Reference in new issue
Block a user