audit: make use of remaining sleep time from wait_for_auditd
authorRichard Guy Briggs <rgb@redhat.com>
Mon, 16 Sep 2013 14:45:59 +0000 (10:45 -0400)
committerEric Paris <eparis@redhat.com>
Tue, 14 Jan 2014 03:27:53 +0000 (22:27 -0500)
If wait_for_auditd() times out, go immediately to the error function rather
than retesting the loop conditions.

Signed-off-by: Richard Guy Briggs <rgb@redhat.com>
Signed-off-by: Eric Paris <eparis@redhat.com>
kernel/audit.c

index 6cd2ecca705bd5623bb2992ebd2218ab31a30aef..09e287b1dc0eeda451f893c5a0656f00e237d716 100644 (file)
@@ -1209,18 +1209,21 @@ static inline void audit_get_stamp(struct audit_context *ctx,
 /*
  * Wait for auditd to drain the queue a little
  */
-static void wait_for_auditd(unsigned long sleep_time)
+static unsigned long wait_for_auditd(unsigned long sleep_time)
 {
+       unsigned long timeout = sleep_time;
        DECLARE_WAITQUEUE(wait, current);
        set_current_state(TASK_UNINTERRUPTIBLE);
        add_wait_queue(&audit_backlog_wait, &wait);
 
        if (audit_backlog_limit &&
            skb_queue_len(&audit_skb_queue) > audit_backlog_limit)
-               schedule_timeout(sleep_time);
+               timeout = schedule_timeout(sleep_time);
 
        __set_current_state(TASK_RUNNING);
        remove_wait_queue(&audit_backlog_wait, &wait);
+
+       return timeout;
 }
 
 /**
@@ -1267,8 +1270,9 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask,
                        sleep_time = timeout_start + audit_backlog_wait_time -
                                        jiffies;
                        if ((long)sleep_time > 0) {
-                               wait_for_auditd(sleep_time);
-                               continue;
+                               sleep_time = wait_for_auditd(sleep_time);
+                               if ((long)sleep_time > 0)
+                                       continue;
                        }
                }
                if (audit_rate_check() && printk_ratelimit())