#define AUDIT_ON       1
 #define AUDIT_LOCKED   2
 int            audit_enabled;
+int            audit_ever_enabled;
 
 /* Default state when kernel boots without any parameters. */
 static int     audit_default;
 
 static int audit_set_enabled(int state, uid_t loginuid, u32 sid)
 {
+       int rc;
        if (state < AUDIT_OFF || state > AUDIT_LOCKED)
                return -EINVAL;
 
-       return audit_do_config_change("audit_enabled", &audit_enabled, state,
-                                     loginuid, sid);
+       rc =  audit_do_config_change("audit_enabled", &audit_enabled, state,
+                                    loginuid, sid);
+
+       if (!rc)
+               audit_ever_enabled |= !!state;
+
+       return rc;
 }
 
 static int audit_set_failure(int state, uid_t loginuid, u32 sid)
        skb_queue_head_init(&audit_skb_queue);
        audit_initialized = 1;
        audit_enabled = audit_default;
+       audit_ever_enabled |= !!audit_default;
 
        /* Register the callback with selinux.  This callback will be invoked
         * when a new policy is loaded. */
        printk(KERN_INFO "audit: %s%s\n",
               audit_default ? "enabled" : "disabled",
               audit_initialized ? "" : " (after initialization)");
-       if (audit_initialized)
+       if (audit_initialized) {
                audit_enabled = audit_default;
+               audit_ever_enabled |= !!audit_default;
+       }
        return 1;
 }
 
 
 #include "audit.h"
 
 extern struct list_head audit_filter_list[];
+extern int audit_ever_enabled;
 
 /* AUDIT_NAMES is the number of slots we reserve in the audit_context
  * for saving names from getname(). */
        struct audit_context *context;
        enum audit_state     state;
 
-       if (likely(!audit_enabled))
+       if (likely(!audit_ever_enabled))
                return 0; /* Return if not auditing. */
 
        state = audit_filter_task(tsk);