return err < 0 ? err : 0;
 }
 
-/*
- * Get message from skb.  Each message is processed by audit_receive_msg.
- * Malformed skbs with wrong length are discarded silently.
+/**
+ * audit_receive - receive messages from a netlink control socket
+ * @skb: the message buffer
+ *
+ * Parse the provided skb and deal with any messages that may be present,
+ * malformed skbs are discarded.
  */
-static void audit_receive_skb(struct sk_buff *skb)
+static void audit_receive(struct sk_buff  *skb)
 {
        struct nlmsghdr *nlh;
        /*
        nlh = nlmsg_hdr(skb);
        len = skb->len;
 
+       mutex_lock(&audit_cmd_mutex);
        while (nlmsg_ok(nlh, len)) {
                err = audit_receive_msg(skb, nlh);
                /* if err or if this message says it wants a response */
 
                nlh = nlmsg_next(nlh, &len);
        }
-}
-
-/* Receive messages from netlink socket. */
-static void audit_receive(struct sk_buff  *skb)
-{
-       mutex_lock(&audit_cmd_mutex);
-       audit_receive_skb(skb);
        mutex_unlock(&audit_cmd_mutex);
 }