Dear folks, dear Andrew, some serious trouble here; getblk() returns NULL at times when reading msdosfs files and msdosfs can't handle that... It looks like the semantics of getblk() has changed from "never return NULL unless we're the page deamon" to "can return NULL when we're running out of memory"... this could also explain the LFS problems since AFAICS the LFS code is also not aware of this change as is msdosfs and others... Would an audit of this problem be a good idea? or revert to the old semantics be a better solution? With regards, Reinoud > gid getblk | grep sys sys/sys/buf.h:303:buf_t *getblk(struct vnode *, daddr_t, int, int, int); sys/kern/vfs_bio.c:652: bp = getblk(vp, blkno, size, 0, 0); sys/kern/vfs_bio.c:662: * Note that if buffer is BC_INVAL, getblk() won't return it. sys/kern/vfs_bio.c:1130:getblk(struct vnode *vp, daddr_t blkno, int size, int slpflag, int slptimeo) sys/kern/vfs_bio.c:1150: panic("getblk: block size invariant failed"); sys/nfs/nfs_bio.c:593: bp = getblk(vp, bn, size, PCATCH, 0); sys/nfs/nfs_bio.c:597: bp = getblk(vp, bn, size, 0, 2 * hz); sys/nfs/nfs_bio.c:600: bp = getblk(vp, bn, size, 0, 0); sys/fs/msdosfs/msdosfs_fat.c:435: /* getblk() never fails */ sys/fs/msdosfs/msdosfs_fat.c:436: bpn = getblk(pmp->pm_devvp, de_bn2kb(pmp, fatbn), sys/fs/msdosfs/msdosfs_fat.c:1117: bp = getblk(pmp->pm_devvp, sys/fs/msdosfs/msdosfs_vnops.c:1265: bp = getblk(pmp->pm_devvp, lbn, pmp->pm_bpcluster, 0, 0); sys/fs/ntfs/ntfs_subr.c:1577: bp = getblk(ntmp->ntm_devvp, lbn, sys/fs/sysvbfs/bfs_sysvbfs.c:145: if ((bp = getblk(bio->vp, block, DEV_BSIZE, 0, 0)) == 0) { sys/fs/sysvbfs/bfs_sysvbfs.c:146: printf("getblk failed.\n"); sys/miscfs/specfs/spec_vnops.c:602: bp = getblk(vp, bn, bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:163: bp = getblk(vp, bn, fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:197: bp = getblk(vp, indirs[1].in_lbn, fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:240: nbp = getblk(vp,indirs[i].in_lbn, fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:291: nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:309: nbp = getblk(vp, lbn, fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_balloc.c:345: bp = getblk(vp, indirs[i].in_lbn, (int)fs->e2fs_bsize, sys/ufs/ext2fs/ext2fs_bmap.c:228: bp = getblk(vp, metalbn, mp->mnt_stat.f_iosize, 0, 0); sys/ufs/ext2fs/ext2fs_bmap.c:232: * getblk() above returns NULL only iff we are sys/ufs/ext2fs/ext2fs_bmap.c:233: * pagedaemon. See the implementation of getblk sys/ufs/ext2fs/ext2fs_inode.c:484: bp = getblk(vp, lbn, (int)fs->e2fs_bsize, 0, 0); sys/ufs/ext2fs/ext2fs_vfsops.c:1174: bp = getblk(mp->um_devvp, SBLOCK, SBSIZE, 0, 0); sys/ufs/ext2fs/ext2fs_vfsops.c:1192: bp = getblk(mp->um_devvp, fsbtodb(fs, sys/ufs/ffs/ffs_softdep.c:1837: getblk(ip->i_devvp, bp->b_blkno, bp->b_bcount, 0, 0); sys/ufs/ffs/ffs_subr.c:121: if ((*bpp = getblk(vp, lblkno, size, 0, 0)) == NULL) sys/ufs/lfs/lfs_balloc.c:188: *bpp = bp = getblk(vp, lbn, nsize, 0, 0); sys/ufs/lfs/lfs_balloc.c:258: ibp = getblk(vp, indirs[i].in_lbn, sys/ufs/lfs/lfs_balloc.c:299: *bpp = bp = getblk(vp, lbn, blksize(fs, ip, lbn), 0, 0); sys/ufs/lfs/lfs_inode.c:729: bp = getblk(vp, lbn, (int)fs->lfs_bsize, 0, 0); sys/ufs/lfs/lfs_segment.c:1098: getblk(VTOI(fs->lfs_ivnode)->i_devvp, sys/ufs/lfs/lfs_syscalls.c:446: bp = getblk(vp, blkp->bi_lbn, blkp->bi_size, 0, 0); sys/ufs/lfs/lfs_syscalls.c:451: * getblk() returned is empty. So, we sys/ufs/ufs/ufs_bmap.c:240: bp = getblk(vp, metalbn, mp->mnt_stat.f_iosize, 0, 0); sys/ufs/ufs/ufs_bmap.c:244: * getblk() above returns NULL only iff we are sys/ufs/ufs/ufs_bmap.c:245: * pagedaemon. See the implementation of getblk
Attachment:
pgpn7LCGmH6mw.pgp
Description: PGP signature