From owner-p4-projects@FreeBSD.ORG Thu May 27 08:56:29 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 86D4C1065677; Thu, 27 May 2010 08:56:29 +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 331321065672 for ; Thu, 27 May 2010 08:56:29 +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 20B698FC18 for ; Thu, 27 May 2010 08:56:29 +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 o4R8uTtZ016431 for ; Thu, 27 May 2010 08:56:29 GMT (envelope-from lz@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o4R8uSDW016429 for perforce@freebsd.org; Thu, 27 May 2010 08:56:28 GMT (envelope-from lz@FreeBSD.org) Date: Thu, 27 May 2010 08:56:28 GMT Message-Id: <201005270856.o4R8uSDW016429@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 178861 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: Thu, 27 May 2010 08:56:29 -0000 http://p4web.freebsd.org/@@178861?ac=10 Change 178861 by lz@gnehzuil-freebsd on 2010/05/27 08:55:59 Modify the search method. Affected files ... .. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#17 edit Differences ... ==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#17 (text+ko) ==== @@ -239,7 +239,7 @@ struct ext2_rsv_win *search_rsv; struct ext2mount *ump; int size, ret; - int start, end, loc, i; + int start, end, loc, len, i, map; char *bbp; ump = ip->i_ump; @@ -251,10 +251,7 @@ /* If tree is empty, then try to alloc according to bpref */ if (RB_EMPTY(&fs->e2fs_rsv_tree)) { EXT2_TREE_UNLOCK(fs); - /* - * bpref is not in this cylinder group. - * So try to allocate it in other group. - */ + if (dtog(fs, bpref) != cg) bpref = 0; if (bpref != 0) { @@ -302,36 +299,33 @@ } EXT2_TREE_UNLOCK(fs); - start = rp->rsv_start; - for (i = 1; ;i++) { - if (dtog(fs, start) != cg) { - EXT2_TREE_LOCK(fs); - if (rp->rsv_end != EXT2_RSV_NOT_ALLOCATED) - ext2_remove_rsv_win(fs, rp); - EXT2_TREE_UNLOCK(fs); + start = dtogd(fs, rp->rsv_start) / NBBY; + len = howmany(fs->e2fs->e2fs_fpg, NBBY) - start; + loc = skpc(0xff, len, &bbp[start]); + if (loc == 0) { + EXT2_TREE_LOCK(fs); + if (rp->rsv_end != EXT2_RSV_NOT_ALLOCATED) + ext2_remove_rsv_win(fs, rp); + EXT2_TREE_UNLOCK(fs); - bpref = ext2_mapsearch(fs, bbp, bpref); - if (bpref < 0) - return (0); - goto allocated1; - } - - start = dtogd(fs, start); - if (isset(bbp, start)) { - start = rp->rsv_start + i; - continue; - } - - break; + bpref = ext2_mapsearch(fs, bbp, bpref); + if (bpref < 0) + return (0); + goto allocated1; } + i = start + len - loc; + map = bbp[i]; + bpref = i * NBBY; + for (i = 1; i < (1 << NBBY); i <<= 1, bpref++) + if ((map & i) == 0) + break; - if (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + start >= rp->rsv_start && - cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + start < rp->rsv_end) { - bpref = start; + start = cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref; + if (start >= rp->rsv_start && + start < rp->rsv_end) goto allocated; - } - bpref = cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + start; + bpref = start; search_rsv = rp; EXT2_TREE_LOCK(fs); goto repeat; @@ -348,8 +342,6 @@ allocated: rp->rsv_alloc_hit++; allocated1: - if (isset(bbp, bpref)) - return (0); setbit(bbp, (daddr_t)bpref); EXT2_LOCK(ump); fs->e2fs->e2fs_fbcount--;