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 ); }
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); }