* Damn. Added missing check for ->dead in listen queues scanning.
*
*/
-
+
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/netdevice.h>
#include <linux/file.h>
#include <linux/proc_fs.h>
+#include <linux/mutex.h>
#include <net/sock.h>
#include <net/af_unix.h>
static struct sock *unix_get_socket(struct file *filp)
{
struct sock *u_sock = NULL;
- struct inode *inode = filp->f_dentry->d_inode;
+ struct inode *inode = filp->f_path.dentry->d_inode;
/*
* Socket ?
* Keep the number of times in flight count for the file
* descriptor if it is for an AF_UNIX socket.
*/
-
+
void unix_inflight(struct file *fp)
{
struct sock *s = unix_get_socket(fp);
void unix_gc(void)
{
- static DECLARE_MUTEX(unix_gc_sem);
+ static DEFINE_MUTEX(unix_gc_sem);
int i;
struct sock *s;
struct sk_buff_head hitlist;
* Avoid a recursive GC.
*/
- if (down_trylock(&unix_gc_sem))
+ if (!mutex_trylock(&unix_gc_sem))
return;
- read_lock(&unix_table_lock);
+ spin_lock(&unix_table_lock);
forall_unix_sockets(i, s)
{
unix_sk(s)->gc_tree = GC_ORPHAN;
}
/*
- * Everything is now marked
+ * Everything is now marked
*/
/* Invariant to be maintained:
}
/*
- * Mark phase
+ * Mark phase
*/
while (!empty_stack())
spin_lock(&x->sk_receive_queue.lock);
skb = skb_peek(&x->sk_receive_queue);
-
+
/*
- * Loop through all but first born
+ * Loop through all but first born
*/
-
+
while (skb && skb != (struct sk_buff *)&x->sk_receive_queue) {
/*
* Do we have file descriptors ?
}
u->gc_tree = GC_ORPHAN;
}
- read_unlock(&unix_table_lock);
+ spin_unlock(&unix_table_lock);
/*
* Here we are. Hitlist is filled. Die.
*/
__skb_queue_purge(&hitlist);
- up(&unix_gc_sem);
+ mutex_unlock(&unix_gc_sem);
}