MFffs ffs_balloc.c 1.5.

Long ago, bread() set b_blkno to the disk block number as a side effect
of doing physical i/o (or it just retained the setting from when the
i/o was done).  The setting is lost when buffers go away and then are
reconsituted from VM.  bread() originally compensated by doing a
VOP_BMAP() to recover b_blkno, but this was no good since it sometimes
caused extra i/o or even deadlock for bread()ing metadata to do the
bmap.  This was fixed in vfs_bio.c 1.33 (1995/03/03) and ffs_balloc.c
1.5, etc., by removing the VOP_BMAP() from bread() and breadn(), and
changing all (?) places that used b_blkno to set it if necessary.

ext2fs was not imported until later in 1995 and was still depending on
the old behaviour of bread() in at least ext2_balloc().  This caused
filesystem and file corruption by clobbering direct block numbers in
inodes.
This commit is contained in:
bde 2001-04-25 10:33:09 +00:00
parent b002715365
commit 84972cbecf
2 changed files with 4 additions and 0 deletions

View File

@ -111,6 +111,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n",
brelse(bp);
return (error);
}
bp->b_blkno = fsbtodb(fs, nb);
*bpp = bp;
return (0);
}
@ -126,6 +127,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n",
brelse(bp);
return (error);
}
bp->b_blkno = fsbtodb(fs, nb);
} else {
/* Godmar thinks: this shouldn't happen w/o fragments */
printf("nsize %d(%d) > osize %d(%d) nb %d\n",

View File

@ -111,6 +111,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n",
brelse(bp);
return (error);
}
bp->b_blkno = fsbtodb(fs, nb);
*bpp = bp;
return (0);
}
@ -126,6 +127,7 @@ ext2_debug("ext2_balloc called (%d, %d, %d)\n",
brelse(bp);
return (error);
}
bp->b_blkno = fsbtodb(fs, nb);
} else {
/* Godmar thinks: this shouldn't happen w/o fragments */
printf("nsize %d(%d) > osize %d(%d) nb %d\n",