diff options
| author | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-10-08 15:46:45 +0000 |
|---|---|---|
| committer | Poul-Henning Kamp <phk@FreeBSD.org> | 2002-10-08 15:46:45 +0000 |
| commit | 7cf5744b6b9f8e6303c614e13d5177478358eb71 (patch) | |
| tree | d0885482fd71dcad8fb5a6c5b6aa800e807000ab /sys/boot | |
| parent | 422971d7d98f0244aba5c05a3a1630e07fae8000 (diff) | |
Notes
Diffstat (limited to 'sys/boot')
| -rw-r--r-- | sys/boot/common/ufsread.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c index 802e0352e27eb..f2b7ba78aa1d0 100644 --- a/sys/boot/common/ufsread.c +++ b/sys/boot/common/ufsread.c @@ -33,12 +33,12 @@ * We use 4k `virtual' blocks for filesystem data, whatever the actual * filesystem block size. FFS blocks are always a multiple of 4k. */ -#define VBLKSIZE 4096 -#define VBLKSHIFT 12 +#define VBLKSHIFT 12 +#define VBLKSIZE (1 << VBLKSHIFT) #define VBLKMASK (VBLKSIZE - 1) #define DBPERVBLK (VBLKSIZE / DEV_BSIZE) -#define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize / VBLKSIZE)) -#define IPERVBLK(fs) (INOPB(fs) / ((fs)->fs_bsize / VBLKSIZE)) +#define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize >> VBLKSHIFT)) +#define IPERVBLK(fs) (INOPB(fs) / ((fs)->fs_bsize >> VBLKSHIFT)) #define INO_TO_VBA(fs, ipervblk, x) \ (fsbtodb(fs, cgimin(fs, ino_to_cg(fs, x))) + \ (((x) % (fs)->fs_ipg) / (ipervblk) * DBPERVBLK)) @@ -62,7 +62,7 @@ static ssize_t fsread(ino_t, void *, size_t); static int ls, dsk_meta; static uint32_t fs_off; -static inline int +static __inline__ int fsfind(const char *name, ino_t * ino) { char buf[DEV_BSIZE]; @@ -177,7 +177,7 @@ fsread(ino_t inode, void *buf, size_t nbyte) n = INDIRPERVBLK(fs); addr = dp1.di_ib[0]; vbaddr = fsbtodb(fs, addr) + - (lbn - NDADDR) / n * DBPERVBLK; + (lbn - NDADDR) / (n * DBPERVBLK); if (indmap != vbaddr) { if (dskread(indbuf, vbaddr, DBPERVBLK)) return -1; @@ -222,13 +222,15 @@ fsread(ino_t inode, void *buf, size_t nbyte) static struct ufs2_dinode dp2; static ino_t inomap; char *blkbuf; - caddr_t indbuf; + void *indbuf; struct fs *fs; char *s; size_t n, nb, size, off, vboff; ufs_lbn_t lbn; ufs2_daddr_t addr, vbaddr; static ufs2_daddr_t blkmap, indmap; + u_int u; + blkbuf = dmadat->blkbuf; indbuf = dmadat->indbuf; @@ -281,14 +283,14 @@ fsread(ino_t inode, void *buf, size_t nbyte) } else if (lbn < NDADDR + NINDIR(fs)) { n = INDIRPERVBLK(fs); addr = DIP(di_ib[0]); - vbaddr = fsbtodb(fs, addr) + - (lbn - NDADDR) / n * DBPERVBLK; + u = (u_int)(lbn - NDADDR) / (n * DBPERVBLK); + vbaddr = fsbtodb(fs, addr) + u; if (indmap != vbaddr) { if (dskread(indbuf, vbaddr, DBPERVBLK)) return -1; indmap = vbaddr; } - n = (lbn - NDADDR) % n; + n = (lbn - NDADDR) & (n - 1); if (fs->fs_magic == FS_UFS1_MAGIC) addr = ((ufs1_daddr_t *)indbuf)[n]; else |
