Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Feb 2011 01:51:14 GMT
From:      Zheng Liu <lz@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 189166 for review
Message-ID:  <201102260151.p1Q1pESt084997@skunkworks.freebsd.org>

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

Change 189166 by lz@freebsd-dev on 2011/02/26 01:51:06

	       ext2_reallocblks() and ext2_clusteralloc() functions cleanups.

Affected files ...

.. //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#34 edit

Differences ...

==== //depot/projects/soc2010/extfs/src/sys/fs/ext2fs/ext2_alloc.c#34 (text+ko) ====

@@ -678,7 +678,7 @@
  */
 
 #ifdef FANCY_REALLOC
-static int doasyncfree = 1;
+static int doasyncfree = 0;
 
 SYSCTL_INT(_vfs_ext2fs, OID_AUTO, doasyncfree, CTLFLAG_RW, &doasyncfree, 0,
     "Use asychronous writes to update block pointers when freeing blocks");
@@ -699,6 +699,9 @@
 return ENOSPC;
 #else
 
+        if (doreallocblks == 0)
+                return (ENOSPC);
+
 	struct m_ext2fs *fs;
 	struct inode *ip;
 	struct vnode *vp;
@@ -754,11 +757,6 @@
 		soff = idp->in_off;
 	}
 	/*
-	 * Find the preferred location for the cluster.
-	 */
-	EXT2_LOCK(ump);
-	pref = ext2_blkpref(ip, start_lbn, soff, sbap, blkno);
-	/*
 	 * If the block range spans two block maps, get the second map.
 	 */
 	if (end_lvl == 0 || (idp = &end_ap[end_lvl - 1])->in_off + 1 >= len) {
@@ -769,17 +767,20 @@
 			panic("ext2_reallocblk: start == end");
 #endif
 		ssize = len - (idp->in_off + 1);
-		if (bread(vp, idp->in_lbn, (int)fs->e2fs_bsize, NOCRED, &ebp)){
-			EXT2_UNLOCK(ump);	
+		if (bread(vp, idp->in_lbn, (int)fs->e2fs_bsize, NOCRED, &ebp))
 			goto fail;
-		}
 		ebap = (int32_t *)ebp->b_data;
 	}
 	/*
+	 * Find the preferred location for the cluster.
+	 */
+	EXT2_LOCK(ump);
+	pref = ext2_blkpref(ip, start_lbn, soff, sbap, blkno);
+	/*
 	 * Search the block map looking for an allocation of the desired size.
 	 */
 	if ((newblk = (int32_t)ext2_hashalloc(ip, dtog(fs, pref), pref,
-	    len, ext2_clusteralloc)) == 0){
+	    len, ext2_clusteralloc)) == 0) {
 		EXT2_UNLOCK(ump);
 		goto fail;
 	}	
@@ -792,9 +793,10 @@
 	 */
 	blkno = newblk;
 	for (bap = &sbap[soff], i = 0; i < len; i++, blkno += fs->e2fs_fpb) {
-		if (i == ssize)
+		if (i == ssize) {
 			bap = ebap;
 			soff = -i;
+                }
 #ifdef DIAGNOSTIC
 		if (buflist->bs_children[i]->b_blkno != fsbtodb(fs, *bap))
 			panic("ext2_reallocblks: alloc mismatch");
@@ -851,80 +853,6 @@
 #endif /* FANCY_REALLOC */
 }
 
-static daddr_t
-ext2_clusteralloc(struct inode *ip, int cg, daddr_t bpref, int len)
-{
-        struct m_ext2fs *fs;
-        struct ext2mount *ump;
-        struct buf *bp;
-        int error, i, got, run;
-        char *bbp;
-        daddr_t bno;
-
-        fs = ip->i_e2fs;
-        ump = ip->i_ump;
-
-        /*
-         * TODO: we need to define a new member in m_ext2fs structure
-         * to save max cluster. But for simplicity, we assume that the
-         * max cluster is equal to the number of blocks per group.
-         */
-        if (fs->e2fs_gd[cg].ext2bgd_nbfree < len)
-                return (0);
-
-        EXT2_UNLOCK(ump);
-        error = bread(ip->i_devvp,
-            fsbtodb(fs, fs->e2fs_gd[cg].ext2bgd_b_bitmap),
-            (int)fs->e2fs_bsize, NOCRED, &bp);
-        if (error)
-                goto fail_lock;
-
-        bbp = (char *)bp->b_data;
-        bp->b_xflags |= BX_BKGRDWRITE;
-
-        /*
-         * TODO: check to see if a cluster of the needed size is
-         * available in this cg.
-         */
-
-        if (dtog(fs, bpref) != cg)
-                bpref = 0;
-        else
-                bpref = dtogd(fs, bpref);
-
-        for (run = 0, got = bpref; got < fs->e2fs_bpg; got++) {
-                if (!isclr(bbp, got))
-                        run = 0;
-                else {
-                        run++;
-                        if (run == len)
-                                break;
-                }
-        }
-
-        if (got >= fs->e2fs_bpg)
-                goto fail_lock;
-
-        for (i = 1; i <= len; i++)
-                if (!isclr(bbp, got - run + i))
-                        panic("ext2_clusteralloc: map mismatch");
-        bno = got - run + 1;
-        if (bno >= fs->e2fs_bpg)
-                panic("ext2_clusteralloc: allocated out of group");
-
-        for (i = 0; i < len; i++)
-                setbit(bbp, (daddr_t)bno + i);
-
-        bdwrite(bp);
-
-        return (phy_blk(cg, fs) + bno);
-
-fail_lock:
-        EXT2_LOCK(ump);
-        brelse(bp);
-        return (0);
-}
-
 /*
  * Allocate an inode in the file system.
  * 
@@ -1295,10 +1223,6 @@
                         runlen = 0;
                         continue;
                 }
-		if (bbp[loc] == (char)0xff) {
-			runlen = 0;
-			continue;
-		}
 
                 /* Start of a run, find the number of high clear bits. */
                 if (runlen == 0) {
@@ -1313,7 +1237,7 @@
                          * Finish the current run. If it isn't long
                          * enough, start a new one.
                          */
-                        bit = fls(bbp[loc]) - 1;
+                        bit = ffs(bbp[loc]) - 1;
                         runlen += bit;
                         if (runlen >= 8) {
                                 bno = runstart;
@@ -1339,12 +1263,12 @@
         }
 #endif /* 0 */
 
-	bno = ext2_mapsearch(fs, bbp, bpref);
-	if (bno < 0){
-		brelse(bp);
-		EXT2_LOCK(ump);
-		return (0);
-	}
+        bno = ext2_mapsearch(fs, bbp, bpref);
+        if (bno < 0){
+                brelse(bp);
+                EXT2_LOCK(ump);
+                return (0);
+        }
 gotit:
 #ifdef DIAGNOSTIC
 	if (isset(bbp, bno)) {
@@ -1363,6 +1287,83 @@
 	return (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bno);
 }
 
+#ifdef FANCY_REALLOC
+static daddr_t
+ext2_clusteralloc(struct inode *ip, int cg, daddr_t bpref, int len)
+{
+        struct m_ext2fs *fs;
+        struct ext2mount *ump;
+        struct buf *bp;
+        int error, i, got, run;
+        char *bbp;
+        daddr_t bno;
+
+        fs = ip->i_e2fs;
+        ump = ip->i_ump;
+
+        /*
+         * TODO: we need to define a new member in m_ext2fs structure
+         * to save max cluster. But for simplicity, we assume that the
+         * max cluster is equal to the number of blocks per group.
+         */
+        if (fs->e2fs_gd[cg].ext2bgd_nbfree < len)
+                return (0);
+
+        EXT2_UNLOCK(ump);
+        error = bread(ip->i_devvp,
+            fsbtodb(fs, fs->e2fs_gd[cg].ext2bgd_b_bitmap),
+            (int)fs->e2fs_bsize, NOCRED, &bp);
+        if (error)
+                goto fail_lock;
+
+        bbp = (char *)bp->b_data;
+        bp->b_xflags |= BX_BKGRDWRITE;
+
+        /*
+         * TODO: check to see if a cluster of the needed size is
+         * available in this cg.
+         */
+
+        if (dtog(fs, bpref) != cg)
+                bpref = 0;
+        else
+                bpref = dtogd(fs, bpref);
+
+        for (run = 0, got = bpref; got < fs->e2fs_bpg; got++) {
+                if (!isclr(bbp, got))
+                        run = 0;
+                else {
+                        run++;
+                        if (run == len)
+                                break;
+                }
+        }
+
+        if (got >= fs->e2fs_bpg)
+                goto fail_lock;
+        /*
+         * Allocate the cluster that we have found.
+         */
+        for (i = 1; i <= len; i++)
+                if (!isclr(bbp, got - run + i))
+                        panic("ext2_clusteralloc: map mismatch");
+        bno = got - run + 1;
+        if (bno >= fs->e2fs_bpg)
+                panic("ext2_clusteralloc: allocated out of group");
+
+        for (i = 0; i < len; i++)
+                setbit(bbp, (daddr_t)bno + i);
+
+        bdwrite(bp);
+        return (phy_blk(cg, fs) + bno);
+
+fail_lock:
+        EXT2_LOCK(ump);
+        brelse(bp);
+        return (0);
+}
+#endif /* FANCY_REALLOC */
+
 /*
  * Determine whether an inode can be allocated.
  *



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