X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/aec7dd3be0c8f737370f74a3e23725f7d8236abe..7188ac27426632d20adaac4191443dfefebf5789:/usr/src/sys/ufs/lfs/lfs_alloc.c diff --git a/usr/src/sys/ufs/lfs/lfs_alloc.c b/usr/src/sys/ufs/lfs/lfs_alloc.c index f296806746..5d2399b34e 100644 --- a/usr/src/sys/ufs/lfs/lfs_alloc.c +++ b/usr/src/sys/ufs/lfs/lfs_alloc.c @@ -1,23 +1,34 @@ /* - * Copyright (c) 1982 Regents of the University of California. - * All rights reserved. The Berkeley software License Agreement - * specifies the terms and conditions for redistribution. + * Copyright (c) 1982, 1986, 1989 Regents of the University of California. + * All rights reserved. * - * @(#)lfs_alloc.c 6.19 (Berkeley) %G% + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)lfs_alloc.c 7.9 (Berkeley) %G% */ #include "param.h" #include "systm.h" #include "mount.h" -#include "fs.h" #include "buf.h" -#include "inode.h" -#include "dir.h" #include "user.h" -#include "quota.h" +#include "vnode.h" #include "kernel.h" #include "syslog.h" #include "cmap.h" +#include "../ufs/quota.h" +#include "../ufs/inode.h" +#include "../ufs/fs.h" extern u_long hashalloc(); extern ino_t ialloccg(); @@ -48,17 +59,19 @@ extern unsigned char *fragtbl[]; * 2) quadradically rehash into other cylinder groups, until an * available block is located. */ -struct buf * -alloc(ip, bpref, size) +alloc(ip, bpref, size, bpp, flags) register struct inode *ip; daddr_t bpref; int size; + struct buf **bpp; + int flags; { daddr_t bno; register struct fs *fs; register struct buf *bp; - int cg; + int cg, error; + *bpp = 0; fs = ip->i_fs; if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0) { printf("dev = 0x%x, bsize = %d, size = %d, fs = %s\n", @@ -70,9 +83,8 @@ alloc(ip, bpref, size) if (u.u_uid != 0 && freespace(fs, fs->fs_minfree) <= 0) goto nospace; #ifdef QUOTA - u.u_error = chkdq(ip, (long)btodb(size), 0); - if (u.u_error) - return (NULL); + if (error = chkdq(ip, (long)btodb(size), 0)) + return (error); #endif if (bpref >= fs->fs_size) bpref = 0; @@ -86,14 +98,18 @@ alloc(ip, bpref, size) goto nospace; ip->i_blocks += btodb(size); ip->i_flag |= IUPD|ICHG; - bp = getblk(ip->i_dev, fsbtodb(fs, bno), size); - clrbuf(bp); - return (bp); +#ifdef SECSIZE + bp = getblk(ip->i_dev, fsbtodb(fs, bno), size, fs->fs_dbsize); +#else SECSIZE + bp = getblk(ip->i_devvp, fsbtodb(fs, bno), size); + if (flags & B_CLRBUF) + clrbuf(bp); + *bpp = bp; + return (0); nospace: fserr(fs, "file system full"); uprintf("\n%s: write failed, file system is full\n", fs->fs_fsmnt); - u.u_error = ENOSPC; - return (NULL); + return (ENOSPC); } /* @@ -104,19 +120,19 @@ nospace: * the original block. Failing that, the regular block allocator is * invoked to get an appropriate block. */ -struct buf * -realloccg(ip, bprev, bpref, osize, nsize) +realloccg(ip, bprev, bpref, osize, nsize, bpp) register struct inode *ip; daddr_t bprev, bpref; int osize, nsize; + struct buf **bpp; { register struct fs *fs; - register struct buf *bp, *obp; + struct buf *bp, *obp; int cg, request; daddr_t bno, bn; - int i, count, s; - extern struct cmap *mfind(); + int i, error, count; + *bpp = 0; fs = ip->i_fs; if ((unsigned)osize > fs->fs_bsize || fragoff(fs, osize) != 0 || (unsigned)nsize > fs->fs_bsize || fragoff(fs, nsize) != 0) { @@ -132,25 +148,30 @@ realloccg(ip, bprev, bpref, osize, nsize) panic("realloccg: bad bprev"); } #ifdef QUOTA - u.u_error = chkdq(ip, (long)btodb(nsize - osize), 0); - if (u.u_error) - return (NULL); + if (error = chkdq(ip, (long)btodb(nsize - osize), 0)) + return (error); #endif cg = dtog(fs, bprev); bno = fragextend(ip, cg, (long)bprev, osize, nsize); if (bno != 0) { do { - bp = bread(ip->i_dev, fsbtodb(fs, bno), osize); - if (bp->b_flags & B_ERROR) { +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, bno), osize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, bno), + osize, &bp); + if (error) { brelse(bp); - return (NULL); + return (error); } } while (brealloc(bp, nsize) == 0); bp->b_flags |= B_DONE; bzero(bp->b_un.b_addr + osize, (unsigned)nsize - osize); ip->i_blocks += btodb(nsize - osize); ip->i_flag |= IUPD|ICHG; - return (bp); + *bpp = bp; + return (0); } if (bpref >= fs->fs_size) bpref = 0; @@ -200,33 +221,43 @@ realloccg(ip, bprev, bpref, osize, nsize) bno = (daddr_t)hashalloc(ip, cg, (long)bpref, request, (u_long (*)())alloccg); if (bno > 0) { - obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize); - if (obp->b_flags & B_ERROR) { +#ifdef SECSIZE + obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, bprev), osize, &obp); + if (error) { brelse(obp); - return (NULL); + return (error); } bn = fsbtodb(fs, bno); - bp = getblk(ip->i_dev, bn, nsize); +#ifdef SECSIZE + bp = getblk(ip->i_dev, bn, nsize, fs->fs_dbsize); +#else SECSIZE + bp = getblk(ip->i_devvp, bn, nsize); +#endif SECSIZE bcopy(obp->b_un.b_addr, bp->b_un.b_addr, (u_int)osize); - count = howmany(osize, DEV_BSIZE); - s = splimp(); - for (i = 0; i < count; i += CLBYTES / DEV_BSIZE) - if (mfind(ip->i_dev, bn + i)) - munhash(ip->i_dev, bn + i); - splx(s); + count = howmany(osize, CLBYTES); + for (i = 0; i < count; i++) +#ifdef SECSIZE + munhash(ip->i_dev, bn + i * CLBYTES / fs->fs_dbsize); +#else SECSIZE + munhash(ip->i_dev, bn + i * CLBYTES / DEV_BSIZE); +#endif SECSIZE bzero(bp->b_un.b_addr + osize, (unsigned)nsize - osize); if (obp->b_flags & B_DELWRI) { obp->b_flags &= ~B_DELWRI; u.u_ru.ru_oublock--; /* delete charge */ } brelse(obp); - free(ip, bprev, (off_t)osize); + blkfree(ip, bprev, (off_t)osize); if (nsize < request) - free(ip, bno + numfrags(fs, nsize), + blkfree(ip, bno + numfrags(fs, nsize), (off_t)(request - nsize)); ip->i_blocks += btodb(nsize - osize); ip->i_flag |= IUPD|ICHG; - return (bp); + *bpp = bp; + return (0); } nospace: /* @@ -234,8 +265,7 @@ nospace: */ fserr(fs, "file system full"); uprintf("\n%s: write failed, file system is full\n", fs->fs_fsmnt); - u.u_error = ENOSPC; - return (NULL); + return (ENOSPC); } /* @@ -253,24 +283,24 @@ nospace: * 2) quadradically rehash into other cylinder groups, until an * available inode is located. */ -struct inode * -ialloc(pip, ipref, mode) +ialloc(pip, ipref, mode, ipp) register struct inode *pip; ino_t ipref; int mode; + struct inode **ipp; { ino_t ino; register struct fs *fs; register struct inode *ip; - int cg; + int cg, error; + *ipp = 0; fs = pip->i_fs; if (fs->fs_cstotal.cs_nifree == 0) goto noinodes; #ifdef QUOTA - u.u_error = chkiq(pip->i_dev, (struct inode *)NULL, u.u_uid, 0); - if (u.u_error) - return (NULL); + if (error = chkiq(pip->i_dev, (struct inode *)NULL, u.u_uid, 0)) + return (error); #endif if (ipref >= fs->fs_ncg * fs->fs_ipg) ipref = 0; @@ -278,10 +308,11 @@ ialloc(pip, ipref, mode) ino = (ino_t)hashalloc(pip, cg, (long)ipref, mode, ialloccg); if (ino == 0) goto noinodes; - ip = iget(pip->i_dev, pip->i_fs, ino); - if (ip == NULL) { + error = iget(pip, ino, ipp); + ip = *ipp; + if (error) { ifree(pip, ino, 0); - return (NULL); + return (error); } if (ip->i_mode) { printf("mode = 0%o, inum = %d, fs = %s\n", @@ -293,12 +324,11 @@ ialloc(pip, ipref, mode) fs->fs_fsmnt, ino, ip->i_blocks); ip->i_blocks = 0; } - return (ip); + return (0); noinodes: fserr(fs, "out of inodes"); uprintf("\n%s: create/symlink failed, no inodes free\n", fs->fs_fsmnt); - u.u_error = ENOSPC; - return (NULL); + return (ENOSPC); } /* @@ -485,11 +515,11 @@ fragextend(ip, cg, bprev, osize, nsize) int osize, nsize; { register struct fs *fs; - register struct buf *bp; register struct cg *cgp; + struct buf *bp; long bno; int frags, bbase; - int i; + int i, error; fs = ip->i_fs; if (fs->fs_cs(fs, cg).cs_nffree < numfrags(fs, nsize - osize)) @@ -497,19 +527,29 @@ fragextend(ip, cg, bprev, osize, nsize) frags = numfrags(fs, nsize); bbase = fragnum(fs, bprev); if (bbase > fragnum(fs, (bprev + frags - 1))) { - /* cannot extend across a block boundry */ + /* cannot extend across a block boundary */ return (NULL); } - bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize); +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)), + (int)fs->fs_cgsize, &bp); + if (error) { + brelse(bp); + return (NULL); + } +#endif SECSIZE cgp = bp->b_un.b_cg; - if (bp->b_flags & B_ERROR || cgp->cg_magic != CG_MAGIC) { + if (!cg_chkmagic(cgp)) { brelse(bp); return (NULL); } cgp->cg_time = time.tv_sec; bno = dtogd(fs, bprev); for (i = numfrags(fs, osize); i < frags; i++) - if (isclr(cgp->cg_free, bno + i)) { + if (isclr(cg_blksfree(cgp), bno + i)) { brelse(bp); return (NULL); } @@ -520,13 +560,13 @@ fragextend(ip, cg, bprev, osize, nsize) * allocate the extended piece */ for (i = frags; i < fs->fs_frag - bbase; i++) - if (isclr(cgp->cg_free, bno + i)) + if (isclr(cg_blksfree(cgp), bno + i)) break; cgp->cg_frsum[i - numfrags(fs, osize)]--; if (i != frags) cgp->cg_frsum[i - frags]++; for (i = numfrags(fs, osize); i < frags; i++) { - clrbit(cgp->cg_free, bno + i); + clrbit(cg_blksfree(cgp), bno + i); cgp->cg_cs.cs_nffree--; fs->fs_cstotal.cs_nffree--; fs->fs_cs(fs, cg).cs_nffree--; @@ -550,18 +590,27 @@ alloccg(ip, cg, bpref, size) int size; { register struct fs *fs; - register struct buf *bp; register struct cg *cgp; - int bno, frags; - int allocsiz; + struct buf *bp; register int i; + int error, bno, frags, allocsiz; fs = ip->i_fs; if (fs->fs_cs(fs, cg).cs_nbfree == 0 && size == fs->fs_bsize) return (NULL); - bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize); +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)), + (int)fs->fs_cgsize, &bp); + if (error) { + brelse(bp); + return (NULL); + } +#endif SECSIZE cgp = bp->b_un.b_cg; - if (bp->b_flags & B_ERROR || cgp->cg_magic != CG_MAGIC || + if (!cg_chkmagic(cgp) || (cgp->cg_cs.cs_nbfree == 0 && size == fs->fs_bsize)) { brelse(bp); return (NULL); @@ -593,7 +642,7 @@ alloccg(ip, cg, bpref, size) bno = alloccgblk(fs, cgp, bpref); bpref = dtogd(fs, bno); for (i = frags; i < fs->fs_frag; i++) - setbit(cgp->cg_free, bpref + i); + setbit(cg_blksfree(cgp), bpref + i); i = fs->fs_frag - frags; cgp->cg_cs.cs_nffree += i; fs->fs_cstotal.cs_nffree += i; @@ -609,7 +658,7 @@ alloccg(ip, cg, bpref, size) return (NULL); } for (i = 0; i < frags; i++) - clrbit(cgp->cg_free, bno + i); + clrbit(cg_blksfree(cgp), bno + i); cgp->cg_cs.cs_nffree -= frags; fs->fs_cstotal.cs_nffree -= frags; fs->fs_cs(fs, cg).cs_nffree -= frags; @@ -652,7 +701,7 @@ alloccgblk(fs, cgp, bpref) /* * if the requested block is available, use it */ - if (isblock(fs, cgp->cg_free, fragstoblks(fs, bpref))) { + if (isblock(fs, cg_blksfree(cgp), fragstoblks(fs, bpref))) { bno = bpref; goto gotit; } @@ -660,7 +709,7 @@ alloccgblk(fs, cgp, bpref) * check for a block available on the same cylinder */ cylno = cbtocylno(fs, bpref); - if (cgp->cg_btot[cylno] == 0) + if (cg_blktot(cgp)[cylno] == 0) goto norot; if (fs->fs_cpc == 0) { /* @@ -675,12 +724,12 @@ alloccgblk(fs, cgp, bpref) * available in the requested cylinder starting at the * requested rotational position and proceeding around. */ - cylbp = cgp->cg_b[cylno]; + cylbp = cg_blks(fs, cgp, cylno); pos = cbtorpos(fs, bpref); - for (i = pos; i < NRPOS; i++) + for (i = pos; i < fs->fs_nrpos; i++) if (cylbp[i] > 0) break; - if (i == NRPOS) + if (i == fs->fs_nrpos) for (i = 0; i < pos; i++) if (cylbp[i] > 0) break; @@ -691,18 +740,19 @@ alloccgblk(fs, cgp, bpref) */ pos = cylno % fs->fs_cpc; bno = (cylno - pos) * fs->fs_spc / NSPB(fs); - if (fs->fs_postbl[pos][i] == -1) { + if (fs_postbl(fs, pos)[i] == -1) { printf("pos = %d, i = %d, fs = %s\n", pos, i, fs->fs_fsmnt); panic("alloccgblk: cyl groups corrupted"); } - for (i = fs->fs_postbl[pos][i];; ) { - if (isblock(fs, cgp->cg_free, bno + i)) { + for (i = fs_postbl(fs, pos)[i];; ) { + if (isblock(fs, cg_blksfree(cgp), bno + i)) { bno = blkstofrags(fs, (bno + i)); goto gotit; } - delta = fs->fs_rotbl[i]; - if (delta <= 0 || delta > MAXBPC - i) + delta = fs_rotbl(fs)[i]; + if (delta <= 0 || + delta + i > fragstoblks(fs, fs->fs_fpg)) break; i += delta; } @@ -719,17 +769,17 @@ norot: return (NULL); cgp->cg_rotor = bno; gotit: - clrblock(fs, cgp->cg_free, (long)fragstoblks(fs, bno)); + clrblock(fs, cg_blksfree(cgp), (long)fragstoblks(fs, bno)); cgp->cg_cs.cs_nbfree--; fs->fs_cstotal.cs_nbfree--; fs->fs_cs(fs, cgp->cg_cgx).cs_nbfree--; cylno = cbtocylno(fs, bno); - cgp->cg_b[cylno][cbtorpos(fs, bno)]--; - cgp->cg_btot[cylno]--; + cg_blks(fs, cgp, cylno)[cbtorpos(fs, bno)]--; + cg_blktot(cgp)[cylno]--; fs->fs_fmod++; return (cgp->cg_cgx * fs->fs_fpg + bno); } - + /* * Determine whether an inode can be allocated. * @@ -749,31 +799,40 @@ ialloccg(ip, cg, ipref, mode) register struct fs *fs; register struct cg *cgp; struct buf *bp; - int start, len, loc, map, i; + int error, start, len, loc, map, i; fs = ip->i_fs; if (fs->fs_cs(fs, cg).cs_nifree == 0) return (NULL); - bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize); +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)), + (int)fs->fs_cgsize, &bp); + if (error) { + brelse(bp); + return (NULL); + } +#endif SECSIZE cgp = bp->b_un.b_cg; - if (bp->b_flags & B_ERROR || cgp->cg_magic != CG_MAGIC || - cgp->cg_cs.cs_nifree == 0) { + if (!cg_chkmagic(cgp) || cgp->cg_cs.cs_nifree == 0) { brelse(bp); return (NULL); } cgp->cg_time = time.tv_sec; if (ipref) { ipref %= fs->fs_ipg; - if (isclr(cgp->cg_iused, ipref)) + if (isclr(cg_inosused(cgp), ipref)) goto gotit; } start = cgp->cg_irotor / NBBY; len = howmany(fs->fs_ipg - cgp->cg_irotor, NBBY); - loc = skpc(0xff, len, &cgp->cg_iused[start]); + loc = skpc(0xff, len, &cg_inosused(cgp)[start]); if (loc == 0) { len = start + 1; start = 0; - loc = skpc(0xff, len, &cgp->cg_iused[0]); + loc = skpc(0xff, len, &cg_inosused(cgp)[0]); if (loc == 0) { printf("cg = %s, irotor = %d, fs = %s\n", cg, cgp->cg_irotor, fs->fs_fsmnt); @@ -782,7 +841,7 @@ ialloccg(ip, cg, ipref, mode) } } i = start + len - loc; - map = cgp->cg_iused[i]; + map = cg_inosused(cgp)[i]; ipref = i * NBBY; for (i = 1; i < (1 << NBBY); i <<= 1, ipref++) { if ((map & i) == 0) { @@ -794,7 +853,7 @@ ialloccg(ip, cg, ipref, mode) panic("ialloccg: block not in map"); /* NOTREACHED */ gotit: - setbit(cgp->cg_iused, ipref); + setbit(cg_inosused(cgp), ipref); cgp->cg_cs.cs_nifree--; fs->fs_cstotal.cs_nifree--; fs->fs_cs(fs, cg).cs_nifree--; @@ -815,67 +874,77 @@ gotit: * free map. If a fragment is deallocated, a possible * block reassembly is checked. */ -free(ip, bno, size) +blkfree(ip, bno, size) register struct inode *ip; daddr_t bno; off_t size; { register struct fs *fs; register struct cg *cgp; - register struct buf *bp; - int cg, blk, frags, bbase; + struct buf *bp; + int error, cg, blk, frags, bbase; register int i; fs = ip->i_fs; if ((unsigned)size > fs->fs_bsize || fragoff(fs, size) != 0) { printf("dev = 0x%x, bsize = %d, size = %d, fs = %s\n", ip->i_dev, fs->fs_bsize, size, fs->fs_fsmnt); - panic("free: bad size"); + panic("blkfree: bad size"); } cg = dtog(fs, bno); if (badblock(fs, bno)) { printf("bad block %d, ino %d\n", bno, ip->i_number); return; } - bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize); +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)), + (int)fs->fs_cgsize, &bp); + if (error) { + brelse(bp); + return; + } +#endif SECSIZE cgp = bp->b_un.b_cg; - if (bp->b_flags & B_ERROR || cgp->cg_magic != CG_MAGIC) { + if (!cg_chkmagic(cgp)) { brelse(bp); return; } cgp->cg_time = time.tv_sec; bno = dtogd(fs, bno); if (size == fs->fs_bsize) { - if (isblock(fs, cgp->cg_free, fragstoblks(fs, bno))) { + if (isblock(fs, cg_blksfree(cgp), fragstoblks(fs, bno))) { printf("dev = 0x%x, block = %d, fs = %s\n", ip->i_dev, bno, fs->fs_fsmnt); - panic("free: freeing free block"); + panic("blkfree: freeing free block"); } - setblock(fs, cgp->cg_free, fragstoblks(fs, bno)); + setblock(fs, cg_blksfree(cgp), fragstoblks(fs, bno)); cgp->cg_cs.cs_nbfree++; fs->fs_cstotal.cs_nbfree++; fs->fs_cs(fs, cg).cs_nbfree++; i = cbtocylno(fs, bno); - cgp->cg_b[i][cbtorpos(fs, bno)]++; - cgp->cg_btot[i]++; + cg_blks(fs, cgp, i)[cbtorpos(fs, bno)]++; + cg_blktot(cgp)[i]++; } else { bbase = bno - fragnum(fs, bno); /* * decrement the counts associated with the old frags */ - blk = blkmap(fs, cgp->cg_free, bbase); + blk = blkmap(fs, cg_blksfree(cgp), bbase); fragacct(fs, blk, cgp->cg_frsum, -1); /* * deallocate the fragment */ frags = numfrags(fs, size); for (i = 0; i < frags; i++) { - if (isset(cgp->cg_free, bno + i)) { + if (isset(cg_blksfree(cgp), bno + i)) { printf("dev = 0x%x, block = %d, fs = %s\n", ip->i_dev, bno + i, fs->fs_fsmnt); - panic("free: freeing free frag"); + panic("blkfree: freeing free frag"); } - setbit(cgp->cg_free, bno + i); + setbit(cg_blksfree(cgp), bno + i); } cgp->cg_cs.cs_nffree += i; fs->fs_cstotal.cs_nffree += i; @@ -883,12 +952,13 @@ free(ip, bno, size) /* * add back in counts associated with the new frags */ - blk = blkmap(fs, cgp->cg_free, bbase); + blk = blkmap(fs, cg_blksfree(cgp), bbase); fragacct(fs, blk, cgp->cg_frsum, 1); /* * if a complete block has been reassembled, account for it */ - if (isblock(fs, cgp->cg_free, fragstoblks(fs, bbase))) { + if (isblock(fs, cg_blksfree(cgp), + (daddr_t)fragstoblks(fs, bbase))) { cgp->cg_cs.cs_nffree -= fs->fs_frag; fs->fs_cstotal.cs_nffree -= fs->fs_frag; fs->fs_cs(fs, cg).cs_nffree -= fs->fs_frag; @@ -896,8 +966,8 @@ free(ip, bno, size) fs->fs_cstotal.cs_nbfree++; fs->fs_cs(fs, cg).cs_nbfree++; i = cbtocylno(fs, bbase); - cgp->cg_b[i][cbtorpos(fs, bbase)]++; - cgp->cg_btot[i]++; + cg_blks(fs, cgp, i)[cbtorpos(fs, bbase)]++; + cg_blktot(cgp)[i]++; } } fs->fs_fmod++; @@ -916,8 +986,8 @@ ifree(ip, ino, mode) { register struct fs *fs; register struct cg *cgp; - register struct buf *bp; - int cg; + struct buf *bp; + int error, cg; fs = ip->i_fs; if ((unsigned)ino >= fs->fs_ipg*fs->fs_ncg) { @@ -926,20 +996,30 @@ ifree(ip, ino, mode) panic("ifree: range"); } cg = itog(fs, ino); - bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize); +#ifdef SECSIZE + bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize, + fs->fs_dbsize); +#else SECSIZE + error = bread(ip->i_devvp, fsbtodb(fs, cgtod(fs, cg)), + (int)fs->fs_cgsize, &bp); + if (error) { + brelse(bp); + return; + } +#endif SECSIZE cgp = bp->b_un.b_cg; - if (bp->b_flags & B_ERROR || cgp->cg_magic != CG_MAGIC) { + if (!cg_chkmagic(cgp)) { brelse(bp); return; } cgp->cg_time = time.tv_sec; ino %= fs->fs_ipg; - if (isclr(cgp->cg_iused, ino)) { + if (isclr(cg_inosused(cgp), ino)) { printf("dev = 0x%x, ino = %d, fs = %s\n", ip->i_dev, ino, fs->fs_fsmnt); panic("ifree: freeing free inode"); } - clrbit(cgp->cg_iused, ino); + clrbit(cg_inosused(cgp), ino); if (ino < cgp->cg_irotor) cgp->cg_irotor = ino; cgp->cg_cs.cs_nifree++; @@ -980,15 +1060,15 @@ mapsearch(fs, cgp, bpref, allocsiz) else start = cgp->cg_frotor / NBBY; len = howmany(fs->fs_fpg, NBBY) - start; - loc = scanc((unsigned)len, (caddr_t)&cgp->cg_free[start], - (caddr_t)fragtbl[fs->fs_frag], - (int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); + loc = scanc((unsigned)len, (u_char *)&cg_blksfree(cgp)[start], + (u_char *)fragtbl[fs->fs_frag], + (u_char)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); if (loc == 0) { len = start + 1; start = 0; - loc = scanc((unsigned)len, (caddr_t)&cgp->cg_free[0], - (caddr_t)fragtbl[fs->fs_frag], - (int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); + loc = scanc((unsigned)len, (u_char *)&cg_blksfree(cgp)[0], + (u_char *)fragtbl[fs->fs_frag], + (u_char)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY)))); if (loc == 0) { printf("start = %d, len = %d, fs = %s\n", start, len, fs->fs_fsmnt); @@ -1003,7 +1083,7 @@ mapsearch(fs, cgp, bpref, allocsiz) * sift through the bits to find the selected frag */ for (i = bno + NBBY; bno < i; bno += fs->fs_frag) { - blk = blkmap(fs, cgp->cg_free, bno); + blk = blkmap(fs, cg_blksfree(cgp), bno); blk <<= 1; field = around[allocsiz]; subfield = inside[allocsiz];