switch unix_sock to struct path
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 15 Mar 2012 01:54:32 +0000 (21:54 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 21 Mar 2012 01:29:41 +0000 (21:29 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
include/net/af_unix.h
net/unix/af_unix.c
net/unix/diag.c
security/lsm_audit.c

index 5a4e29b168c9ad666949dd0b0850388a443c5793..ca68e2cef23027fc545d3f649e48e68361620f12 100644 (file)
@@ -49,8 +49,7 @@ struct unix_sock {
        /* WARNING: sk has to be the first member */
        struct sock             sk;
        struct unix_address     *addr;
-       struct dentry           *dentry;
-       struct vfsmount         *mnt;
+       struct path             path;
        struct mutex            readlock;
        struct sock             *peer;
        struct sock             *other;
index 85d3bb7490aabcb26fd10b08adfcddebb5cbeb59..ef4b780ef63df8428c0a70a32544fb145edd6cb4 100644 (file)
@@ -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 */
index 6b7697fd911bd36af0fb0aca4731ab6ea5c09b42..ffd86518e6460f140aa3b56f6a008c8382e46f26 100644 (file)
@@ -29,7 +29,7 @@ rtattr_failure:
 
 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;
 
        if (dentry) {
index 293b8c45b1d1bbf9a28edff35001b8c02eb09191..8b8f0902f6e57f744a8f50d774b84a617df12f67 100644 (file)
@@ -313,12 +313,8 @@ static void dump_common_audit_data(struct audit_buffer *ab,
                        }
                        case AF_UNIX:
                                u = unix_sk(sk);
-                               if (u->dentry) {
-                                       struct path path = {
-                                               .dentry = u->dentry,
-                                               .mnt = u->mnt
-                                       };
-                                       audit_log_d_path(ab, " path=", &path);
+                               if (u->path.dentry) {
+                                       audit_log_d_path(ab, " path=", &u->path);
                                        break;
                                }
                                if (!u->addr)