#include <linux/ptrace.h>
 #include <linux/vmalloc.h>
 #include <linux/sched/sysctl.h>
+#include <linux/fsnotify.h>
 
 #include <trace/events/kmem.h>
 
 static inline vm_fault_t create_huge_pmd(struct vm_fault *vmf)
 {
        struct vm_area_struct *vma = vmf->vma;
+
        if (vma_is_anonymous(vma))
                return do_huge_pmd_anonymous_page(vmf);
+       /*
+        * Currently we just emit PAGE_SIZE for our fault events, so don't allow
+        * a huge fault if we have a pre content watch on this file.  This would
+        * be trivial to support, but there would need to be tests to ensure
+        * this works properly and those don't exist currently.
+        */
+       if (unlikely(FMODE_FSNOTIFY_HSM(vma->vm_file->f_mode)))
+               return VM_FAULT_FALLBACK;
        if (vma->vm_ops->huge_fault)
                return vma->vm_ops->huge_fault(vmf, PMD_ORDER);
        return VM_FAULT_FALLBACK;
        }
 
        if (vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) {
+               /* See comment in create_huge_pmd. */
+               if (unlikely(FMODE_FSNOTIFY_HSM(vma->vm_file->f_mode)))
+                       goto split;
                if (vma->vm_ops->huge_fault) {
                        ret = vma->vm_ops->huge_fault(vmf, PMD_ORDER);
                        if (!(ret & VM_FAULT_FALLBACK))
        /* No support for anonymous transparent PUD pages yet */
        if (vma_is_anonymous(vma))
                return VM_FAULT_FALLBACK;
+       /* See comment in create_huge_pmd. */
+       if (unlikely(FMODE_FSNOTIFY_HSM(vma->vm_file->f_mode)))
+               return VM_FAULT_FALLBACK;
        if (vma->vm_ops->huge_fault)
                return vma->vm_ops->huge_fault(vmf, PUD_ORDER);
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
        if (vma_is_anonymous(vma))
                goto split;
        if (vma->vm_flags & (VM_SHARED | VM_MAYSHARE)) {
+               /* See comment in create_huge_pmd. */
+               if (unlikely(FMODE_FSNOTIFY_HSM(vma->vm_file->f_mode)))
+                       goto split;
                if (vma->vm_ops->huge_fault) {
                        ret = vma->vm_ops->huge_fault(vmf, PUD_ORDER);
                        if (!(ret & VM_FAULT_FALLBACK))