PERFORCE change 189849 for review
Zheng Liu
lz at FreeBSD.org
Fri Mar 11 05:43:47 UTC 2011
http://p4web.freebsd.org/@@189849?ac=10
Change 189849 by lz at freebsd-dev on 2011/03/11 05:43:43
Improve sweep loop like ext2_alloccg().
Affected files ...
.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#37 edit
Differences ...
==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#37 (text+ko) ====
@@ -1306,11 +1306,9 @@
struct m_ext2fs *fs;
struct ext2mount *ump;
struct buf *bp;
- int error, i, got, run;
char *bbp;
- daddr_t bno;
- int bit, map;
- unsigned char *mapp;
+ int error, i, bit, loc, end, start;
+ daddr_t bno = 0, runstart, runlen;
fs = ip->i_e2fs;
ump = ip->i_ump;
@@ -1333,51 +1331,66 @@
* available in this cg.
*/
- if (dtog(fs, bpref) != cg)
- bpref = 0;
- if (bpref != 0)
- bpref = dtogd(fs, bpref);
- mapp = &bbp[bpref / NBBY];
- map = *mapp++;
- bit = 1 << (bpref % NBBY);
- for (run = 0, got = bpref; got < fs->e2fs_bpg; got++) {
- if (!((map & bit) == 0)) {
- run = 0;
+ if (bpref)
+ start = dtogd(fs, bpref) / NBBY;
+ else
+ start = 0;
+ end = howmany(fs->e2fs->e2fs_fpg, NBBY) - start;
+ runlen = 0;
+ runstart = 0;
+ for (loc = start; loc < end; loc++) {
+ if (bbp[loc] == (char)0xff) {
+ runlen = 0;
+ continue;
+ }
+
+ if (runlen == 0) {
+ bit = fls(bbp[loc]);
+ runlen = NBBY - bit;
+ runstart = loc * NBBY + bit;
+ } else if (bbp[loc] == 0) {
+ runlen += NBBY;
} else {
- run++;
- if (run == len)
- break;
+ bit = ffs(bbp[loc]) - 1;
+ runlen += bit;
+ if (runlen >= len) {
+ bno = runstart;
+ goto gotit;
+ }
+
+ bit = fls(bbp[loc]);
+ runlen = NBBY - bit;
+ runstart = loc * NBBY + bit;
}
- if ((got & (NBBY - 1)) != (NBBY - 1)) {
- bit <<= 1;
- } else {
- map = *mapp++;
- bit = 1;
+
+ if (runlen >= len) {
+ bno = runstart;
+ goto gotit;
}
}
- if (got >= fs->e2fs_bpg)
+gotit:
+ if (bno == 0 || bno + len >= fs->e2fs->e2fs_fpg)
goto fail_lock;
/*
* Allocate the cluster that we have found.
*/
- for (i = 1; i <= len; i++)
- if (!isclr(bbp, got - run + i))
+ for (i = 0; i < len; i++)
+ if (!isclr(bbp, bno + i))
panic("ext2_clusteralloc: map mismatch");
- bno = got - run + 1;
- if (bno >= fs->e2fs_bpg)
+ if (bno >= fs->e2fs->e2fs_fpg)
panic("ext2_clusteralloc: allocated out of group");
+ EXT2_LOCK(ump);
for (i = 0; i < len; i += fs->e2fs_fpb) {
setbit(bbp, bno + i);
- EXT2_LOCK(ump);
fs->e2fs->e2fs_fbcount--;
fs->e2fs_gd[cg].ext2bgd_nbfree--;
fs->e2fs_fmod = 1;
- EXT2_UNLOCK(ump);
}
+ EXT2_UNLOCK(ump);
bdwrite(bp);
return (phy_blk(cg, fs) + bno);
More information about the p4-projects
mailing list