Skip to content

Commit

Permalink
AUDIT: Add helper functions to allocate and free audit_buffers.
Browse files Browse the repository at this point in the history
Signed-off-by: Chris Wright <chrisw@osdl.org>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
  • Loading branch information
Chris Wright authored and David Woodhouse committed May 6, 2005
1 parent c2f0c7c commit 16e1904
Showing 1 changed file with 38 additions and 23 deletions.
61 changes: 38 additions & 23 deletions kernel/audit.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,42 @@ static int __init audit_enable(char *str)

__setup("audit=", audit_enable);

static void audit_buffer_free(struct audit_buffer *ab)
{
unsigned long flags;

atomic_dec(&audit_backlog);
spin_lock_irqsave(&audit_freelist_lock, flags);
if (++audit_freelist_count > AUDIT_MAXFREE)
kfree(ab);
else
list_add(&ab->list, &audit_freelist);
spin_unlock_irqrestore(&audit_freelist_lock, flags);
}

static struct audit_buffer * audit_buffer_alloc(int gfp_mask)
{
unsigned long flags;
struct audit_buffer *ab = NULL;

spin_lock_irqsave(&audit_freelist_lock, flags);
if (!list_empty(&audit_freelist)) {
ab = list_entry(audit_freelist.next,
struct audit_buffer, list);
list_del(&ab->list);
--audit_freelist_count;
}
spin_unlock_irqrestore(&audit_freelist_lock, flags);

if (!ab) {
ab = kmalloc(sizeof(*ab), GFP_ATOMIC);
if (!ab)
goto out;
}
atomic_inc(&audit_backlog);
out:
return ab;
}

/* Obtain an audit buffer. This routine does locking to obtain the
* audit buffer, but then no locking is required for calls to
Expand All @@ -630,7 +666,6 @@ __setup("audit=", audit_enable);
struct audit_buffer *audit_log_start(struct audit_context *ctx)
{
struct audit_buffer *ab = NULL;
unsigned long flags;
struct timespec t;
unsigned int serial;

Expand All @@ -649,23 +684,12 @@ struct audit_buffer *audit_log_start(struct audit_context *ctx)
return NULL;
}

spin_lock_irqsave(&audit_freelist_lock, flags);
if (!list_empty(&audit_freelist)) {
ab = list_entry(audit_freelist.next,
struct audit_buffer, list);
list_del(&ab->list);
--audit_freelist_count;
}
spin_unlock_irqrestore(&audit_freelist_lock, flags);

if (!ab)
ab = kmalloc(sizeof(*ab), GFP_ATOMIC);
ab = audit_buffer_alloc(GFP_ATOMIC);
if (!ab) {
audit_log_lost("out of memory in audit_log_start");
return NULL;
}

atomic_inc(&audit_backlog);
skb_queue_head_init(&ab->sklist);

ab->ctx = ctx;
Expand Down Expand Up @@ -824,8 +848,6 @@ static void audit_log_end_irq(struct audit_buffer *ab)
* be called in an irq context. */
static void audit_log_end_fast(struct audit_buffer *ab)
{
unsigned long flags;

BUG_ON(in_irq());
if (!ab)
return;
Expand All @@ -836,14 +858,7 @@ static void audit_log_end_fast(struct audit_buffer *ab)
if (audit_log_drain(ab))
return;
}

atomic_dec(&audit_backlog);
spin_lock_irqsave(&audit_freelist_lock, flags);
if (++audit_freelist_count > AUDIT_MAXFREE)
kfree(ab);
else
list_add(&ab->list, &audit_freelist);
spin_unlock_irqrestore(&audit_freelist_lock, flags);
audit_buffer_free(ab);
}

/* Send or queue the message in the audit buffer, depending on the
Expand Down

0 comments on commit 16e1904

Please sign in to comment.