On Tue, Jan 28, 2014 at 05:33, Andres Perera wrote: > do you understand that disks have write caches that don't give a hoot > about posix mkdir() rename() and so on? > > can bit rot change a inode type from directory to file, and vice versa? > > do you want the kernel to figure these out after the fact and > retroactively panic() for each occurence, neatly queueing them boot > after boot or do you want to grow a pair of balls instead?
./ffs/ffs_alloc.c: panic("ffs_alloc: bad size"); ./ffs/ffs_alloc.c: panic("ffs_alloc: missing credential"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: bad size"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: missing credential"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: bad bprev"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: bad blockno"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: small buf"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: bad optim"); ./ffs/ffs_alloc.c: panic("ffs_realloccg: small buf 2"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: unallocated block 1"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: non-logical cluster"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: non-physical cluster %d", i); ./ffs/ffs_alloc.c: panic("ffs1_reallocblk: start == end"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: unallocated block 2"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: alloc mismatch"); ./ffs/ffs_alloc.c: panic("ffs1_reallocblks: unallocated block 3"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: unallocated block 1"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: non-logical cluster"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: non-physical cluster %d", i); ./ffs/ffs_alloc.c: panic("ffs2_reallocblk: start == end"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: unallocated block 2"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: alloc mismatch"); ./ffs/ffs_alloc.c: panic("ffs2_reallocblks: unallocated block 3"); ./ffs/ffs_alloc.c: panic("ffs_valloc: dup alloc"); ./ffs/ffs_alloc.c: panic("ffs_clusteralloc: map mismatch"); ./ffs/ffs_alloc.c: panic("ffs_clusteralloc: allocated out of group"); ./ffs/ffs_alloc.c: panic("ffs_clusteralloc: lost block"); ./ffs/ffs_alloc.c: panic("ffs_nodealloccg: map corrupted"); ./ffs/ffs_alloc.c: panic("ffs_nodealloccg: block not in map"); ./ffs/ffs_alloc.c: panic("ffs_blkfree: bad size"); ./ffs/ffs_alloc.c: panic("ffs_blkfree: freeing free block"); ./ffs/ffs_alloc.c: panic("ffs_blkfree: freeing free frag"); ./ffs/ffs_alloc.c: panic("ffs_freefile: range: dev = 0x%x, ino = %d, fs = %s", ./ffs/ffs_alloc.c: panic("ffs_freefile: freeing free inode"); ./ffs/ffs_alloc.c: panic("ffs_checkblk: bad size"); ./ffs/ffs_alloc.c: panic("ffs_checkblk: bad block %lld", (long long)bno); ./ffs/ffs_alloc.c: panic("ffs_checkblk: partially free fragment"); ./ffs/ffs_alloc.c: * It is a panic if a request is made to find a block if none are ./ffs/ffs_alloc.c: panic("ffs_alloccg: map corrupted"); ./ffs/ffs_alloc.c: panic("ffs_alloccg: block not in map"); ./ffs/ffs_balloc.c: panic("ffs1_balloc: blk too big"); ./ffs/ffs_balloc.c: panic ("ffs1_balloc: ufs_bmaparray returned indirect block"); ./ffs/ffs_balloc.c: panic("Could not unwind indirect block, error %d", r); ./ffs/ffs_balloc.c: panic("ffs2_balloc: block too big"); ./ffs/ffs_balloc.c: panic("ffs2_balloc: ufs_bmaparray returned indirect block"); ./ffs/ffs_balloc.c: panic("ffs2_balloc: unwind failed"); ./ffs/ffs_inode.c: panic("ffs_update: bad link cnt"); ./ffs/ffs_inode.c: panic("ffs_truncate: partial truncate of symlink"); ./ffs/ffs_inode.c: panic("ffs_truncate: newspace"); ./ffs/ffs_inode.c: panic("ffs_truncate1"); ./ffs/ffs_inode.c: panic("ffs_truncate2"); ./ffs/ffs_inode.c: panic("ffs_indirtrunc: bad buffer size"); ./ffs/ffs_subr.c:__dead void panic(const char *, ...); ./ffs/ffs_subr.c: panic("Disk buffer overlap"); ./ffs/ffs_vfsops.c: panic("ffs_reload: dirty2"); ./ffs/ffs_vfsops.c: panic("ffs_reload: dirty1"); ./ffs/ffs_vfsops.c: panic("ffs_statfs"); ./ffs/ffs_vfsops.c: panic("ffs_statfs"); ./ffs/ffs_vfsops.c: panic("update: rofs mod"); ./ffs/ffs_vfsops.c: panic("ffs_vget: alien ino_t %llu", (unsigned long long)ino); ./ffs/ffs_vnops.c: panic("ffs_read: mode"); ./ffs/ffs_vnops.c: panic("ffs_read: short symlink"); ./ffs/ffs_vnops.c: panic("ffs_read: type %d", vp->v_type); ./ffs/ffs_vnops.c: panic("ffs_write: mode"); ./ffs/ffs_vnops.c: panic("ffs_write: nonsync dir write"); ./ffs/ffs_vnops.c: panic("ffs_write: type"); ./ffs/ffs_vnops.c: panic("ffs_fsync: not dirty"); ./mfs/mfs_vfsops.c: panic("mfs_mount: dup dev"); ./mfs/mfs_vnops.c: panic("mfs_open not VBLK"); ./mfs/mfs_vnops.c: panic("mfs_strategy: bad dev"); ./mfs/mfs_vnops.c: panic("mfs_inactive: not inactive"); ./mfs/mfs_vnops.c: panic("mfs_badop called"); ./ufs/ufs_vnops.c: panic("chown: lost quota"); ./ufs/ufs_vnops.c: panic("ufs_link: no name"); ./ufs/ufs_vnops.c: panic("ufs_rename: no name"); ./ufs/ufs_vnops.c: panic("ufs_rename: lost from startdir"); ./ufs/ufs_vnops.c: panic("ufs_rename: lost to startdir"); ./ufs/ufs_vnops.c: panic("rename: EXDEV"); ./ufs/ufs_vnops.c: panic("rename: EXDEV"); ./ufs/ufs_vnops.c: panic("ufs_rename: same file"); ./ufs/ufs_vnops.c: panic("ufs_rename: lost from startdir"); ./ufs/ufs_vnops.c: panic("ufs_rename: lost dir entry"); ./ufs/ufs_vnops.c: panic("ufs_rename: lost dir entry"); ./ufs/ufs_vnops.c: panic("ufs_mkdir: no name"); ./ufs/ufs_vnops.c: panic("ufs_strategy: spec"); ./ufs/ufs_vnops.c: panic("ufs_makeinode: no name"); ./ufs/ufs_bmap.c: panic("ufs_bmaparray: invalid arguments"); ./ufs/ufs_bmap.c: panic("ufs_bmaparray: indirect block not in cache"); ./ufs/ufs_bmap.c: panic ("ufs_getlbns: Invalid indirect block %lld specified", ./ufs/ufs_bmap.c: panic("ufs_getlbns: indirect block %lld not found", ./ufs/ufs_dirhash.c: panic("ufsdirhash_lookup: bad offset in hash array"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_findfree: free mismatch"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_dirtrunc: blocks in use"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_dirtrunc: first free corrupt"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad offset"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad dir"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad dir inode"); ./ufs/ufs_dirhash.c: /* Check that the entry exists (will panic if it doesn't). */ ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad dir end"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad free count"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: bad first-free"); ./ufs/ufs_dirhash.c: panic("ufsdirhash_checkblock: missing first-free entry"); ./ufs/ufs_dirhash.c: * Returns a slot number, and panics on failure. ./ufs/ufs_dirhash.c: panic("ufsdirhash_findslot: '%.*s' not found", namelen, name); ./ufs/ufs_lookup.c: panic("bad dir"); ./ufs/ufs_lookup.c: panic("ufs_makedirentry: missing name"); ./ufs/ufs_lookup.c: panic("ufs_direnter: newblk"); ./ufs/ufs_lookup.c: panic("ufs_direnter: compact1"); ./ufs/ufs_lookup.c: panic("ufs_direnter: compact2"); ./ufs/ufs_quota.c: panic ("ufs_quota_free_blocks2: vnode is not locked"); ./ufs/ufs_quota.c: panic ("ufs_quota_free_blocks2: vnode is not locked"); ./ufs/ufs_quota.c: panic ("chkdquot: vnode is not locked"); ./ufs/ufs_quota.c: panic("missing dquot"); ./ufs/ufs_quota.c: panic ("quotaon: mount point not busy"); ./ufs/ufs_quota.c: panic ("quotaoff: mount point not busy"); ./ufs/ufs_quota.c: panic("free dquot isn't"); ./ufs/ufs_quota.c: panic("dqsync: dquot"); ./ufs/ufs_quota.c: panic("dqsync: file");