Date: Thu, 27 May 2010 08:56:28 GMT From: Zheng Liu <lz@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 178861 for review Message-ID: <201005270856.o4R8uSDW016429@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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--;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005270856.o4R8uSDW016429>