|
|
|
@ -293,7 +293,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i)
|
|
|
|
|
spin_lock(&unix_table_lock); |
|
|
|
|
sk_for_each(s, node, |
|
|
|
|
&unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) { |
|
|
|
|
struct dentry *dentry = unix_sk(s)->dentry; |
|
|
|
|
struct dentry *dentry = unix_sk(s)->path.dentry; |
|
|
|
|
|
|
|
|
|
if (dentry && dentry->d_inode == i) { |
|
|
|
|
sock_hold(s); |
|
|
|
@ -377,8 +377,7 @@ static void unix_sock_destructor(struct sock *sk)
|
|
|
|
|
static int unix_release_sock(struct sock *sk, int embrion) |
|
|
|
|
{ |
|
|
|
|
struct unix_sock *u = unix_sk(sk); |
|
|
|
|
struct dentry *dentry; |
|
|
|
|
struct vfsmount *mnt; |
|
|
|
|
struct path path; |
|
|
|
|
struct sock *skpair; |
|
|
|
|
struct sk_buff *skb; |
|
|
|
|
int state; |
|
|
|
@ -389,10 +388,9 @@ static int unix_release_sock(struct sock *sk, int embrion)
|
|
|
|
|
unix_state_lock(sk); |
|
|
|
|
sock_orphan(sk); |
|
|
|
|
sk->sk_shutdown = SHUTDOWN_MASK; |
|
|
|
|
dentry = u->dentry; |
|
|
|
|
u->dentry = NULL; |
|
|
|
|
mnt = u->mnt; |
|
|
|
|
u->mnt = NULL; |
|
|
|
|
path = u->path; |
|
|
|
|
u->path.dentry = NULL; |
|
|
|
|
u->path.mnt = NULL; |
|
|
|
|
state = sk->sk_state; |
|
|
|
|
sk->sk_state = TCP_CLOSE; |
|
|
|
|
unix_state_unlock(sk); |
|
|
|
@ -425,10 +423,8 @@ static int unix_release_sock(struct sock *sk, int embrion)
|
|
|
|
|
kfree_skb(skb); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (dentry) { |
|
|
|
|
dput(dentry); |
|
|
|
|
mntput(mnt); |
|
|
|
|
} |
|
|
|
|
if (path.dentry) |
|
|
|
|
path_put(&path); |
|
|
|
|
|
|
|
|
|
sock_put(sk); |
|
|
|
|
|
|
|
|
@ -628,8 +624,8 @@ static struct sock *unix_create1(struct net *net, struct socket *sock)
|
|
|
|
|
sk->sk_max_ack_backlog = net->unx.sysctl_max_dgram_qlen; |
|
|
|
|
sk->sk_destruct = unix_sock_destructor; |
|
|
|
|
u = unix_sk(sk); |
|
|
|
|
u->dentry = NULL; |
|
|
|
|
u->mnt = NULL; |
|
|
|
|
u->path.dentry = NULL; |
|
|
|
|
u->path.mnt = NULL; |
|
|
|
|
spin_lock_init(&u->lock); |
|
|
|
|
atomic_long_set(&u->inflight, 0); |
|
|
|
|
INIT_LIST_HEAD(&u->link); |
|
|
|
@ -789,9 +785,9 @@ static struct sock *unix_find_other(struct net *net,
|
|
|
|
|
u = unix_find_socket_byname(net, sunname, len, type, hash); |
|
|
|
|
if (u) { |
|
|
|
|
struct dentry *dentry; |
|
|
|
|
dentry = unix_sk(u)->dentry; |
|
|
|
|
dentry = unix_sk(u)->path.dentry; |
|
|
|
|
if (dentry) |
|
|
|
|
touch_atime(unix_sk(u)->mnt, dentry); |
|
|
|
|
touch_atime(unix_sk(u)->path.mnt, dentry); |
|
|
|
|
} else |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
@ -897,8 +893,7 @@ out_mknod_drop_write:
|
|
|
|
|
list = &unix_socket_table[addr->hash]; |
|
|
|
|
} else { |
|
|
|
|
list = &unix_socket_table[dentry->d_inode->i_ino & (UNIX_HASH_SIZE-1)]; |
|
|
|
|
u->dentry = path.dentry; |
|
|
|
|
u->mnt = path.mnt; |
|
|
|
|
u->path = path; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = 0; |
|
|
|
@ -1180,9 +1175,9 @@ restart:
|
|
|
|
|
atomic_inc(&otheru->addr->refcnt); |
|
|
|
|
newu->addr = otheru->addr; |
|
|
|
|
} |
|
|
|
|
if (otheru->dentry) { |
|
|
|
|
newu->dentry = dget(otheru->dentry); |
|
|
|
|
newu->mnt = mntget(otheru->mnt); |
|
|
|
|
if (otheru->path.dentry) { |
|
|
|
|
path_get(&otheru->path); |
|
|
|
|
newu->path = otheru->path; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Set credentials */ |
|
|
|
|