-
- /*
- * 4) Renaming a directory with the parent
- * different requires ".." to be rewritten.
- * The window is still there for ".." to
- * be inconsistent, but this is unavoidable,
- * and a lot shorter than when it was done
- * in a user process.
- */
- if (doingdirectory && parentdifferent && error == 0) {
- struct dirtemplate dirbuf;
-
- u.u_dirp = uap->to;
- ip = namei(uchar, LOOKUP | LOCKPARENT, 0);
- if (ip == NULL) {
- printf("rename: .. went away\n");
- return;
- }
- dp = u.u_pdir;
- if ((ip->i_mode&IFMT) != IFDIR) {
- printf("rename: .. not a directory\n");
- goto stuck;
- }
- error = rdwri(UIO_READ, ip, (caddr_t)&dirbuf,
- sizeof (struct dirtemplate), (off_t)0, 1, (int *)0);
- if (error == 0) {
- dirbuf.dotdot_ino = dp->i_number;
- (void) rdwri(UIO_WRITE, ip, (caddr_t)&dirbuf,
- sizeof (struct dirtemplate), (off_t)0, 1, (int *)0);
- }
-stuck:
- irele(dp);
- iput(ip);
- }
- goto done;