Commit 40ffe67d authored by Al Viro's avatar Al Viro

switch unix_sock to struct path

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 38eff289
...@@ -49,8 +49,7 @@ struct unix_sock { ...@@ -49,8 +49,7 @@ struct unix_sock {
/* WARNING: sk has to be the first member */ /* WARNING: sk has to be the first member */
struct sock sk; struct sock sk;
struct unix_address *addr; struct unix_address *addr;
struct dentry *dentry; struct path path;
struct vfsmount *mnt;
struct mutex readlock; struct mutex readlock;
struct sock *peer; struct sock *peer;
struct sock *other; struct sock *other;
......
...@@ -293,7 +293,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i) ...@@ -293,7 +293,7 @@ static struct sock *unix_find_socket_byinode(struct inode *i)
spin_lock(&unix_table_lock); spin_lock(&unix_table_lock);
sk_for_each(s, node, sk_for_each(s, node,
&unix_socket_table[i->i_ino & (UNIX_HASH_SIZE - 1)]) { &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) { if (dentry && dentry->d_inode == i) {
sock_hold(s); sock_hold(s);
...@@ -377,8 +377,7 @@ static void unix_sock_destructor(struct sock *sk) ...@@ -377,8 +377,7 @@ static void unix_sock_destructor(struct sock *sk)
static int unix_release_sock(struct sock *sk, int embrion) static int unix_release_sock(struct sock *sk, int embrion)
{ {
struct unix_sock *u = unix_sk(sk); struct unix_sock *u = unix_sk(sk);
struct dentry *dentry; struct path path;
struct vfsmount *mnt;
struct sock *skpair; struct sock *skpair;
struct sk_buff *skb; struct sk_buff *skb;
int state; int state;
...@@ -389,10 +388,9 @@ static int unix_release_sock(struct sock *sk, int embrion) ...@@ -389,10 +388,9 @@ static int unix_release_sock(struct sock *sk, int embrion)
unix_state_lock(sk); unix_state_lock(sk);
sock_orphan(sk); sock_orphan(sk);
sk->sk_shutdown = SHUTDOWN_MASK; sk->sk_shutdown = SHUTDOWN_MASK;
dentry = u->dentry; path = u->path;
u->dentry = NULL; u->path.dentry = NULL;
mnt = u->mnt; u->path.mnt = NULL;
u->mnt = NULL;
state = sk->sk_state; state = sk->sk_state;
sk->sk_state = TCP_CLOSE; sk->sk_state = TCP_CLOSE;
unix_state_unlock(sk); unix_state_unlock(sk);
...@@ -425,10 +423,8 @@ static int unix_release_sock(struct sock *sk, int embrion) ...@@ -425,10 +423,8 @@ static int unix_release_sock(struct sock *sk, int embrion)
kfree_skb(skb); kfree_skb(skb);
} }
if (dentry) { if (path.dentry)
dput(dentry); path_put(&path);
mntput(mnt);
}
sock_put(sk); sock_put(sk);
...@@ -628,8 +624,8 @@ static struct sock *unix_create1(struct net *net, struct socket *sock) ...@@ -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_max_ack_backlog = net->unx.sysctl_max_dgram_qlen;
sk->sk_destruct = unix_sock_destructor; sk->sk_destruct = unix_sock_destructor;
u = unix_sk(sk); u = unix_sk(sk);
u->dentry = NULL; u->path.dentry = NULL;
u->mnt = NULL; u->path.mnt = NULL;
spin_lock_init(&u->lock); spin_lock_init(&u->lock);
atomic_long_set(&u->inflight, 0); atomic_long_set(&u->inflight, 0);
INIT_LIST_HEAD(&u->link); INIT_LIST_HEAD(&u->link);
...@@ -789,9 +785,9 @@ static struct sock *unix_find_other(struct net *net, ...@@ -789,9 +785,9 @@ static struct sock *unix_find_other(struct net *net,
u = unix_find_socket_byname(net, sunname, len, type, hash); u = unix_find_socket_byname(net, sunname, len, type, hash);
if (u) { if (u) {
struct dentry *dentry; struct dentry *dentry;
dentry = unix_sk(u)->dentry; dentry = unix_sk(u)->path.dentry;
if (dentry) if (dentry)
touch_atime(unix_sk(u)->mnt, dentry); touch_atime(unix_sk(u)->path.mnt, dentry);
} else } else
goto fail; goto fail;
} }
...@@ -897,8 +893,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) ...@@ -897,8 +893,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
list = &unix_socket_table[addr->hash]; list = &unix_socket_table[addr->hash];
} else { } else {
list = &unix_socket_table[dentry->d_inode->i_ino & (UNIX_HASH_SIZE-1)]; list = &unix_socket_table[dentry->d_inode->i_ino & (UNIX_HASH_SIZE-1)];
u->dentry = path.dentry; u->path = path;
u->mnt = path.mnt;
} }
err = 0; err = 0;
...@@ -1180,9 +1175,9 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, ...@@ -1180,9 +1175,9 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr,
atomic_inc(&otheru->addr->refcnt); atomic_inc(&otheru->addr->refcnt);
newu->addr = otheru->addr; newu->addr = otheru->addr;
} }
if (otheru->dentry) { if (otheru->path.dentry) {
newu->dentry = dget(otheru->dentry); path_get(&otheru->path);
newu->mnt = mntget(otheru->mnt); newu->path = otheru->path;
} }
/* Set credentials */ /* Set credentials */
......
...@@ -29,7 +29,7 @@ static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb) ...@@ -29,7 +29,7 @@ static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb)
static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb) static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb)
{ {
struct dentry *dentry = unix_sk(sk)->dentry; struct dentry *dentry = unix_sk(sk)->path.dentry;
struct unix_diag_vfs *uv; struct unix_diag_vfs *uv;
if (dentry) { if (dentry) {
......
...@@ -313,12 +313,8 @@ static void dump_common_audit_data(struct audit_buffer *ab, ...@@ -313,12 +313,8 @@ static void dump_common_audit_data(struct audit_buffer *ab,
} }
case AF_UNIX: case AF_UNIX:
u = unix_sk(sk); u = unix_sk(sk);
if (u->dentry) { if (u->path.dentry) {
struct path path = { audit_log_d_path(ab, " path=", &u->path);
.dentry = u->dentry,
.mnt = u->mnt
};
audit_log_d_path(ab, " path=", &path);
break; break;
} }
if (!u->addr) if (!u->addr)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment