if (!hlist_empty(&inode->i_fsnotify_marks)) {
                spin_lock(&inode->i_lock);
                hlist_for_each_entry(mark, node, &inode->i_fsnotify_marks, i.i_list) {
-                       mark->ignored_mask = 0;
+                       if (!(mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
+                               mark->ignored_mask = 0;
                }
                spin_unlock(&inode->i_lock);
        }
                if (mnt && !hlist_empty(&mnt->mnt_fsnotify_marks)) {
                        spin_lock(&mnt->mnt_root->d_lock);
                        hlist_for_each_entry(mark, node, &mnt->mnt_fsnotify_marks, m.m_list) {
-                               mark->ignored_mask = 0;
+                               if (!(mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY))
+                                       mark->ignored_mask = 0;
                        }
                        spin_unlock(&mnt->mnt_root->d_lock);
                }
 
 #define FSNOTIFY_MARK_FLAG_INODE               0x01
 #define FSNOTIFY_MARK_FLAG_VFSMOUNT            0x02
 #define FSNOTIFY_MARK_FLAG_OBJECT_PINNED       0x04
+#define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY 0x08
        unsigned int flags;             /* vfsmount or inode mark? */
        void (*free_mark)(struct fsnotify_mark *mark); /* called on final put+free */
 };