PERFORCE change 178280 for review
Zheng Liu
lz at FreeBSD.org
Sat May 15 01:44:47 UTC 2010
http://p4web.freebsd.org/@@178280?ac=10
Change 178280 by lz at gnehzuil-freebsd on 2010/05/15 01:43:48
Fix two bugs.
Affected files ...
.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#8 edit
Differences ...
==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#8 (text+ko) ====
@@ -133,24 +133,24 @@
}
/*
- * Add a ext2_rsv_win struct to RB tree.
+ * Remove a ext2_rsv_win structure from RB tree.
*/
static void
-ext2_add_rsv_win(struct m_ext2fs *fs, struct ext2_rsv_win *rp)
+ext2_remove_rsv_win(struct m_ext2fs *fs, struct ext2_rsv_win *rp)
{
- RB_INSERT(ext2_rsv_win_tree, &fs->e2fs_rsv_tree, rp);
+ rp->rw_start = EXT2_RWI_NOT_ALLOCATED;
+ rp->rw_end = EXT2_RWI_NOT_ALLOCATED;
+ rp->rw_alloc_hit = 0;
+ RB_REMOVE(ext2_rsv_win_tree, &fs->e2fs_rsv_tree, rp);
}
/*
- * Remove a ext2_rsv_win structure from RB tree.
+ * Add a ext2_rsv_win struct to RB tree.
*/
static void
-ext2_remove_rsv_win(struct m_ext2fs *fs, struct ext2_rsv_win *rp)
+ext2_add_rsv_win(struct m_ext2fs *fs, struct ext2_rsv_win *rp)
{
- rp->rw_start = EXT2_RWI_NOT_ALLOCATED;
- rp->rw_end = EXT2_RWI_NOT_ALLOCATED;
- rp->rw_alloc_hit = 0;
- RB_REMOVE(ext2_rsv_win_tree, &fs->e2fs_rsv_tree, rp);
+ RB_INSERT(ext2_rsv_win_tree, &fs->e2fs_rsv_tree, rp);
}
/*
@@ -162,6 +162,9 @@
{
struct ext2_rsv_win *next, *prev;
+ if (RB_EMPTY(root))
+ return NULL;
+
next = RB_ROOT(root);
do {
prev = next;
@@ -170,11 +173,11 @@
else if (bpref > next->rw_end)
next = RB_RIGHT(next, rw_link);
else
- return next;
+ return prev;
} while(next != NULL);
- if (next == NULL || next->rw_start > bpref)
- next = prev;
+ if (prev->rw_start > bpref)
+ prev = RB_PREV(ext2_rsv_win_tree, root, prev);
return next;
}
@@ -330,21 +333,18 @@
struct buf *bp, int32_t bpref, struct ext2_rsv_win *rp)
{
struct ext2mount *ump;
- u_long start, end;
+ u_long start;
char *bbp;
u_long bno;
ump = ip->i_ump;
bbp = (char *)bp->b_data;
- if (rp != NULL && rp->rw_end != EXT2_RWI_NOT_ALLOCATED) {
+ if (rp != NULL && rp->rw_end != EXT2_RWI_NOT_ALLOCATED)
start = dtogd(fs, rp->rw_start + rp->rw_alloc_hit) / NBBY;
- end = dtogd(fs, rp->rw_end) / NBBY;
- } else {
- start = dtogd(fs, bpref) / NBBY;
- end = howmany(fs->e2fs->e2fs_fpg, NBBY) - start;
- }
+ else
+ return 0;
- if (bbp[start * NBBY] == 0) {
+ if (bbp[start] == 0) {
bno = start * NBBY;
goto gotit;
}
@@ -425,8 +425,6 @@
else
cg = dtog(fs, bpref);
- /* TODO: If cg doesn't have enought blocks, do not use reservation window */
-
/* If cg has some free blocks, then try to allocate a free block from this cg */
if (fs->e2fs_gd[cg].ext2bgd_nbfree > 0) {
/* Read block bitmap from buffer */
More information about the p4-projects
mailing list