PERFORCE change 178315 for review
Zheng Liu
lz at FreeBSD.org
Sun May 16 08:37:50 UTC 2010
http://p4web.freebsd.org/@@178315?ac=10
Change 178315 by lz at 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);
More information about the p4-projects
mailing list