NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/60746: kernel diagnostic assertion "ino >= LFS_IFILE_INUM" failed: file "../../../../ufs/lfs/lfs_vfsops.c", line 1800
The following reply was made to PR kern/60746; it has been noted by GNATS.
From: Konrad Schroder <perseant%hhhh.org@localhost>
To: gnats-bugs%netbsd.org@localhost, kern-bug-people%netbsd.org@localhost,
gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost, clare%csel.org@localhost
Cc:
Subject: Re: kern/60746: kernel diagnostic assertion "ino >= LFS_IFILE_INUM"
failed: file "../../../../ufs/lfs/lfs_vfsops.c", line 1800
Date: Sat, 19 Sep 2026 14:51:07 -0700
This is a multi-part message in MIME format.
--------------9Tk9h7Ycl9pEKM2UaSxL1S01
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
On 9/19/2026 2:15 PM, Shinichi Doyashiki via gnats wrote:
> [ 87.8094698] panic: kernel diagnostic assertion "ino >= LFS_IFILE_INUM" failed: file "../../../../ufs/lfs/lfs_vfsops.c", line 1800 ino=0
> [ 87.8294701] cpu1: Begin traceback...
> [ 87.8294701] vpanic() at netbsd:vpanic+0x171
> [ 87.8294701] kern_assert() at netbsd:kern_assert+0x4b
> [ 87.8394674] lfs_loadvnode() at netbsd:lfs_loadvnode+0x610
> [ 87.8494698] vcache_get() at netbsd:vcache_get+0x1cf
> [ 87.8494698] lfs_vget() at netbsd:lfs_vget+0x23
> [ 87.8594672] finfo_func_checkempty() at netbsd:finfo_func_checkempty+0x58
The "ino == 0" makes me think that the segment writer overcounted the
number of inodes it put into the inode block. There is some logic for
overwriting an inode that may not be working properly. It is also
possible, of course, that the data that the roll-forward code is trying
to recover is corrupt despite having the right checksum.
Could you try this patch (also attached)?
Index: sys/ufs/lfs/lfs_kclean.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/lfs/lfs_kclean.c,v
retrieving revision 1.4
diff -u -r1.4 lfs_kclean.c
--- sys/ufs/lfs/lfs_kclean.c  5 Jan 2026 05:02:47 -0000  1.4
+++ sys/ufs/lfs/lfs_kclean.c  19 Sep 2026 21:33:32 -0000
@@ -616,9 +616,24 @@
    for (i = num; i-- > 0; ) {
        dip = DINO_IN_BLOCK(fs, dbp->b_data, i);
        ino = lfs_dino_getinumber(fs, dip);
-Â Â Â Â Â Â Â Â if (ino == LFS_IFILE_INUM) {
+Â Â Â Â Â Â Â Â KASSERT(ino >= 0);
+Â Â Â Â Â Â Â Â if (ino == 0) {
+Â Â Â Â Â Â Â Â Â Â Â Â /*
+Â Â Â Â Â Â Â Â Â Â Â Â * The segment writer overcounted the number
+            * of inodes in this inode block. We can
+            * ignore this inode. (XXX This should not happen.)
+Â Â Â Â Â Â Â Â Â Â Â Â */
+Â Â Â Â Â Â Â Â Â Â Â Â continue;
+Â Â Â Â Â Â Â Â } else if (ino == LFS_IFILE_INUM) {
            /* Check address against superblock */
            true_addr = lfs_sb_getidaddr(fs);
+Â Â Â Â Â Â Â Â } else if (ino >= LFS_MAXINO(fs)) {
+Â Â Â Â Â Â Â Â Â Â Â Â /*
+Â Â Â Â Â Â Â Â Â Â Â Â * An inode greater than we have must be from a
+Â Â Â Â Â Â Â Â Â Â Â Â * previous allocation that was not rolled forward.
+Â Â Â Â Â Â Â Â Â Â Â Â * For our purposes, it does not exist.
+Â Â Â Â Â Â Â Â Â Â Â Â */
+Â Â Â Â Â Â Â Â Â Â Â Â continue;
        } else {
            /* Not ifile. Check address against ifile. */
            LFS_IENTRY(ifp, fs, ino, ibp);
@@ -655,6 +670,12 @@
    /* Get the inode and check its version. */
    ino = lfs_fi_getino(fs, fip);
    gen = lfs_fi_getversion(fs, fip);
+
+Â Â Â Â KASSERT(ino >= LFS_IFILE_INUM);
+Â Â Â Â /* We can safely ignore this; see comment in ino_func_checkempty. */
+Â Â Â Â if (ino >= LFS_MAXINO(fs))
+Â Â Â Â Â Â Â Â return 0;
+
    error = VFS_VGET(fs->lfs_ivnode->v_mount, ino,
LK_EXCLUSIVE|LK_NOWAIT, &vp);
    /*
Thanks,
--
Konrad Schroder
perseant%hhhh.org@localhost
--------------9Tk9h7Ycl9pEKM2UaSxL1S01
Content-Type: text/plain; charset=UTF-8; name="60746a.diff"
Content-Disposition: attachment; filename="60746a.diff"
Content-Transfer-Encoding: base64
SW5kZXg6IHN5cy91ZnMvbGZzL2xmc19rY2xlYW4uYwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl
OiAvY3Zzcm9vdC9zcmMvc3lzL3Vmcy9sZnMvbGZzX2tjbGVhbi5jLHYKcmV0cmlldmluZyBy
ZXZpc2lvbiAxLjQKZGlmZiAtdSAtcjEuNCBsZnNfa2NsZWFuLmMKLS0tIHN5cy91ZnMvbGZz
L2xmc19rY2xlYW4uYwk1IEphbiAyMDI2IDA1OjAyOjQ3IC0wMDAwCTEuNAorKysgc3lzL3Vm
cy9sZnMvbGZzX2tjbGVhbi5jCTE5IFNlcCAyMDI2IDIxOjMzOjMyIC0wMDAwCkBAIC02MTYs
OSArNjE2LDI0IEBACiAJZm9yIChpID0gbnVtOyBpLS0gPiAwOyApIHsKIAkJZGlwID0gRElO
T19JTl9CTE9DSyhmcywgZGJwLT5iX2RhdGEsIGkpOwogCQlpbm8gPSBsZnNfZGlub19nZXRp
bnVtYmVyKGZzLCBkaXApOwotCQlpZiAoaW5vID09IExGU19JRklMRV9JTlVNKSB7CisJCUtB
U1NFUlQoaW5vID49IDApOworCQlpZiAoaW5vID09IDApIHsKKwkJCS8qCisJCQkgKiBUaGUg
c2VnbWVudCB3cml0ZXIgb3ZlcmNvdW50ZWQgdGhlIG51bWJlcgorCQkJICogb2YgaW5vZGVz
IGluIHRoaXMgaW5vZGUgYmxvY2suICBXZSBjYW4KKwkJCSAqIGlnbm9yZSB0aGlzIGlub2Rl
LiAgKFhYWCBUaGlzIHNob3VsZCBub3QgaGFwcGVuLikKKwkJCSAqLworCQkJY29udGludWU7
CisJCX0gZWxzZSBpZiAoaW5vID09IExGU19JRklMRV9JTlVNKSB7CiAJCQkvKiBDaGVjayBh
ZGRyZXNzIGFnYWluc3Qgc3VwZXJibG9jayAqLwogCQkJdHJ1ZV9hZGRyID0gbGZzX3NiX2dl
dGlkYWRkcihmcyk7CisJCX0gZWxzZSBpZiAoaW5vID49IExGU19NQVhJTk8oZnMpKSB7CisJ
CQkvKgorCQkJICogQW4gaW5vZGUgZ3JlYXRlciB0aGFuIHdlIGhhdmUgbXVzdCBiZSBmcm9t
IGEKKwkJCSAqIHByZXZpb3VzIGFsbG9jYXRpb24gdGhhdCB3YXMgbm90IHJvbGxlZCBmb3J3
YXJkLgorCQkJICogRm9yIG91ciBwdXJwb3NlcywgaXQgZG9lcyBub3QgZXhpc3QuCisJCQkg
Ki8KKwkJCWNvbnRpbnVlOwogCQl9IGVsc2UgewogCQkJLyogTm90IGlmaWxlLiAgQ2hlY2sg
YWRkcmVzcyBhZ2FpbnN0IGlmaWxlLiAqLwogCQkJTEZTX0lFTlRSWShpZnAsIGZzLCBpbm8s
IGlicCk7CkBAIC02NTUsNiArNjcwLDEyIEBACiAJLyogR2V0IHRoZSBpbm9kZSBhbmQgY2hl
Y2sgaXRzIHZlcnNpb24uICovCiAJaW5vID0gbGZzX2ZpX2dldGlubyhmcywgZmlwKTsKIAln
ZW4gPSBsZnNfZmlfZ2V0dmVyc2lvbihmcywgZmlwKTsKKworCUtBU1NFUlQoaW5vID49IExG
U19JRklMRV9JTlVNKTsKKwkvKiBXZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGlzOyBzZWUgY29t
bWVudCBpbiBpbm9fZnVuY19jaGVja2VtcHR5LiAqLworCWlmIChpbm8gPj0gTEZTX01BWElO
TyhmcykpCisJCXJldHVybiAwOworCiAJZXJyb3IgPSBWRlNfVkdFVChmcy0+bGZzX2l2bm9k
ZS0+dl9tb3VudCwgaW5vLCBMS19FWENMVVNJVkV8TEtfTk9XQUlULCAmdnApOwogCiAJLyoK
--------------9Tk9h7Ycl9pEKM2UaSxL1S01--
Home |
Main Index |
Thread Index |
Old Index