mm: mm_event: fix compact_scan
[GitHub/MotorolaMobilityLLC/kernel-slsi.git] / kernel / audit_watch.c
index 9eb8b3511636e96e0607be2484119823b1034fb5..4a98f6e314a9b3124a6d15371d4d906407799977 100644 (file)
@@ -419,6 +419,13 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
        struct path parent_path;
        int h, ret = 0;
 
+       /*
+        * When we will be calling audit_add_to_parent, krule->watch might have
+        * been updated and watch might have been freed.
+        * So we need to keep a reference of watch.
+        */
+       audit_get_watch(watch);
+
        mutex_unlock(&audit_filter_mutex);
 
        /* Avoid calling path_lookup under audit_filter_mutex. */
@@ -427,8 +434,10 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
        /* caller expects mutex locked */
        mutex_lock(&audit_filter_mutex);
 
-       if (ret)
+       if (ret) {
+               audit_put_watch(watch);
                return ret;
+       }
 
        /* either find an old parent or attach a new one */
        parent = audit_find_parent(d_backing_inode(parent_path.dentry));
@@ -446,6 +455,7 @@ int audit_add_watch(struct audit_krule *krule, struct list_head **list)
        *list = &audit_inode_hash[h];
 error:
        path_put(&parent_path);
+       audit_put_watch(watch);
        return ret;
 }