Deleted Added
full compact
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 ---