Changeset View
Changeset View
Standalone View
Standalone View
sbin/dump/traverse.c
Show First 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | if (sblock->fs_flags & FS_DOSOFTDEP) { | ||||
break; | break; | ||||
} | } | ||||
if (inosused <= 0) | if (inosused <= 0) | ||||
continue; | continue; | ||||
} | } | ||||
for (i = 0; i < inosused; i++, ino++) { | for (i = 0; i < inosused; i++, ino++) { | ||||
if (ino < UFS_ROOTINO || | if (ino < UFS_ROOTINO || | ||||
(dp = getino(ino, &mode)) == NULL || | (dp = getino(ino, &mode)) == NULL || | ||||
(mode & IFMT) == 0) | (mode & UFS_IFMT) == 0) | ||||
continue; | continue; | ||||
if (ino >= maxino) { | if (ino >= maxino) { | ||||
msg("Skipping inode %ju >= maxino %ju\n", | msg("Skipping inode %ju >= maxino %ju\n", | ||||
(uintmax_t)ino, (uintmax_t)maxino); | (uintmax_t)ino, (uintmax_t)maxino); | ||||
continue; | continue; | ||||
} | } | ||||
/* | /* | ||||
* Everything must go in usedinomap so that a check | * Everything must go in usedinomap so that a check | ||||
* for "in dumpdirmap but not in usedinomap" to detect | * for "in dumpdirmap but not in usedinomap" to detect | ||||
* dirs with nodump set has a chance of succeeding | * dirs with nodump set has a chance of succeeding | ||||
* (this is used in mapdirs()). | * (this is used in mapdirs()). | ||||
*/ | */ | ||||
SETINO(ino, usedinomap); | SETINO(ino, usedinomap); | ||||
if (mode == IFDIR) | if (mode == UFS_IFDIR) | ||||
SETINO(ino, dumpdirmap); | SETINO(ino, dumpdirmap); | ||||
if (WANTTODUMP(dp)) { | if (WANTTODUMP(dp)) { | ||||
SETINO(ino, dumpinomap); | SETINO(ino, dumpinomap); | ||||
if (mode != IFREG && | if (mode != UFS_IFREG && | ||||
mode != IFDIR && | mode != UFS_IFDIR && | ||||
mode != IFLNK) | mode != UFS_IFLNK) | ||||
*tapesize += 1; | *tapesize += 1; | ||||
else | else | ||||
*tapesize += blockest(dp); | *tapesize += blockest(dp); | ||||
continue; | continue; | ||||
} | } | ||||
if (mode == IFDIR) { | if (mode == UFS_IFDIR) { | ||||
if (!nonodump && | if (!nonodump && | ||||
(DIP(dp, di_flags) & UF_NODUMP)) | (DIP(dp, di_flags) & UF_NODUMP)) | ||||
CLRINO(ino, usedinomap); | CLRINO(ino, usedinomap); | ||||
anydirskipped = 1; | anydirskipped = 1; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | if (nodump) { | ||||
if (TSTINO(dp->d_ino, dumpinomap)) { | if (TSTINO(dp->d_ino, dumpinomap)) { | ||||
CLRINO(dp->d_ino, dumpinomap); | CLRINO(dp->d_ino, dumpinomap); | ||||
*tapesize -= blockest(ip); | *tapesize -= blockest(ip); | ||||
} | } | ||||
/* | /* | ||||
* Add back to dumpdirmap and remove from usedinomap | * Add back to dumpdirmap and remove from usedinomap | ||||
* to propagate nodump. | * to propagate nodump. | ||||
*/ | */ | ||||
if (mode == IFDIR) { | if (mode == UFS_IFDIR) { | ||||
SETINO(dp->d_ino, dumpdirmap); | SETINO(dp->d_ino, dumpdirmap); | ||||
CLRINO(dp->d_ino, usedinomap); | CLRINO(dp->d_ino, usedinomap); | ||||
ret |= HASSUBDIRS; | ret |= HASSUBDIRS; | ||||
} | } | ||||
} else { | } else { | ||||
if (TSTINO(dp->d_ino, dumpinomap)) { | if (TSTINO(dp->d_ino, dumpinomap)) { | ||||
ret |= HASDUMPEDFILE; | ret |= HASDUMPEDFILE; | ||||
if (ret & HASSUBDIRS) | if (ret & HASSUBDIRS) | ||||
▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | dumpino(union dinode *dp, ino_t ino) | ||||
case S_IFBLK: | case S_IFBLK: | ||||
added = appendextdata(dp); | added = appendextdata(dp); | ||||
writeheader(ino); | writeheader(ino); | ||||
writeextdata(dp, ino, added); | writeextdata(dp, ino, added); | ||||
return; | return; | ||||
default: | default: | ||||
msg("Warning: undefined file type 0%o\n", | msg("Warning: undefined file type 0%o\n", | ||||
DIP(dp, di_mode) & IFMT); | DIP(dp, di_mode) & UFS_IFMT); | ||||
return; | return; | ||||
} | } | ||||
if (DIP(dp, di_size) > UFS_NDADDR * sblock->fs_bsize) { | if (DIP(dp, di_size) > UFS_NDADDR * sblock->fs_bsize) { | ||||
cnt = UFS_NDADDR * sblock->fs_frag; | cnt = UFS_NDADDR * sblock->fs_frag; | ||||
last = 0; | last = 0; | ||||
} else { | } else { | ||||
cnt = howmany(DIP(dp, di_size), sblock->fs_fsize); | cnt = howmany(DIP(dp, di_size), sblock->fs_fsize); | ||||
last = 1; | last = 1; | ||||
▲ Show 20 Lines • Show All 319 Lines • ▼ Show 20 Lines | if (inum >= minino && inum < maxino) | ||||
goto gotit; | goto gotit; | ||||
bread(fsbtodb(sblock, ino_to_fsba(sblock, inum)), inoblock, | bread(fsbtodb(sblock, ino_to_fsba(sblock, inum)), inoblock, | ||||
(int)sblock->fs_bsize); | (int)sblock->fs_bsize); | ||||
minino = inum - (inum % INOPB(sblock)); | minino = inum - (inum % INOPB(sblock)); | ||||
maxino = minino + INOPB(sblock); | maxino = minino + INOPB(sblock); | ||||
gotit: | gotit: | ||||
if (sblock->fs_magic == FS_UFS1_MAGIC) { | if (sblock->fs_magic == FS_UFS1_MAGIC) { | ||||
dp1 = &((struct ufs1_dinode *)inoblock)[inum - minino]; | dp1 = &((struct ufs1_dinode *)inoblock)[inum - minino]; | ||||
*modep = (dp1->di_mode & IFMT); | *modep = (dp1->di_mode & UFS_IFMT); | ||||
return ((union dinode *)dp1); | return ((union dinode *)dp1); | ||||
} | } | ||||
dp2 = &((struct ufs2_dinode *)inoblock)[inum - minino]; | dp2 = &((struct ufs2_dinode *)inoblock)[inum - minino]; | ||||
*modep = (dp2->di_mode & IFMT); | *modep = (dp2->di_mode & UFS_IFMT); | ||||
return ((union dinode *)dp2); | return ((union dinode *)dp2); | ||||
} | } | ||||
/* | /* | ||||
* Read a chunk of data from the disk. | * Read a chunk of data from the disk. | ||||
* Try to recover from hard errors by reading in sector sized pieces. | * Try to recover from hard errors by reading in sector sized pieces. | ||||
* Error recovery is attempted at most BREADEMAX times before seeking | * Error recovery is attempted at most BREADEMAX times before seeking | ||||
* consent from the operator to continue. | * consent from the operator to continue. | ||||
▲ Show 20 Lines • Show All 105 Lines • Show Last 20 Lines |