fsnotify: store struct file not struct path
[sfrench/cifs-2.6.git] / kernel / audit_watch.c
index 0f03a6ab96edfa6e141086f81eba65b57f8e4a65..b955a22d8ff19ed01703e1502a561309d85ce6a7 100644 (file)
@@ -56,7 +56,7 @@ struct audit_watch {
 
 struct audit_parent {
        struct list_head        watches; /* anchor for audit_watch->wlist */
-       struct fsnotify_mark_entry mark; /* fsnotify mark on the inode */
+       struct fsnotify_mark mark; /* fsnotify mark on the inode */
 };
 
 /* fsnotify handle. */
@@ -72,7 +72,7 @@ static void audit_free_parent(struct audit_parent *parent)
        kfree(parent);
 }
 
-static void audit_watch_free_mark(struct fsnotify_mark_entry *entry)
+static void audit_watch_free_mark(struct fsnotify_mark *entry)
 {
        struct audit_parent *parent;
 
@@ -99,12 +99,9 @@ static void audit_put_parent(struct audit_parent *parent)
 static inline struct audit_parent *audit_find_parent(struct inode *inode)
 {
        struct audit_parent *parent = NULL;
-       struct fsnotify_mark_entry *entry;
-
-       spin_lock(&inode->i_lock);
-       entry = fsnotify_find_mark_entry(audit_watch_group, inode);
-       spin_unlock(&inode->i_lock);
+       struct fsnotify_mark *entry;
 
+       entry = fsnotify_find_inode_mark(audit_watch_group, inode);
        if (entry)
                parent = container_of(entry, struct audit_parent, mark);
 
@@ -161,12 +158,14 @@ static struct audit_parent *audit_init_parent(struct nameidata *ndp)
 
        fsnotify_init_mark(&parent->mark, audit_watch_free_mark);
        parent->mark.mask = AUDIT_FS_WATCH;
-       ret = fsnotify_add_mark(&parent->mark, audit_watch_group, inode, 0);
+       ret = fsnotify_add_mark(&parent->mark, audit_watch_group, inode, NULL, 0);
        if (ret < 0) {
                audit_free_parent(parent);
                return ERR_PTR(ret);
        }
 
+       fsnotify_recalc_group_mask(audit_watch_group);
+
        return parent;
 }
 
@@ -352,7 +351,10 @@ static void audit_remove_parent_watches(struct audit_parent *parent)
        }
        mutex_unlock(&audit_filter_mutex);
 
-       fsnotify_destroy_mark_by_entry(&parent->mark);
+       fsnotify_destroy_mark(&parent->mark);
+
+       fsnotify_recalc_group_mask(audit_watch_group);
+
 }
 
 /* Get path information necessary for adding watches. */
@@ -499,21 +501,23 @@ void audit_remove_watch_rule(struct audit_krule *krule)
 
                if (list_empty(&parent->watches)) {
                        audit_get_parent(parent);
-                       fsnotify_destroy_mark_by_entry(&parent->mark);
+                       fsnotify_destroy_mark(&parent->mark);
                        audit_put_parent(parent);
                }
        }
+
+       fsnotify_recalc_group_mask(audit_watch_group);
+
 }
 
 static bool audit_watch_should_send_event(struct fsnotify_group *group, struct inode *inode,
-                                         __u32 mask, void *data, int data_type)
+                                         struct vfsmount *mnt, __u32 mask, void *data,
+                                         int data_type)
 {
-       struct fsnotify_mark_entry *entry;
+       struct fsnotify_mark *entry;
        bool send;
 
-       spin_lock(&inode->i_lock);
-       entry = fsnotify_find_mark_entry(group, inode);
-       spin_unlock(&inode->i_lock);
+       entry = fsnotify_find_inode_mark(group, inode);
        if (!entry)
                return false;
 
@@ -541,8 +545,8 @@ static int audit_watch_handle_event(struct fsnotify_group *group, struct fsnotif
                return 0;
 
        switch (event->data_type) {
-       case (FSNOTIFY_EVENT_PATH):
-               inode = event->path.dentry->d_inode;
+       case (FSNOTIFY_EVENT_FILE):
+               inode = event->file->f_path.dentry->d_inode;
                break;
        case (FSNOTIFY_EVENT_INODE):
                inode = event->inode;
@@ -577,8 +581,7 @@ static const struct fsnotify_ops audit_watch_fsnotify_ops = {
 
 static int __init audit_watch_init(void)
 {
-       audit_watch_group = fsnotify_alloc_group(AUDIT_FS_WATCH,
-                                                &audit_watch_fsnotify_ops);
+       audit_watch_group = fsnotify_alloc_group(&audit_watch_fsnotify_ops);
        if (IS_ERR(audit_watch_group)) {
                audit_watch_group = NULL;
                audit_panic("cannot create audit fsnotify group");