From owner-p4-projects@FreeBSD.ORG Sun May 16 08:37:50 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DDE72106567B; Sun, 16 May 2010 08:37:49 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A02BB1065678 for ; Sun, 16 May 2010 08:37:49 +0000 (UTC) (envelope-from lz@FreeBSD.org) Received: from repoman.freebsd.org (unknown [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8CF478FC0C for ; Sun, 16 May 2010 08:37:49 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o4G8bn0d051551 for ; Sun, 16 May 2010 08:37:49 GMT (envelope-from lz@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o4G8bnI4051549 for perforce@freebsd.org; Sun, 16 May 2010 08:37:49 GMT (envelope-from lz@FreeBSD.org) Date: Sun, 16 May 2010 08:37:49 GMT Message-Id: <201005160837.o4G8bnI4051549@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to lz@FreeBSD.org using -f From: Zheng Liu To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 178315 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 16 May 2010 08:37:50 -0000 http://p4web.freebsd.org/@@178315?ac=10 Change 178315 by lz@gnehzuil-freebsd on 2010/05/16 08:37:13 Remove hashalloc algorithm in ext2_alloc_rsv() function. * It do not require to call ext2_hashalloc function Affected files ... .. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#10 edit Differences ... ==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#10 (text+ko) ==== @@ -217,16 +217,14 @@ break; } - if (prev != rp && rp->rw_end != EXT2_RWI_NOT_ALLOCATED) + if (rp->rw_end != EXT2_RWI_NOT_ALLOCATED) ext2_remove_rsv_win(fs, rp); rp->rw_start = cur; rp->rw_end = cur + size - 1; rp->rw_alloc_hit = 0; - if (prev != rp) { - ext2_add_rsv_win(fs, rp); - } + ext2_add_rsv_win(fs, rp); return 0; } @@ -239,12 +237,13 @@ struct m_ext2fs *fs, int cg, struct buf *bp) { struct ext2_rsv_win *search_rsv; + struct ext2mount *ump; int size, ret; int start, end, loc; char *bbp; + ump = ip->i_ump; bbp = (char *)bp->b_data; - bpref = bpref; size = rp->rw_goal_size; mtx_lock_spin(&fs->e2fs_rsv_lock); @@ -256,7 +255,7 @@ * So try to allocate it in other group. */ if (dtog(fs, bpref) != cg) - return -1; + return 0; if (bpref != 0) { bpref = dtogd(fs, bpref); if (isclr(bbp, bpref)) @@ -274,12 +273,17 @@ } } - for (loc = start; loc < start; loc++) { + for (loc = 0; loc < start; loc++) { if (bbp[loc] == 0) { bpref = loc * NBBY; goto gotit; } } + + bpref = ext2_mapsearch(fs, bbp, bpref); + if (bpref < 0) + return 0; + goto allocated1; } else { search_rsv = ext2_search_rsv_win(&fs->e2fs_rsv_tree, bpref); @@ -288,14 +292,18 @@ if (rp->rw_end != EXT2_RWI_NOT_ALLOCATED) ext2_remove_rsv_win(fs, rp); mtx_unlock_spin(&fs->e2fs_rsv_lock); - return 0; + + bpref = ext2_mapsearch(fs, bbp, bpref); + if (bpref < 0) + return 0; + goto allocated1; } mtx_unlock_spin(&fs->e2fs_rsv_lock); if (isclr(bbp, bpref) && bpref >= rp->rw_start && bpref < rp->rw_end) - return 0; + goto allocated; start = dtogd(fs, bpref) / NBBY; end = howmany(fs->e2fs->e2fs_fpg, NBBY) - start; @@ -303,7 +311,8 @@ if (bbp[loc] == 0 && loc * NBBY >= rp->rw_start && loc * NBBY < rp->rw_end) { - return 0; + bpref = loc * NBBY; + goto allocated; } } @@ -311,7 +320,11 @@ mtx_lock_spin(&fs->e2fs_rsv_lock); ext2_remove_rsv_win(fs, rp); mtx_unlock_spin(&fs->e2fs_rsv_lock); - return -1; + + bpref = ext2_mapsearch(fs, bbp, bpref); + if (bpref < 0) + return 0; + goto allocated1; } } @@ -322,7 +335,18 @@ mtx_lock_spin(&fs->e2fs_rsv_lock); ext2_add_rsv_win(fs, rp); mtx_unlock_spin(&fs->e2fs_rsv_lock); - return 0; + +allocated: + rp->rw_alloc_hit = bpref - rp->rw_start + 1; +allocated1: + setbit(bbp, (daddr_t)bpref); + EXT2_LOCK(ump); + fs->e2fs->e2fs_fbcount--; + fs->e2fs_gd[cg].ext2bgd_nbfree--; + fs->e2fs_fmod = 1; + EXT2_UNLOCK(ump); + bdwrite(bp); + return cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref; } /* @@ -353,10 +377,13 @@ ext2_remove_rsv_win(fs, rp); mtx_unlock_spin(&fs->e2fs_rsv_lock); - return 0; - + bno = ext2_mapsearch(fs, bbp, bpref); + if (bno < 0) + return 0; + goto allocated; gotit: rp->rw_alloc_hit++; +allocated: setbit(bbp, (daddr_t)bno); EXT2_LOCK(ump); fs->e2fs->e2fs_fbcount--; @@ -375,7 +402,6 @@ struct buf *bp, int32_t bpref, int size) { struct ext2_rsv_win *rp; - int32_t ret; rp = ip->i_rsv; @@ -384,13 +410,9 @@ * Then we try to allocate a free block. */ if (rp->rw_end == EXT2_RWI_NOT_ALLOCATED) { - ret = ext2_alloc_new_rsv_win(ip, rp, bpref, fs, cg, bp); - if (ret < 0) - return 0; + return ext2_alloc_new_rsv_win(ip, rp, bpref, fs, cg, bp); } else if (rp->rw_start + rp->rw_alloc_hit - 1 == rp->rw_end) { - ret = ext2_alloc_new_rsv_win(ip, rp, rp->rw_end, fs, cg, bp); - if (ret < 0) - return 0; + return ext2_alloc_new_rsv_win(ip, rp, rp->rw_end, fs, cg, bp); } return ext2_alloc_blk(fs, ip, cg, bp, bpref, rp); @@ -452,32 +474,35 @@ EXT2_LOCK(ump); } - /* TODO: Just need to try to allocate a free block from rest groups. - * Now just use old allocation algorihtm. - */ - for (i = 0; i < fs->e2fs_gcount; i++) { - /* Read block bitmap from buffer */ - EXT2_UNLOCK(ump); - error = bread(ip->i_devvp, - fsbtodb(fs, fs->e2fs_gd[i].ext2bgd_b_bitmap), - (int)fs->e2fs_bsize, NOCRED, &bp); - if (error) { + /* Just need to try to allocate a free block from rest groups. */ + cg = (cg + 1) % fs->e2fs_gcount; + for (i = 1; i < fs->e2fs_gcount; i++) { + if (fs->e2fs_gd[cg].ext2bgd_nbfree > 0) { + /* Read block bitmap from buffer */ + EXT2_UNLOCK(ump); + error = bread(ip->i_devvp, + fsbtodb(fs, fs->e2fs_gd[i].ext2bgd_b_bitmap), + (int)fs->e2fs_bsize, NOCRED, &bp); + if (error) { + brelse(bp); + goto ioerror; + } + + EXT2_IRSV_LOCK(ip); + bno = ext2_rsvalloc(fs, ip, i, bp, bpref, size); + EXT2_IRSV_UNLOCK(ip); + if (bno > 0) + goto allocated; + brelse(bp); - goto ioerror; + EXT2_LOCK(ump); } - EXT2_IRSV_LOCK(ip); - bno = ext2_rsvalloc(fs, ip, i, bp, bpref, size); - EXT2_IRSV_UNLOCK(ip); - if (bno > 0) - goto allocated; - - brelse(bp); - EXT2_LOCK(ump); + cg++; + if (cg == fs->e2fs_gcount) + cg = 0; } - bno = (daddr_t)ext2_hashalloc(ip, cg, bpref, fs->e2fs_bsize, ext2_alloccg); - allocated: if (bno > 0) { ip->i_blocks += btodb(fs->e2fs_bsize);