* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
bp = getblk(ip->i_dev, fsbtodb(fs, bno), size);
bp = getblk(ip->i_dev, fsbtodb(fs, bno), size);
bno = fragextend(ip, cg, (long)bprev, osize, nsize);
if (bno != 0) {
do {
bno = fragextend(ip, cg, (long)bprev, osize, nsize);
if (bno != 0) {
do {
bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
bp = bread(ip->i_dev, fsbtodb(fs, bno), osize);
bno = (daddr_t)hashalloc(ip, cg, (long)bpref, request,
(u_long (*)())alloccg);
if (bno > 0) {
bno = (daddr_t)hashalloc(ip, cg, (long)bpref, request,
(u_long (*)())alloccg);
if (bno > 0) {
obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize);
obp = bread(ip->i_dev, fsbtodb(fs, bprev), osize);
- bp = getblk(ip->i_dev, fsbtodb(fs, bno), nsize);
+ bn = fsbtodb(fs, bno);
+#ifdef SECSIZE
+ bp = getblk(ip->i_dev, bn, nsize, fs->fs_dbsize);
+#else SECSIZE
+ bp = getblk(ip->i_dev, bn, nsize);
+#endif SECSIZE
+ 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);
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, bno + numfrags(fs, nsize),
+ blkfree(ip, bno + numfrags(fs, nsize),
frags = numfrags(fs, nsize);
bbase = fragnum(fs, bprev);
if (bbase > fragnum(fs, (bprev + frags - 1))) {
frags = numfrags(fs, nsize);
bbase = fragnum(fs, bprev);
if (bbase > fragnum(fs, (bprev + frags - 1))) {
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
brelse(bp);
return (NULL);
}
cgp->cg_time = time.tv_sec;
bno = dtogd(fs, bprev);
for (i = numfrags(fs, osize); i < frags; i++)
brelse(bp);
return (NULL);
}
cgp->cg_time = time.tv_sec;
bno = dtogd(fs, bprev);
for (i = numfrags(fs, osize); i < frags; 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++) {
break;
cgp->cg_frsum[i - numfrags(fs, osize)]--;
if (i != frags)
cgp->cg_frsum[i - frags]++;
for (i = numfrags(fs, osize); i < frags; i++) {
cgp->cg_cs.cs_nffree--;
fs->fs_cstotal.cs_nffree--;
fs->fs_cs(fs, cg).cs_nffree--;
cgp->cg_cs.cs_nffree--;
fs->fs_cstotal.cs_nffree--;
fs->fs_cs(fs, cg).cs_nffree--;
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
bno = alloccgblk(fs, cgp, bpref);
bpref = dtogd(fs, bno);
for (i = frags; i < fs->fs_frag; i++)
bno = alloccgblk(fs, cgp, bpref);
bpref = dtogd(fs, bno);
for (i = frags; i < fs->fs_frag; i++)
cgp->cg_cs.cs_nffree -= frags;
fs->fs_cstotal.cs_nffree -= frags;
fs->fs_cs(fs, cg).cs_nffree -= frags;
cgp->cg_cs.cs_nffree -= frags;
fs->fs_cstotal.cs_nffree -= frags;
fs->fs_cs(fs, cg).cs_nffree -= frags;
- if (isblock(fs, cgp->cg_free, fragstoblks(fs, bpref))) {
+ if (isblock(fs, cg_blksfree(cgp), fragstoblks(fs, bpref))) {
* check for a block available on the same cylinder
*/
cylno = cbtocylno(fs, bpref);
* check for a block available on the same cylinder
*/
cylno = cbtocylno(fs, bpref);
* available in the requested cylinder starting at the
* requested rotational position and proceeding around.
*/
* available in the requested cylinder starting at the
* requested rotational position and proceeding around.
*/
printf("pos = %d, i = %d, fs = %s\n",
pos, i, fs->fs_fsmnt);
panic("alloccgblk: cyl groups corrupted");
}
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)) {
- 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))
- 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_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]--;
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
goto gotit;
}
start = cgp->cg_irotor / NBBY;
len = howmany(fs->fs_ipg - cgp->cg_irotor, NBBY);
goto gotit;
}
start = cgp->cg_irotor / NBBY;
len = howmany(fs->fs_ipg - cgp->cg_irotor, NBBY);
if (loc == 0) {
printf("cg = %s, irotor = %d, fs = %s\n",
cg, cgp->cg_irotor, fs->fs_fsmnt);
if (loc == 0) {
printf("cg = %s, irotor = %d, fs = %s\n",
cg, cgp->cg_irotor, fs->fs_fsmnt);
cgp->cg_cs.cs_nifree--;
fs->fs_cstotal.cs_nifree--;
fs->fs_cs(fs, cg).cs_nifree--;
cgp->cg_cs.cs_nifree--;
fs->fs_cstotal.cs_nifree--;
fs->fs_cs(fs, cg).cs_nifree--;
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
* free map. If a fragment is deallocated, a possible
* block reassembly is checked.
*/
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);
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);
}
cg = dtog(fs, bno);
if (badblock(fs, bno)) {
printf("bad block %d, ino %d\n", bno, ip->i_number);
return;
}
}
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);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
- 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);
printf("dev = 0x%x, block = %d, fs = %s\n",
ip->i_dev, bno, fs->fs_fsmnt);
- 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_cs.cs_nbfree++;
fs->fs_cstotal.cs_nbfree++;
fs->fs_cs(fs, cg).cs_nbfree++;
i = cbtocylno(fs, bno);
} else {
bbase = bno - fragnum(fs, bno);
/*
* decrement the counts associated with the old frags
*/
} else {
bbase = bno - fragnum(fs, bno);
/*
* decrement the counts associated with the old frags
*/
fragacct(fs, blk, cgp->cg_frsum, -1);
/*
* deallocate the fragment
*/
frags = numfrags(fs, size);
for (i = 0; i < frags; i++) {
fragacct(fs, blk, cgp->cg_frsum, -1);
/*
* deallocate the fragment
*/
frags = numfrags(fs, size);
for (i = 0; i < frags; i++) {
printf("dev = 0x%x, block = %d, fs = %s\n",
ip->i_dev, bno + i, fs->fs_fsmnt);
printf("dev = 0x%x, block = %d, fs = %s\n",
ip->i_dev, bno + i, fs->fs_fsmnt);
fragacct(fs, blk, cgp->cg_frsum, 1);
/*
* if a complete block has been reassembled, account for it
*/
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), 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;
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;
fs->fs_cstotal.cs_nbfree++;
fs->fs_cs(fs, cg).cs_nbfree++;
i = cbtocylno(fs, bbase);
fs->fs_cstotal.cs_nbfree++;
fs->fs_cs(fs, cg).cs_nbfree++;
i = cbtocylno(fs, bbase);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
bp = bread(ip->i_dev, fsbtodb(fs, cgtod(fs, cg)), (int)fs->fs_cgsize);
printf("dev = 0x%x, ino = %d, fs = %s\n",
ip->i_dev, ino, fs->fs_fsmnt);
panic("ifree: freeing free inode");
}
printf("dev = 0x%x, ino = %d, fs = %s\n",
ip->i_dev, ino, fs->fs_fsmnt);
panic("ifree: freeing free inode");
}
else
start = cgp->cg_frotor / NBBY;
len = howmany(fs->fs_fpg, NBBY) - start;
else
start = cgp->cg_frotor / NBBY;
len = howmany(fs->fs_fpg, NBBY) - start;
(caddr_t)fragtbl[fs->fs_frag],
(int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY))));
if (loc == 0) {
len = start + 1;
start = 0;
(caddr_t)fragtbl[fs->fs_frag],
(int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY))));
if (loc == 0) {
len = start + 1;
start = 0;
(caddr_t)fragtbl[fs->fs_frag],
(int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY))));
if (loc == 0) {
(caddr_t)fragtbl[fs->fs_frag],
(int)(1 << (allocsiz - 1 + (fs->fs_frag % NBBY))));
if (loc == 0) {
* sift through the bits to find the selected frag
*/
for (i = bno + NBBY; bno < i; bno += fs->fs_frag) {
* sift through the bits to find the selected frag
*/
for (i = bno + NBBY; bno < i; bno += fs->fs_frag) {