static struct sock *__unix_find_socket_byname(struct net *net,
                                              struct sockaddr_un *sunname,
-                                             int len, int type, unsigned int hash)
+                                             int len, unsigned int hash)
 {
        struct sock *s;
 
-       sk_for_each(s, &unix_socket_table[hash ^ type]) {
+       sk_for_each(s, &unix_socket_table[hash]) {
                struct unix_sock *u = unix_sk(s);
 
                if (!net_eq(sock_net(s), net))
 
 static inline struct sock *unix_find_socket_byname(struct net *net,
                                                   struct sockaddr_un *sunname,
-                                                  int len, int type,
-                                                  unsigned int hash)
+                                                  int len, unsigned int hash)
 {
        struct sock *s;
 
        spin_lock(&unix_table_lock);
-       s = __unix_find_socket_byname(net, sunname, len, type, hash);
+       s = __unix_find_socket_byname(net, sunname, len, hash);
        if (s)
                sock_hold(s);
        spin_unlock(&unix_table_lock);
 retry:
        addr->len = sprintf(addr->name->sun_path+1, "%05x", ordernum) + 1 + sizeof(short);
        addr->hash = unix_hash_fold(csum_partial(addr->name, addr->len, 0));
+       addr->hash ^= sk->sk_type;
 
        spin_lock(&unix_table_lock);
        ordernum = (ordernum+1)&0xFFFFF;
 
-       if (__unix_find_socket_byname(net, addr->name, addr->len, sock->type,
-                                     addr->hash)) {
+       if (__unix_find_socket_byname(net, addr->name, addr->len, addr->hash)) {
                spin_unlock(&unix_table_lock);
                /*
                 * __unix_find_socket_byname() may take long time if many names
                }
                goto retry;
        }
-       addr->hash ^= sk->sk_type;
 
        __unix_set_addr(sk, addr, addr->hash);
        spin_unlock(&unix_table_lock);
                }
        } else {
                err = -ECONNREFUSED;
-               u = unix_find_socket_byname(net, sunname, len, type, hash);
+               u = unix_find_socket_byname(net, sunname, len, type ^ hash);
                if (u) {
                        struct dentry *dentry;
                        dentry = unix_sk(u)->path.dentry;
        return err;
 }
 
-static int unix_bind_abstract(struct sock *sk, unsigned hash,
-                             struct unix_address *addr)
+static int unix_bind_abstract(struct sock *sk, struct unix_address *addr)
 {
        struct unix_sock *u = unix_sk(sk);
        int err;
 
        spin_lock(&unix_table_lock);
        if (__unix_find_socket_byname(sock_net(sk), addr->name, addr->len,
-                                     sk->sk_type, hash)) {
+                                     addr->hash)) {
                spin_unlock(&unix_table_lock);
                mutex_unlock(&u->bindlock);
                return -EADDRINUSE;
        if (sun_path[0])
                err = unix_bind_bsd(sk, addr);
        else
-               err = unix_bind_abstract(sk, hash, addr);
+               err = unix_bind_abstract(sk, addr);
        if (err)
                unix_release_addr(addr);
        return err == -EEXIST ? -EADDRINUSE : err;