- register DINODE *dp;
- struct inodesc curino;
-
- bzero((char *)&curino, sizeof(struct inodesc));
- if (statemap[inumber] != DSTATE)
- errexit("BAD INODE %d TO DESCEND", statemap[inumber]);
- statemap[inumber] = DFOUND;
- dp = ginode(inumber);
- if (dp->di_size == 0) {
- direrr(inumber, "ZERO LENGTH DIRECTORY");
- if (reply("REMOVE") == 1)
- statemap[inumber] = DCLEAR;
- return;
- }
- if (dp->di_size < MINDIRSIZE) {
- direrr(inumber, "DIRECTORY TOO SHORT");
- dp->di_size = MINDIRSIZE;
- if (reply("FIX") == 1)
- inodirty();
- }
- if ((dp->di_size & (DIRBLKSIZ - 1)) != 0) {
- pwarn("DIRECTORY %s: LENGTH %d NOT MULTIPLE OF %d",
- pathname, dp->di_size, DIRBLKSIZ);
- dp->di_size = roundup(dp->di_size, DIRBLKSIZ);
- if (preen)
- printf(" (ADJUSTED)\n");
- if (preen || reply("ADJUST") == 1)
- inodirty();
- }
- curino.id_type = DATA;
- curino.id_func = parentino->id_func;
- curino.id_parent = parentino->id_number;
- curino.id_number = inumber;
- (void)ckinode(dp, &curino);
- if (curino.id_entryno < 2) {
- direrr(inumber, "NULL DIRECTORY");
- if (reply("REMOVE") == 1)
- statemap[inumber] = DCLEAR;
- }
+ register struct inoinfo **inpp, *inp;
+ struct inoinfo **inpend;
+ long change;
+
+ inpend = &inpsort[inplast];
+ do {
+ change = 0;
+ for (inpp = inpsort; inpp < inpend; inpp++) {
+ inp = *inpp;
+ if (inp->i_parent == 0)
+ continue;
+ if (statemap[inp->i_parent] == DFOUND &&
+ statemap[inp->i_number] == DSTATE) {
+ statemap[inp->i_number] = DFOUND;
+ change++;
+ }
+ }
+ } while (change > 0);