From: Terry Lambert <terry@lambert.org>

Subject: Fix for annoying fsck bug
Date: Wed, 24 Jan 1996 13:33:29 -0700 (MST)

The following small diff fixes the annoying fsck bug that causes it to
need to be run twice to end up with correct reference counts for inodes
for directories that had subdirectories relocated into the lost+found
directory.

I found the need to rerun *extremely* annoying.  This fix causes the
count to be correctly adjusted later in pass 4 by correctly stating
the parent reference count.

Note that the parent reference count is incremented when the directory
entry is made (for ".."), but is not really there in the case of a
directory that does not make an entry in its parent dir.

This can be tested by waiting for the inode sync after cd'ing from a
shell into a test fs.  Then you "mkdir xxx yyy zzz", wait a second,
and hit the machine reset button.

Reviewed by:	nate (Tested lots of crashes :)
Submitted by:	Terry Lambert <terry@lambert.org>
This commit is contained in:
Nate Williams 1996-05-09 16:38:27 +00:00
parent 4a6a373a1c
commit 119e9fc298
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=15699
3 changed files with 33 additions and 3 deletions

View File

@ -472,8 +472,18 @@ linkup(orphan, parentdir)
inodirty();
lncntp[lfdir]++;
pwarn("DIR I=%lu CONNECTED. ", orphan);
if (parentdir != (ino_t)-1)
if (parentdir != (ino_t)-1) {
printf("PARENT WAS I=%lu\n", parentdir);
/*
* The parent directory, because of the ordering
* guarantees, has had the link count incremented
* for the child, but no entry was made. This
* fixes the parent link count so that fsck does
* not need to be rerun.
*/
lncntp[parentdir]++;
}
if (preen == 0)
printf("\n");
}

View File

@ -472,8 +472,18 @@ linkup(orphan, parentdir)
inodirty();
lncntp[lfdir]++;
pwarn("DIR I=%lu CONNECTED. ", orphan);
if (parentdir != (ino_t)-1)
if (parentdir != (ino_t)-1) {
printf("PARENT WAS I=%lu\n", parentdir);
/*
* The parent directory, because of the ordering
* guarantees, has had the link count incremented
* for the child, but no entry was made. This
* fixes the parent link count so that fsck does
* not need to be rerun.
*/
lncntp[parentdir]++;
}
if (preen == 0)
printf("\n");
}

View File

@ -472,8 +472,18 @@ linkup(orphan, parentdir)
inodirty();
lncntp[lfdir]++;
pwarn("DIR I=%lu CONNECTED. ", orphan);
if (parentdir != (ino_t)-1)
if (parentdir != (ino_t)-1) {
printf("PARENT WAS I=%lu\n", parentdir);
/*
* The parent directory, because of the ordering
* guarantees, has had the link count incremented
* for the child, but no entry was made. This
* fixes the parent link count so that fsck does
* not need to be rerun.
*/
lncntp[parentdir]++;
}
if (preen == 0)
printf("\n");
}