Quoting from the email thrown around between kirk, bde and iedowse@..
<QUOTE> Overflow of cg_niblk causes spurious "SUMMARY INFORMATION BAD" warnings prompts in fsck_ffs. cg_niblk has type int16_t, but it is (ab)used to hold the number of inodes per group (it has nothing to do with the number of inode blocks in the cg as claimed in ffs/fs.h), and there can be lots of inodes per group. E.g., newfs -i 8192 -b 16384 -f 16384 -c 255 ... gives 0xA900 inodes/group. Assignment of this to cg_niblk gives -0x5700. This is mostly harmless (ufs/ffs doesn't use cg_niblk, and bug-for-bug compatible overflow occurs in newfs), but in fsck_ffs/pass5.c, negative values of cg_niblk limit cg_irotor to 0 and the summary info appears to be bad. </QUOTE> Submitted by: Bruce Evans <bde@zeta.org.au> Obtained from: Kirk McKusick <mckusick@mckusick.com>
This commit is contained in:
parent
8b4d22a1bb
commit
1d52622861
@ -68,6 +68,10 @@ pass5()
|
||||
|
||||
inoinfo(WINO)->ino_state = USTATE;
|
||||
memset(newcg, 0, (size_t)fs->fs_cgsize);
|
||||
/*
|
||||
* Note: cg_niblk is 16 bits and may overflow, so it must never
|
||||
* be used except for comparing with the old value.
|
||||
*/
|
||||
newcg->cg_niblk = fs->fs_ipg;
|
||||
if (cvtlevel >= 3) {
|
||||
if (fs->fs_maxcontig < 2 && fs->fs_contigsumsize > 0) {
|
||||
@ -197,7 +201,7 @@ pass5()
|
||||
newcg->cg_frotor = cg->cg_frotor;
|
||||
else
|
||||
newcg->cg_frotor = 0;
|
||||
if (cg->cg_irotor < newcg->cg_niblk)
|
||||
if (cg->cg_irotor < fs->fs_ipg)
|
||||
newcg->cg_irotor = cg->cg_irotor;
|
||||
else
|
||||
newcg->cg_irotor = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user