Description:
dumptraverse.c:mapfiles() contains a loop that begins with:
for (ino = 0; ino < maxino; ino++) {
dp = getino(ino);
This contrasts with the loop in main() containing:
for (map = dumpdirmap, ino = 0; ino < maxino; ) {
dirty = GETDIRTY(ino) /* Shortened for brevity. */
ino++;
if ((dirty & 1) == 0)
continue;
dp = getino(ino); /* Work with dp. */
}
and the subsequent loop using dumpinomap.
While the loops in main() appear to be correct, the loop in
mapfiles() can never invoke:
SETINO(maxino, usedinomap)
or
SETINO(maxino, dumpinomap);
Changing the < to <= in mapfiles() (BUT NOT IN MAIN!!) fixes it.
Fix:
Copies of the new dump/restore package are available by anonymous
ftp from ftp.cs.berkeley.edu:ucb/4bsd/dump.restore.tar.Z.
The following patch also fixes the problem.
*** traverse.c.old Mon Jan 25 12:50:10 1993
--- traverse.c.new Mon Jan 25 12:49:52 1993
***************
*** 32,38 ****
*/
#ifndef lint
! static char sccsid[] = "@(#)traverse.c 5.21 (Berkeley) 7/19/92";
#endif /* not lint */
#ifdef sunos
--- 32,38 ----
*/
#ifndef lint
! static char sccsid[] = "@(#)traverse.c 5.22 (Berkeley) 1/25/93";
#endif /* not lint */
#ifdef sunos
***************
*** 115,121 ****
register struct dinode *dp;
int anydirskipped = 0;
! for (ino = 0; ino < maxino; ino++) {
dp = getino(ino);
if ((mode = (dp->di_mode & IFMT)) == 0)
continue;
--- 115,121 ----
register struct dinode *dp;
int anydirskipped = 0;
! for (ino = 0; ino <= maxino; ino++) {
dp = getino(ino);
if ((mode = (dp->di_mode & IFMT)) == 0)
continue;