Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 May 2010 08:37:49 GMT
From:      Zheng Liu <lz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 178315 for review
Message-ID:  <201005160837.o4G8bnI4051549@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@178315?ac=10

Change 178315 by lz@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005160837.o4G8bnI4051549>