diff options
author | bde <bde@FreeBSD.org> | 2001-04-25 10:33:09 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 2001-04-25 10:33:09 +0000 |
commit | 928cd1b6a9131fb58321eaf9e1fc95932bd50eaa (patch) | |
tree | 5290f56fc76556f7c14b00c00055cee81844dae0 /sys/gnu/fs | |
parent | ed98caf17b1fb46331b6ceb5ead82dc24c6fe0ba (diff) | |
download | FreeBSD-src-928cd1b6a9131fb58321eaf9e1fc95932bd50eaa.zip FreeBSD-src-928cd1b6a9131fb58321eaf9e1fc95932bd50eaa.tar.gz |
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.
Diffstat (limited to 'sys/gnu/fs')
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_balloc.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/gnu/fs/ext2fs/ext2_balloc.c b/sys/gnu/fs/ext2fs/ext2_balloc.c index 75c17e5..559f4a6 100644 --- a/sys/gnu/fs/ext2fs/ext2_balloc.c +++ b/sys/gnu/fs/ext2fs/ext2_balloc.c @@ -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", |