fsnotify: allow ignored_mask to survive modification
Eric Paris [Fri, 18 Dec 2009 02:24:33 +0000 (21:24 -0500)]
Some inodes a group may want to never hear about a set of events even if
the inode is modified.  We add a new mark flag which indicates that these
marks should not have their ignored_mask cleared on modification.

Signed-off-by: Eric Paris <eparis@redhat.com>

fs/notify/fsnotify.c
include/linux/fsnotify_backend.h

index 3ad940d..54d58d5 100644 (file)
@@ -148,7 +148,8 @@ void __fsnotify_flush_ignored_mask(struct inode *inode, void *data, int data_is)
        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);
        }
@@ -160,7 +161,8 @@ void __fsnotify_flush_ignored_mask(struct inode *inode, void *data, int data_is)
                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);
                }
index 018416e..8ca19df 100644 (file)
@@ -271,6 +271,7 @@ struct fsnotify_mark {
 #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 */
 };