diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 28 | 
1 files changed, 3 insertions, 25 deletions
| diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index c478fc8db776..c420eba4876b 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -770,33 +770,12 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  		err = path_lookup(sunaddr->sun_path, LOOKUP_PARENT, &nd);  		if (err)  			goto out_mknod_parent; -		/* -		 * Yucky last component or no last component at all? -		 * (foo/., foo/.., /////) -		 */ -		err = -EEXIST; -		if (nd.last_type != LAST_NORM) -			goto out_mknod; -		/* -		 * Lock the directory. -		 */ -		down(&nd.dentry->d_inode->i_sem); -		/* -		 * Do the final lookup. -		 */ -		dentry = lookup_hash(&nd.last, nd.dentry); + +		dentry = lookup_create(&nd, 0);  		err = PTR_ERR(dentry);  		if (IS_ERR(dentry))  			goto out_mknod_unlock; -		err = -ENOENT; -		/* -		 * Special case - lookup gave negative, but... we had foo/bar/ -		 * From the vfs_mknod() POV we just have a negative dentry - -		 * all is fine. Let's be bastards - you had / on the end, you've -		 * been asking for (non-existent) directory. -ENOENT for you. -		 */ -		if (nd.last.name[nd.last.len] && !dentry->d_inode) -			goto out_mknod_dput; +  		/*  		 * All right, let's create it.  		 */ @@ -845,7 +824,6 @@ out_mknod_dput:  	dput(dentry);  out_mknod_unlock:  	up(&nd.dentry->d_inode->i_sem); -out_mknod:  	path_release(&nd);  out_mknod_parent:  	if (err==-EEXIST) | 
