deadlock fixes
Quoted 1 line · Alexander Viro
handling, as discussed on IRC yesterday.
Patch in question (thanks to Steve for reminding to send it to list):
kernel/audit.c +41 -17
@@ -368,6 +368,46 @@ static int kauditd_thread(void *dummy)return 0 ; } +int audit_send_list (void *_dest) +{ +struct audit_netlink_list *dest = _dest; +int pid = dest->pid; +struct sk_buff *skb; + +while ((skb =__skb_dequeue (&dest->q)) !=NULL ) +netlink_unicast (audit_sock, skb, pid,0 ); + +kfree (dest); + +return 0 ; +} + +struct sk_buff *audit_make_reply (int pid,int seq,int type,int done, +int multi,void *payload,int size) +{ +struct sk_buff *skb; +struct nlmsghdr *nlh; +int len =NLMSG_SPACE (size); +void *data; +int flags = multi ?NLM_F_MULTI :0 ; +int t = done ?NLMSG_DONE : type; + + skb =alloc_skb (len,GFP_KERNEL ); +if (!skb) +return NULL ; + + nlh =NLMSG_PUT (skb, pid, seq, t, size); + nlh->nlmsg_flags = flags; + data =NLMSG_DATA (nlh); +memcpy (data, payload, size); +return skb; + +nlmsg_failure:/* Used by NLMSG_PUT */ +if (skb) +kfree_skb (skb); +return NULL ; +} +/** * audit_send_reply - send an audit reply message via netlink * @pid: process id to send reply to
@@ -385,29 +425,13 @@ void audit_send_reply(int pid, int seq, void *payload, int size) {struct sk_buff *skb; -struct nlmsghdr *nlh; -int len =NLMSG_SPACE (size); -void *data; -int flags = multi ?NLM_F_MULTI :0 ; -int t = done ?NLMSG_DONE : type; - - skb =alloc_skb (len,GFP_KERNEL ); + skb =audit_make_reply (pid, seq, type, done, multi, payload, size);if (!skb)return ; - - nlh =NLMSG_PUT (skb, pid, seq, t, size); - nlh->nlmsg_flags = flags; - data =NLMSG_DATA (nlh); -memcpy (data, payload, size); -/* Ignore failure. It'll only happen if the sender goes away, because our timeout is set to infinite. */ netlink_unicast (audit_sock, skb, pid,0 );return ; - -nlmsg_failure:/* Used by NLMSG_PUT */ -if (skb) -kfree_skb (skb); }/*
kernel/audit.h +10 -0
@@ -95,12 +95,22 @@ struct audit_entry {extern int audit_pid;extern int audit_comparator (const u32 left,const u32 op,const u32 right);extern int audit_compare_dname_path (const char *dname,const char *path); +extern struct sk_buff *audit_make_reply (int pid,int seq,int type, +int done,int multi, +void *payload,int size);extern void audit_send_reply (int pid,int seq,int type,int done,int multi,void *payload,int size);extern void audit_log_lost (const char *message);extern void audit_panic (const char *message); +struct audit_netlink_list { +int pid; +struct sk_buff_head q; +}; + +int audit_send_list (void *); +struct inotify_watch ;extern void audit_handle_ievent (struct inotify_watch *,u32 ,u32 ,u32 ,const char *,struct inode *);
kernel/auditfilter.c +27 -35
117 lines not on this page · raw message
Signature · 1 line
0.99.9.GIT