- if (bcmp(u.u_dent.d_name, "..", 3) == 0) {
- iunlock(pdp); /* race to get the inode */
- dp = iget(dp->i_dev, fs, u.u_dent.d_ino);
- if (dp == NULL)
- goto bad2;
- } else if (dp->i_number == u.u_dent.d_ino) {
- dp->i_count++; /* we want ourself, ie "." */
- } else {
- dp = iget(dp->i_dev, fs, u.u_dent.d_ino);
- iunlock(pdp);
- if (dp == NULL)
- goto bad2;
- }
- fs = dp->i_fs;
-
- /*
- * Check for symbolic link
- */
- if ((dp->i_mode & IFMT) == IFLNK && (follow || *cp == '/')) {
- u_int pathlen = strlen(cp) + 1;
-
- if (dp->i_size + pathlen >= MAXPATHLEN - 1 ||
- ++nlink > MAXSYMLINKS) {
- u.u_error = ELOOP;
- goto bad2;
- }
- ovbcopy(cp, nbp->b_un.b_addr + dp->i_size, pathlen);
- u.u_error =
- rdwri(UIO_READ, dp, nbp->b_un.b_addr, (int)dp->i_size,
- 0, 1, (int *)0);
- if (u.u_error)
- goto bad2;
- cp = nbp->b_un.b_addr;
- iput(dp);
- if (*cp == '/') {
- irele(pdp);
- while (*cp == '/')
- cp++;
- if ((dp = u.u_rdir) == NULL)
- dp = rootdir;
- ilock(dp);
- dp->i_count++;
- } else {
- dp = pdp;
- ilock(dp);
+ if (ndp->ni_isdotdot) {
+ IUNLOCK(pdp); /* race to get the inode */
+ if (error = iget(dp, ndp->ni_dent.d_ino, &tdp)) {
+ ILOCK(pdp);
+ return (error);