From owner-p4-projects@FreeBSD.ORG Wed May 26 13:45:23 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 378081065673; Wed, 26 May 2010 13:45:23 +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 D7FE0106566C for ; Wed, 26 May 2010 13:45:22 +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 C54FD8FC15 for ; Wed, 26 May 2010 13:45:22 +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 o4QDjM9t053227 for ; Wed, 26 May 2010 13:45:22 GMT (envelope-from lz@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o4QDjM2X053225 for perforce@freebsd.org; Wed, 26 May 2010 13:45:22 GMT (envelope-from lz@FreeBSD.org) Date: Wed, 26 May 2010 13:45:22 GMT Message-Id: <201005261345.o4QDjM2X053225@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 178814 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: Wed, 26 May 2010 13:45:23 -0000 http://p4web.freebsd.org/@@178814?ac=10 Change 178814 by lz@gnehzuil-freebsd on 2010/05/26 13:45:10 Just make the code to better clear. Affected files ... .. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#15 edit Differences ... ==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#15 (text+ko) ==== @@ -77,10 +77,7 @@ RB_GENERATE(ext2_rsv_win_tree, ext2_rsv_win, rsv_link, ext2_rsv_win_cmp); /* - * Lazily initialize reservation window per inode. - * - * When file need to allocate blocks first, reservation window - * info structure will be initialized. + * Initialize reservation window per inode. */ void ext2_init_rsv(struct inode *ip) @@ -90,7 +87,8 @@ rp = malloc(sizeof(struct ext2_rsv_win), M_EXT2NODE, M_WAITOK | M_ZERO); - /* If malloc failed, we just do not use + /* + * If malloc failed, we just do not use * reservation window mechanism */ if (rp == NULL) @@ -164,7 +162,7 @@ struct ext2_rsv_win *next, *prev; if (RB_EMPTY(root)) - return NULL; + return (NULL); next = RB_ROOT(root); do { @@ -174,13 +172,13 @@ else if (bpref > next->rsv_end) next = RB_RIGHT(next, rsv_link); else - return prev; + return (prev); } while(next != NULL); if (prev->rsv_start > bpref) prev = RB_PREV(ext2_rsv_win_tree, root, prev); - return prev; + return (prev); } /* @@ -195,7 +193,7 @@ int size = EXT2_RSV_DEFAULT_RESERVE_BLKS; if (search == NULL && RB_EMPTY(&fs->e2fs_rsv_tree)) - return -1; + return (-1); else search = RB_ROOT(&fs->e2fs_rsv_tree); @@ -208,7 +206,7 @@ cur = rsv->rsv_end + 1; if (dtog(fs, cur) != cg) - return -1; + return (-1); prev = rsv; next = RB_NEXT(ext2_rsv_win_tree, &fs->e2fs_rsv_tree, rsv); @@ -230,7 +228,7 @@ ext2_add_rsv_win(fs, rp); - return 0; + return (0); } /* @@ -255,7 +253,8 @@ /* 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. + /* + * bpref is not in this cylinder group. * So try to allocate it in other group. */ if (dtog(fs, bpref) != cg) @@ -286,7 +285,7 @@ bpref = ext2_mapsearch(fs, bbp, bpref); if (bpref < 0) - return 0; + return (0); goto gotit; } else { search_rsv = ext2_search_rsv_win(&fs->e2fs_rsv_tree, bpref); @@ -299,26 +298,31 @@ bpref = ext2_mapsearch(fs, bbp, bpref); if (bpref < 0) - return 0; + return (0); goto allocated1; } EXT2_TREE_UNLOCK(fs); - if (dtog(fs, bpref) != cg) - bpref = 0; + bpref = rp->rsv_start; + if (dtog(fs, bpref) != cg) { + EXT2_TREE_LOCK(fs); + if (rp->rsv_end != EXT2_RSV_NOT_ALLOCATED) + ext2_remove_rsv_win(fs, rp); + EXT2_TREE_UNLOCK(fs); - if (bpref != 0) { - bpref = dtogd(fs, bpref); - if (isclr(bbp, bpref) && - cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref >= rp->rsv_start && - cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref < rp->rsv_end) - goto allocated; + bpref = ext2_mapsearch(fs, bbp, bpref); + if (bpref < 0) + return (0); + goto allocated1; } - if (bpref != 0) - start = dtogd(fs, bpref) / NBBY; - else - start = 0; + bpref = dtogd(fs, bpref); + if (isclr(bbp, bpref) && + cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref >= rp->rsv_start && + cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref < rp->rsv_end) + goto allocated; + + start = dtogd(fs, bpref) / NBBY; end = howmany(fs->e2fs->e2fs_fpg, NBBY) - start; for (loc = start; loc < end; loc++) { if (bbp[loc] == 0 && @@ -337,7 +341,7 @@ bpref = ext2_mapsearch(fs, bbp, bpref); if (bpref < 0) - return 0; + return (0); goto allocated1; } } @@ -354,7 +358,7 @@ rp->rsv_alloc_hit++; allocated1: if (isset(bbp, bpref)) - return 0; + return (0); setbit(bbp, (daddr_t)bpref); EXT2_LOCK(ump); fs->e2fs->e2fs_fbcount--; @@ -362,7 +366,7 @@ fs->e2fs_fmod = 1; EXT2_UNLOCK(ump); bdwrite(bp); - return cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref; + return (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bpref); } /* @@ -379,15 +383,12 @@ ump = ip->i_ump; bbp = (char *)bp->b_data; - if (rp->rsv_end != EXT2_RSV_NOT_ALLOCATED) { - start = dtogd(fs, rp->rsv_start + rp->rsv_alloc_hit); - } else + + if (dtog(fs, bpref) != cg) goto find; - if (dtog(fs, rp->rsv_start + rp->rsv_alloc_hit) != cg) - goto find; + start = dtogd(fs, bpref); - start = dtogd(fs, start); if (isclr(bbp, start)) { bno = start; rp->rsv_alloc_hit++; @@ -402,7 +403,7 @@ bno = ext2_mapsearch(fs, bbp, bpref); if (bno < 0) - return 0; + return (0); gotit: setbit(bbp, (daddr_t)bno); @@ -412,7 +413,7 @@ fs->e2fs_fmod = 1; EXT2_UNLOCK(ump); bdwrite(bp); - return cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bno; + return (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bno); } /* @@ -426,19 +427,17 @@ rp = ip->i_rsv; - /*if (ip->i_rsv == NULL)*/ - /*return ext2_alloc_blk(fs, ip, cg, bp, bpref, rp);*/ - /* If window is empty or bpref is not in reservation window, * we will try to allocate a new reservation window. * Then we try to allocate a free block. */ if (rp->rsv_end == EXT2_RSV_NOT_ALLOCATED) - return ext2_alloc_new_rsv_win(ip, rp, bpref, fs, cg, bp); + return (ext2_alloc_new_rsv_win(ip, rp, bpref, fs, cg, bp)); else if (rp->rsv_start + rp->rsv_alloc_hit > rp->rsv_end) - return ext2_alloc_new_rsv_win(ip, rp, rp->rsv_end, fs, cg, bp); + return (ext2_alloc_new_rsv_win(ip, rp, rp->rsv_end, fs, cg, bp)); - return ext2_alloc_blk(fs, ip, cg, bp, bpref, rp); + return (ext2_alloc_blk(fs, ip, cg, bp, + rp->rsv_start + rp->rsv_alloc_hit, rp)); } /*