|
@@ -279,7 +279,20 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf,
|
|
|
handle_t *handle = NULL;
|
|
|
struct inode *inode = file_inode(vmf->vma->vm_file);
|
|
|
struct super_block *sb = inode->i_sb;
|
|
|
- bool write = vmf->flags & FAULT_FLAG_WRITE;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We have to distinguish real writes from writes which will result in a
|
|
|
+ * COW page; COW writes should *not* poke the journal (the file will not
|
|
|
+ * be changed). Doing so would cause unintended failures when mounted
|
|
|
+ * read-only.
|
|
|
+ *
|
|
|
+ * We check for VM_SHARED rather than vmf->cow_page since the latter is
|
|
|
+ * unset for pe_size != PE_SIZE_PTE (i.e. only in do_cow_fault); for
|
|
|
+ * other sizes, dax_iomap_fault will handle splitting / fallback so that
|
|
|
+ * we eventually come back with a COW page.
|
|
|
+ */
|
|
|
+ bool write = (vmf->flags & FAULT_FLAG_WRITE) &&
|
|
|
+ (vmf->vma->vm_flags & VM_SHARED);
|
|
|
|
|
|
if (write) {
|
|
|
sb_start_pagefault(sb);
|