ffs_alloc.c (186335) | ffs_alloc.c (214921) |
---|---|
1/* $NetBSD: ffs_alloc.c,v 1.14 2004/06/20 22:20:18 jmc Exp $ */ 2/* From: NetBSD: ffs_alloc.c,v 1.50 2001/09/06 02:16:01 lukem Exp */ 3 4/* 5 * Copyright (c) 2002 Networks Associates Technology, Inc. 6 * All rights reserved. 7 * 8 * This software was developed for the FreeBSD Project by Marshall --- 28 unchanged lines hidden (view full) --- 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * @(#)ffs_alloc.c 8.19 (Berkeley) 7/13/95 42 */ 43 44#include <sys/cdefs.h> | 1/* $NetBSD: ffs_alloc.c,v 1.14 2004/06/20 22:20:18 jmc Exp $ */ 2/* From: NetBSD: ffs_alloc.c,v 1.50 2001/09/06 02:16:01 lukem Exp */ 3 4/* 5 * Copyright (c) 2002 Networks Associates Technology, Inc. 6 * All rights reserved. 7 * 8 * This software was developed for the FreeBSD Project by Marshall --- 28 unchanged lines hidden (view full) --- 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * @(#)ffs_alloc.c 8.19 (Berkeley) 7/13/95 42 */ 43 44#include <sys/cdefs.h> |
45__FBSDID("$FreeBSD: head/usr.sbin/makefs/ffs/ffs_alloc.c 186334 2008-12-19 18:45:43Z sam $"); | 45__FBSDID("$FreeBSD: head/usr.sbin/makefs/ffs/ffs_alloc.c 214921 2010-11-07 16:05:04Z cognet $"); |
46 47#include <sys/param.h> 48#include <sys/time.h> 49 50#include <errno.h> 51 52#include "makefs.h" 53 --- 28 unchanged lines hidden (view full) --- 82 * If no block preference is given the following hierarchy is used 83 * to allocate a block: 84 * 1) allocate a block in the cylinder group that contains the 85 * inode for the file. 86 * 2) quadradically rehash into other cylinder groups, until an 87 * available block is located. 88 */ 89int | 46 47#include <sys/param.h> 48#include <sys/time.h> 49 50#include <errno.h> 51 52#include "makefs.h" 53 --- 28 unchanged lines hidden (view full) --- 82 * If no block preference is given the following hierarchy is used 83 * to allocate a block: 84 * 1) allocate a block in the cylinder group that contains the 85 * inode for the file. 86 * 2) quadradically rehash into other cylinder groups, until an 87 * available block is located. 88 */ 89int |
90ffs_alloc(struct inode *ip, daddr_t lbn, daddr_t bpref, int size, | 90ffs_alloc(struct inode *ip, daddr_t lbn __unused, daddr_t bpref, int size, |
91 daddr_t *bnp) 92{ 93 struct fs *fs = ip->i_fs; 94 daddr_t bno; 95 int cg; 96 97 *bnp = 0; | 91 daddr_t *bnp) 92{ 93 struct fs *fs = ip->i_fs; 94 daddr_t bno; 95 int cg; 96 97 *bnp = 0; |
98 if ((u_int)size > fs->fs_bsize || fragoff(fs, size) != 0) { | 98 if (size > fs->fs_bsize || fragoff(fs, size) != 0) { |
99 errx(1, "ffs_alloc: bad size: bsize %d size %d", 100 fs->fs_bsize, size); 101 } 102 if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0) 103 goto nospace; 104 if (bpref >= fs->fs_size) 105 bpref = 0; 106 if (bpref == 0) --- 75 unchanged lines hidden (view full) --- 182 } 183 /* 184 * We just always try to lay things out contiguously. 185 */ 186 return ufs_rw32(bap[indx - 1], UFS_FSNEEDSWAP(fs)) + fs->fs_frag; 187} 188 189daddr_t | 99 errx(1, "ffs_alloc: bad size: bsize %d size %d", 100 fs->fs_bsize, size); 101 } 102 if (size == fs->fs_bsize && fs->fs_cstotal.cs_nbfree == 0) 103 goto nospace; 104 if (bpref >= fs->fs_size) 105 bpref = 0; 106 if (bpref == 0) --- 75 unchanged lines hidden (view full) --- 182 } 183 /* 184 * We just always try to lay things out contiguously. 185 */ 186 return ufs_rw32(bap[indx - 1], UFS_FSNEEDSWAP(fs)) + fs->fs_frag; 187} 188 189daddr_t |
190ffs_blkpref_ufs2(ip, lbn, indx, bap) 191 struct inode *ip; 192 daddr_t lbn; 193 int indx; 194 int64_t *bap; | 190ffs_blkpref_ufs2(struct inode *ip, daddr_t lbn, int indx, int64_t *bap) |
195{ 196 struct fs *fs; 197 int cg; 198 int avgbfree, startcg; 199 200 fs = ip->i_fs; 201 if (indx % fs->fs_maxbpg == 0 || bap[indx - 1] == 0) { 202 if (lbn < NDADDR + NINDIR(fs)) { --- 177 unchanged lines hidden (view full) --- 380static daddr_t 381ffs_alloccgblk(struct inode *ip, struct buf *bp, daddr_t bpref) 382{ 383 struct cg *cgp; 384 daddr_t blkno; 385 int32_t bno; 386 struct fs *fs = ip->i_fs; 387 const int needswap = UFS_FSNEEDSWAP(fs); | 191{ 192 struct fs *fs; 193 int cg; 194 int avgbfree, startcg; 195 196 fs = ip->i_fs; 197 if (indx % fs->fs_maxbpg == 0 || bap[indx - 1] == 0) { 198 if (lbn < NDADDR + NINDIR(fs)) { --- 177 unchanged lines hidden (view full) --- 376static daddr_t 377ffs_alloccgblk(struct inode *ip, struct buf *bp, daddr_t bpref) 378{ 379 struct cg *cgp; 380 daddr_t blkno; 381 int32_t bno; 382 struct fs *fs = ip->i_fs; 383 const int needswap = UFS_FSNEEDSWAP(fs); |
388 u_int8_t *blksfree; | 384 u_int8_t *blksfree_swap; |
389 390 cgp = (struct cg *)bp->b_data; | 385 386 cgp = (struct cg *)bp->b_data; |
391 blksfree = cg_blksfree_swap(cgp, needswap); 392 if (bpref == 0 || dtog(fs, bpref) != ufs_rw32(cgp->cg_cgx, needswap)) { | 387 blksfree_swap = cg_blksfree_swap(cgp, needswap); 388 if (bpref == 0 || (uint32_t)dtog(fs, bpref) != ufs_rw32(cgp->cg_cgx, needswap)) { |
393 bpref = ufs_rw32(cgp->cg_rotor, needswap); 394 } else { 395 bpref = blknum(fs, bpref); 396 bno = dtogd(fs, bpref); 397 /* 398 * if the requested block is available, use it 399 */ | 389 bpref = ufs_rw32(cgp->cg_rotor, needswap); 390 } else { 391 bpref = blknum(fs, bpref); 392 bno = dtogd(fs, bpref); 393 /* 394 * if the requested block is available, use it 395 */ |
400 if (ffs_isblock(fs, blksfree, fragstoblks(fs, bno))) | 396 if (ffs_isblock(fs, blksfree_swap, fragstoblks(fs, bno))) |
401 goto gotit; 402 } 403 /* 404 * Take the next available one in this cylinder group. 405 */ 406 bno = ffs_mapsearch(fs, cgp, bpref, (int)fs->fs_frag); 407 if (bno < 0) 408 return (0); 409 cgp->cg_rotor = ufs_rw32(bno, needswap); 410gotit: 411 blkno = fragstoblks(fs, bno); | 397 goto gotit; 398 } 399 /* 400 * Take the next available one in this cylinder group. 401 */ 402 bno = ffs_mapsearch(fs, cgp, bpref, (int)fs->fs_frag); 403 if (bno < 0) 404 return (0); 405 cgp->cg_rotor = ufs_rw32(bno, needswap); 406gotit: 407 blkno = fragstoblks(fs, bno); |
412 ffs_clrblock(fs, blksfree, (long)blkno); | 408 ffs_clrblock(fs, blksfree_swap, (long)blkno); |
413 ffs_clusteracct(fs, cgp, blkno, -1); 414 ufs_add32(cgp->cg_cs.cs_nbfree, -1, needswap); 415 fs->fs_cstotal.cs_nbfree--; 416 fs->fs_cs(fs, ufs_rw32(cgp->cg_cgx, needswap)).cs_nbfree--; 417 fs->fs_fmod = 1; 418 blkno = ufs_rw32(cgp->cg_cgx, needswap) * fs->fs_fpg + bno; 419 return (blkno); 420} --- 10 unchanged lines hidden (view full) --- 431{ 432 struct cg *cgp; 433 struct buf *bp; 434 int32_t fragno, cgbno; 435 int i, error, cg, blk, frags, bbase; 436 struct fs *fs = ip->i_fs; 437 const int needswap = UFS_FSNEEDSWAP(fs); 438 | 409 ffs_clusteracct(fs, cgp, blkno, -1); 410 ufs_add32(cgp->cg_cs.cs_nbfree, -1, needswap); 411 fs->fs_cstotal.cs_nbfree--; 412 fs->fs_cs(fs, ufs_rw32(cgp->cg_cgx, needswap)).cs_nbfree--; 413 fs->fs_fmod = 1; 414 blkno = ufs_rw32(cgp->cg_cgx, needswap) * fs->fs_fpg + bno; 415 return (blkno); 416} --- 10 unchanged lines hidden (view full) --- 427{ 428 struct cg *cgp; 429 struct buf *bp; 430 int32_t fragno, cgbno; 431 int i, error, cg, blk, frags, bbase; 432 struct fs *fs = ip->i_fs; 433 const int needswap = UFS_FSNEEDSWAP(fs); 434 |
439 if ((u_int)size > fs->fs_bsize || fragoff(fs, size) != 0 || | 435 if (size > fs->fs_bsize || fragoff(fs, size) != 0 || |
440 fragnum(fs, bno) + numfrags(fs, size) > fs->fs_frag) { 441 errx(1, "blkfree: bad size: bno %lld bsize %d size %ld", 442 (long long)bno, fs->fs_bsize, size); 443 } 444 cg = dtog(fs, bno); 445 if (bno >= fs->fs_size) { | 436 fragnum(fs, bno) + numfrags(fs, size) > fs->fs_frag) { 437 errx(1, "blkfree: bad size: bno %lld bsize %d size %ld", 438 (long long)bno, fs->fs_bsize, size); 439 } 440 cg = dtog(fs, bno); 441 if (bno >= fs->fs_size) { |
446 warnx("bad block %lld, ino %d", (long long)bno, ip->i_number); | 442 warnx("bad block %lld, ino %llu", (long long)bno, 443 (unsigned long long)ip->i_number); |
447 return; 448 } 449 error = bread(ip->i_fd, ip->i_fs, fsbtodb(fs, cgtod(fs, cg)), 450 (int)fs->fs_cgsize, &bp); 451 if (error) { 452 brelse(bp); 453 return; 454 } --- 162 unchanged lines hidden (view full) --- 617 setbit(freemapp, blkno); 618 else 619 clrbit(freemapp, blkno); 620 /* 621 * Find the size of the cluster going forward. 622 */ 623 start = blkno + 1; 624 end = start + fs->fs_contigsumsize; | 444 return; 445 } 446 error = bread(ip->i_fd, ip->i_fs, fsbtodb(fs, cgtod(fs, cg)), 447 (int)fs->fs_cgsize, &bp); 448 if (error) { 449 brelse(bp); 450 return; 451 } --- 162 unchanged lines hidden (view full) --- 614 setbit(freemapp, blkno); 615 else 616 clrbit(freemapp, blkno); 617 /* 618 * Find the size of the cluster going forward. 619 */ 620 start = blkno + 1; 621 end = start + fs->fs_contigsumsize; |
625 if (end >= ufs_rw32(cgp->cg_nclusterblks, needswap)) | 622 if ((unsigned)end >= ufs_rw32(cgp->cg_nclusterblks, needswap)) |
626 end = ufs_rw32(cgp->cg_nclusterblks, needswap); 627 mapp = &freemapp[start / NBBY]; 628 map = *mapp++; 629 bit = 1 << (start % NBBY); 630 for (i = start; i < end; i++) { 631 if ((map & bit) == 0) 632 break; 633 if ((i & (NBBY - 1)) != (NBBY - 1)) { --- 50 unchanged lines hidden --- | 623 end = ufs_rw32(cgp->cg_nclusterblks, needswap); 624 mapp = &freemapp[start / NBBY]; 625 map = *mapp++; 626 bit = 1 << (start % NBBY); 627 for (i = start; i < end; i++) { 628 if ((map & bit) == 0) 629 break; 630 if ((i & (NBBY - 1)) != (NBBY - 1)) { --- 50 unchanged lines hidden --- |