Changeset View
Changeset View
Standalone View
Standalone View
sbin/fsck_ffs/pass1.c
Show First 20 Lines • Show All 240 Lines • ▼ Show 20 Lines | checkinode(ino_t inumber, struct inodesc *idesc, int rebuildcg) | ||||
union dinode *dp; | union dinode *dp; | ||||
off_t kernmaxfilesize; | off_t kernmaxfilesize; | ||||
ufs2_daddr_t ndb; | ufs2_daddr_t ndb; | ||||
mode_t mode; | mode_t mode; | ||||
int j, ret, offset; | int j, ret, offset; | ||||
if ((dp = getnextinode(inumber, rebuildcg)) == NULL) | if ((dp = getnextinode(inumber, rebuildcg)) == NULL) | ||||
return (0); | return (0); | ||||
mode = DIP(dp, di_mode) & IFMT; | mode = DIP(dp, di_mode) & UFS_IFMT; | ||||
if (mode == 0) { | if (mode == 0) { | ||||
if ((sblock.fs_magic == FS_UFS1_MAGIC && | if ((sblock.fs_magic == FS_UFS1_MAGIC && | ||||
(memcmp(dp->dp1.di_db, ufs1_zino.di_db, | (memcmp(dp->dp1.di_db, ufs1_zino.di_db, | ||||
UFS_NDADDR * sizeof(ufs1_daddr_t)) || | UFS_NDADDR * sizeof(ufs1_daddr_t)) || | ||||
memcmp(dp->dp1.di_ib, ufs1_zino.di_ib, | memcmp(dp->dp1.di_ib, ufs1_zino.di_ib, | ||||
UFS_NIADDR * sizeof(ufs1_daddr_t)) || | UFS_NIADDR * sizeof(ufs1_daddr_t)) || | ||||
dp->dp1.di_mode || dp->dp1.di_size)) || | dp->dp1.di_mode || dp->dp1.di_size)) || | ||||
(sblock.fs_magic == FS_UFS2_MAGIC && | (sblock.fs_magic == FS_UFS2_MAGIC && | ||||
Show All 16 Lines | checkinode(ino_t inumber, struct inodesc *idesc, int rebuildcg) | ||||
lastino = inumber; | lastino = inumber; | ||||
/* This should match the file size limit in ffs_mountfs(). */ | /* This should match the file size limit in ffs_mountfs(). */ | ||||
if (sblock.fs_magic == FS_UFS1_MAGIC) | if (sblock.fs_magic == FS_UFS1_MAGIC) | ||||
kernmaxfilesize = (off_t)0x40000000 * sblock.fs_bsize - 1; | kernmaxfilesize = (off_t)0x40000000 * sblock.fs_bsize - 1; | ||||
else | else | ||||
kernmaxfilesize = sblock.fs_maxfilesize; | kernmaxfilesize = sblock.fs_maxfilesize; | ||||
if (DIP(dp, di_size) > kernmaxfilesize || | if (DIP(dp, di_size) > kernmaxfilesize || | ||||
DIP(dp, di_size) > sblock.fs_maxfilesize || | DIP(dp, di_size) > sblock.fs_maxfilesize || | ||||
(mode == IFDIR && DIP(dp, di_size) > MAXDIRSIZE)) { | (mode == UFS_IFDIR && DIP(dp, di_size) > MAXDIRSIZE)) { | ||||
if (debug) | if (debug) | ||||
printf("bad size %ju:", (uintmax_t)DIP(dp, di_size)); | printf("bad size %ju:", (uintmax_t)DIP(dp, di_size)); | ||||
goto unknown; | goto unknown; | ||||
} | } | ||||
if (!preen && mode == IFMT && reply("HOLD BAD BLOCK") == 1) { | if (!preen && mode == UFS_IFMT && reply("HOLD BAD BLOCK") == 1) { | ||||
dp = ginode(inumber); | dp = ginode(inumber); | ||||
DIP_SET(dp, di_size, sblock.fs_fsize); | DIP_SET(dp, di_size, sblock.fs_fsize); | ||||
DIP_SET(dp, di_mode, IFREG|0600); | DIP_SET(dp, di_mode, UFS_IFREG|0600); | ||||
inodirty(); | inodirty(); | ||||
} | } | ||||
if ((mode == IFBLK || mode == IFCHR || mode == IFIFO || | if ((mode == UFS_IFBLK || mode == UFS_IFCHR || mode == UFS_IFIFO || | ||||
mode == IFSOCK) && DIP(dp, di_size) != 0) { | mode == UFS_IFSOCK) && DIP(dp, di_size) != 0) { | ||||
if (debug) | if (debug) | ||||
printf("bad special-file size %ju:", | printf("bad special-file size %ju:", | ||||
(uintmax_t)DIP(dp, di_size)); | (uintmax_t)DIP(dp, di_size)); | ||||
goto unknown; | goto unknown; | ||||
} | } | ||||
if ((mode == IFBLK || mode == IFCHR) && | if ((mode == UFS_IFBLK || mode == UFS_IFCHR) && | ||||
(dev_t)DIP(dp, di_rdev) == NODEV) { | (dev_t)DIP(dp, di_rdev) == NODEV) { | ||||
if (debug) | if (debug) | ||||
printf("bad special-file rdev NODEV:"); | printf("bad special-file rdev NODEV:"); | ||||
goto unknown; | goto unknown; | ||||
} | } | ||||
ndb = howmany(DIP(dp, di_size), sblock.fs_bsize); | ndb = howmany(DIP(dp, di_size), sblock.fs_bsize); | ||||
if (ndb < 0) { | if (ndb < 0) { | ||||
if (debug) | if (debug) | ||||
printf("bad size %ju ndb %ju:", | printf("bad size %ju ndb %ju:", | ||||
(uintmax_t)DIP(dp, di_size), (uintmax_t)ndb); | (uintmax_t)DIP(dp, di_size), (uintmax_t)ndb); | ||||
goto unknown; | goto unknown; | ||||
} | } | ||||
if (mode == IFBLK || mode == IFCHR) | if (mode == UFS_IFBLK || mode == UFS_IFCHR) | ||||
ndb++; | ndb++; | ||||
if (mode == IFLNK) { | if (mode == UFS_IFLNK) { | ||||
/* | /* | ||||
* Fake ndb value so direct/indirect block checks below | * Fake ndb value so direct/indirect block checks below | ||||
* will detect any garbage after symlink string. | * will detect any garbage after symlink string. | ||||
*/ | */ | ||||
if (DIP(dp, di_size) < (off_t)sblock.fs_maxsymlinklen) { | if (DIP(dp, di_size) < (off_t)sblock.fs_maxsymlinklen) { | ||||
if (sblock.fs_magic == FS_UFS1_MAGIC) | if (sblock.fs_magic == FS_UFS1_MAGIC) | ||||
ndb = howmany(DIP(dp, di_size), | ndb = howmany(DIP(dp, di_size), | ||||
sizeof(ufs1_daddr_t)); | sizeof(ufs1_daddr_t)); | ||||
Show All 23 Lines | if (DIP(dp, di_ib[j]) != 0) { | ||||
printf("bad indirect addr: %ju\n", | printf("bad indirect addr: %ju\n", | ||||
(uintmax_t)DIP(dp, di_ib[j])); | (uintmax_t)DIP(dp, di_ib[j])); | ||||
goto unknown; | goto unknown; | ||||
} | } | ||||
if (ftypeok(dp) == 0) | if (ftypeok(dp) == 0) | ||||
goto unknown; | goto unknown; | ||||
n_files++; | n_files++; | ||||
inoinfo(inumber)->ino_linkcnt = DIP(dp, di_nlink); | inoinfo(inumber)->ino_linkcnt = DIP(dp, di_nlink); | ||||
if (mode == IFDIR) { | if (mode == UFS_IFDIR) { | ||||
if (DIP(dp, di_size) == 0) | if (DIP(dp, di_size) == 0) | ||||
inoinfo(inumber)->ino_state = DCLEAR; | inoinfo(inumber)->ino_state = DCLEAR; | ||||
else if (DIP(dp, di_nlink) <= 0) | else if (DIP(dp, di_nlink) <= 0) | ||||
inoinfo(inumber)->ino_state = DZLINK; | inoinfo(inumber)->ino_state = DZLINK; | ||||
else | else | ||||
inoinfo(inumber)->ino_state = DSTATE; | inoinfo(inumber)->ino_state = DSTATE; | ||||
cacheino(dp, inumber); | cacheino(dp, inumber); | ||||
countdirs++; | countdirs++; | ||||
▲ Show 20 Lines • Show All 159 Lines • Show Last 20 Lines |