static int unix_bind_bsd(struct sock *sk, struct unix_address *addr)
{
	struct unix_sock *u = unix_sk(sk);
	umode_t mode = S_IFSOCK |
	       (SOCK_INODE(sk->sk_socket)->i_mode & ~current_umask());
	struct user_namespace *ns; // barf...
	struct path parent;
	struct dentry *dentry;
	unsigned int hash;
	int err;

	/*
	 * Get the parent directory, calculate the hash for last
	 * component.
	 */
	dentry = kern_path_create(AT_FDCWD, addr->name->sun_path, &parent, 0);
	if (IS_ERR(dentry))
		return PTR_ERR(dentry);
	ns = mnt_user_ns(parent.mnt);

	/*
	 * All right, let's create it.
	 */
	err = security_path_mknod(&parent, dentry, mode, 0);
	if (!err)
		err = vfs_mknod(ns, d_inode(parent.dentry), dentry, mode, 0);
	if (err)
		goto out;
	err = mutex_lock_interruptible(&u->bindlock);
	if (err)
		goto out_unlink;
	if (u->addr)
		goto out_unlock;

	addr->hash = UNIX_HASH_SIZE;
	hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
	spin_lock(&unix_table_lock);
	u->path.mnt = mntget(parent.mnt);
	u->path.dentry = dget(dentry);
	__unix_set_addr(sk, addr, hash);
	spin_unlock(&unix_table_lock);
	mutex_unlock(&u->bindlock);
	done_path_create(&parent, dentry);
	return 0;

out_unlock:
	mutex_unlock(&u->bindlock);
	err = -EINVAL;
out_unlink:
	/* failed after successful mknod?  unlink what we'd created... */
	vfs_unlink(ns, d_inode(parent.dentry), dentry, NULL);
out:
	done_path_create(&parent, dentry);
	return err;
}
static int unix_bind_bsd(struct sock *sk, struct unix_address *addr)
{
	struct unix_sock *u = unix_sk(sk);
	umode_t mode = S_IFSOCK |
	       (SOCK_INODE(sk->sk_socket)->i_mode & ~current_umask());
	struct user_namespace *ns;  
	struct path parent;
	struct dentry *dentry;
	unsigned int hash;
	int err;

	 
	dentry = kern_path_create(AT_FDCWD, addr->name->sun_path, &parent, 0);
	if (IS_ERR(dentry))
		return PTR_ERR(dentry);
	ns = mnt_user_ns(parent.mnt);

	 
	err = security_path_mknod(&parent, dentry, mode, 0);
	if (!err)
		err = vfs_mknod(ns, d_inode(parent.dentry), dentry, mode, 0);
	if (err)
		goto out;
	err = mutex_lock_interruptible(&u->bindlock);
	if (err)
		goto out_unlink;
	if (u->addr)
		goto out_unlock;

	addr->hash = UNIX_HASH_SIZE;
	hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
	spin_lock(&unix_table_lock);
	u->path.mnt = mntget(parent.mnt);
	u->path.dentry = dget(dentry);
	__unix_set_addr(sk, addr, hash);
	spin_unlock(&unix_table_lock);
	mutex_unlock(&u->bindlock);
	done_path_create(&parent, dentry);
	return 0;

out_unlock:
	mutex_unlock(&u->bindlock);
	err = -EINVAL;
out_unlink:
	 
	vfs_unlink(ns, d_inode(parent.dentry), dentry, NULL);
out:
	done_path_create(&parent, dentry);
	return err;
}