On unwind after failed block allocation in ffs_balloc_ufs{1,2}, assert
that recorded allocated blocks numbers match the physical block numbers of dandling buffers which are released. When finally freeing the blocks during unwind, assert that dandling buffers where not re-allocated. They shouldn't, because the vnode lock is owned exclusive. Reviewed by: mckusick Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week
This commit is contained in:
parent
0aeae89e96
commit
fd0eaea7aa
@ -487,6 +487,11 @@ fail:
|
||||
bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
|
||||
GB_NOCREAT | GB_UNMAPPED);
|
||||
if (bp != NULL) {
|
||||
KASSERT(bp->b_blkno == fsbtodb(fs, *blkp),
|
||||
("mismatch1 l %jd %jd b %ju %ju",
|
||||
(intmax_t)bp->b_lblkno, (uintmax_t)*lbns_remfree,
|
||||
(uintmax_t)bp->b_blkno,
|
||||
(uintmax_t)fsbtodb(fs, *blkp)));
|
||||
bp->b_flags |= (B_INVAL | B_RELBUF);
|
||||
bp->b_flags &= ~B_ASYNC;
|
||||
brelse(bp);
|
||||
@ -531,6 +536,18 @@ fail:
|
||||
* cleared, free the blocks.
|
||||
*/
|
||||
for (blkp = allociblk; blkp < allocblk; blkp++) {
|
||||
#ifdef INVARIANTS
|
||||
if (blkp == allociblk)
|
||||
lbns_remfree = lbns;
|
||||
bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
|
||||
GB_NOCREAT | GB_UNMAPPED);
|
||||
if (bp != NULL) {
|
||||
panic("zombie1 %jd %ju %ju",
|
||||
(intmax_t)bp->b_lblkno, (uintmax_t)bp->b_blkno,
|
||||
(uintmax_t)fsbtodb(fs, *blkp));
|
||||
}
|
||||
lbns_remfree++;
|
||||
#endif
|
||||
ffs_blkfree(ump, fs, ip->i_devvp, *blkp, fs->fs_bsize,
|
||||
ip->i_number, vp->v_type, NULL);
|
||||
}
|
||||
@ -1065,6 +1082,11 @@ fail:
|
||||
bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
|
||||
GB_NOCREAT | GB_UNMAPPED);
|
||||
if (bp != NULL) {
|
||||
KASSERT(bp->b_blkno == fsbtodb(fs, *blkp),
|
||||
("mismatch2 l %jd %jd b %ju %ju",
|
||||
(intmax_t)bp->b_lblkno, (uintmax_t)*lbns_remfree,
|
||||
(uintmax_t)bp->b_blkno,
|
||||
(uintmax_t)fsbtodb(fs, *blkp)));
|
||||
bp->b_flags |= (B_INVAL | B_RELBUF);
|
||||
bp->b_flags &= ~B_ASYNC;
|
||||
brelse(bp);
|
||||
@ -1109,6 +1131,18 @@ fail:
|
||||
* cleared, free the blocks.
|
||||
*/
|
||||
for (blkp = allociblk; blkp < allocblk; blkp++) {
|
||||
#ifdef INVARIANTS
|
||||
if (blkp == allociblk)
|
||||
lbns_remfree = lbns;
|
||||
bp = getblk(vp, *lbns_remfree, fs->fs_bsize, 0, 0,
|
||||
GB_NOCREAT | GB_UNMAPPED);
|
||||
if (bp != NULL) {
|
||||
panic("zombie2 %jd %ju %ju",
|
||||
(intmax_t)bp->b_lblkno, (uintmax_t)bp->b_blkno,
|
||||
(uintmax_t)fsbtodb(fs, *blkp));
|
||||
}
|
||||
lbns_remfree++;
|
||||
#endif
|
||||
ffs_blkfree(ump, fs, ip->i_devvp, *blkp, fs->fs_bsize,
|
||||
ip->i_number, vp->v_type, NULL);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user