PERFORCE change 178814 for review

Zheng Liu lz at FreeBSD.org
Wed May 26 13:45:23 UTC 2010


http://p4web.freebsd.org/@@178814?ac=10

Change 178814 by lz at 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));
 }
 
 /*


More information about the p4-projects mailing list