Пример #1
0
static ufs2_daddr_t journal_balloc( void ) {
	ufs2_daddr_t blk;
	struct cg *cgp;
	int valid;
	static int contig = 1;
	cgp = &disk.d_cg;
	for ( ;; ) {
		blk = cgballoc( &disk );
		if ( blk > 0 ) break;
		if ( cgwrite( &disk ) < 0 ) {
			warn( "Failed to write updated cg" );
			return ( -1 );
		}
		while ( ( valid = cgread( &disk ) ) == 1 ) {
			if ( cgp->cg_cs.cs_nbfree > 256 * 1024 ) break;
			if ( contig == 0 && cgp->cg_cs.cs_nbfree ) break;
		}
		if ( valid ) continue;
		if ( contig ) {
			contig = 0;
			disk.d_ccg = 0;
			warnx( "Journal file fragmented." );
			continue;
		}
		warnx( "Failed to find sufficient free blocks for the journal" );
		return -1;
	}
	if ( bwrite( &disk, fsbtodb( &sblock, blk ), clrbuf,
	sblock.fs_bsize ) <= 0 ) {
		warn( "Failed to initialize new block" );
		return -1;
	}
	return ( blk );
}
Пример #2
0
static ufs2_daddr_t
journal_balloc(void)
{
	ufs2_daddr_t blk;
	struct cg *cgp;
	int valid;
	static int contig = 1;

	cgp = &disk.d_cg;
	for (;;) {
		blk = cgballoc(&disk);
		if (blk > 0)
			break;
		/*
		 * If we failed to allocate a block from this cg, move to
		 * the next.
		 */
		if (cgwrite(&disk) < 0) {
			warn("Failed to write updated cg");
			return (-1);
		}
		while ((valid = cgread(&disk)) == 1) {
			/*
			 * Try to minimize fragmentation by requiring a minimum
			 * number of blocks present.
			 */
			if (cgp->cg_cs.cs_nbfree > 256 * 1024)
				break;
			if (contig == 0 && cgp->cg_cs.cs_nbfree)
				break;
		}
		if (valid)
			continue;
		/*
		 * Try once through looking only for large contiguous regions
		 * and again taking any space we can find.
		 */
		if (contig) {
			contig = 0;
			disk.d_ccg = 0;
			warnx("Journal file fragmented.");
			continue;
		}
		warnx("Failed to find sufficient free blocks for the journal");
		return -1;
	}
	if (bwrite(&disk, fsbtodb(&sblock, blk), clrbuf,
	    sblock.fs_bsize) <= 0) {
		warn("Failed to initialize new block");
		return -1;
	}
	return (blk);
}