svn commit: r219012 - head/sys/fs/ext2fs

John Baldwin jhb at FreeBSD.org
Thu Feb 24 22:11:37 UTC 2011


Author: jhb
Date: Thu Feb 24 22:11:36 2011
New Revision: 219012
URL: http://svn.freebsd.org/changeset/base/219012

Log:
  Use ffs() to locate free bits in the inode and block bitmaps rather than
  loops with bit shifts.

Modified:
  head/sys/fs/ext2fs/ext2_alloc.c

Modified: head/sys/fs/ext2fs/ext2_alloc.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_alloc.c	Thu Feb 24 21:45:58 2011	(r219011)
+++ head/sys/fs/ext2fs/ext2_alloc.c	Thu Feb 24 22:11:36 2011	(r219012)
@@ -815,16 +815,12 @@ ext2_nodealloccg(struct inode *ip, int c
 		}
 	} 
 	i = start + len - loc;
-	map = ibp[i];
-	ipref = i * NBBY;
-	for (i = 1; i < (1 << NBBY); i <<= 1, ipref++) {
-		if ((map & i) == 0) {
-			goto gotit;
-		}
+	map = ibp[i] ^ 0xff;
+	if (map == 0) {
+		printf("fs = %s\n", fs->e2fs_fsmnt);
+		panic("ext2fs_nodealloccg: block not in map");
 	}
-	printf("fs = %s\n", fs->e2fs_fsmnt);
-	panic("ext2fs_nodealloccg: block not in map");
-	/* NOTREACHED */
+	ipref = i * NBBY + ffs(map) - 1;
 gotit:
 	setbit(ibp, ipref);
 	EXT2_LOCK(ump);
@@ -952,7 +948,6 @@ ext2_vfree(pvp, ino, mode)
 static daddr_t
 ext2_mapsearch(struct m_ext2fs *fs, char *bbp, daddr_t bpref)
 {
-	daddr_t bno;
 	int start, len, loc, i, map;
 
 	/*
@@ -977,15 +972,12 @@ ext2_mapsearch(struct m_ext2fs *fs, char
 		}
 	}
 	i = start + len - loc;
-	map = bbp[i];
-	bno = i * NBBY;
-	for (i = 1; i < (1 << NBBY); i <<= 1, bno++) {
-		if ((map & i) == 0)
-			return (bno);
-	}
-	printf("fs = %s\n", fs->e2fs_fsmnt);
-	panic("ext2fs_mapsearch: block not in map");
-	/* NOTREACHED */
+	map = bbp[i] ^ 0xff;
+	if (map == 0) {
+		printf("fs = %s\n", fs->e2fs_fsmnt);
+		panic("ext2fs_mapsearch: block not in map");
+	}
+	return (i * NBBY + ffs(map) - 1);
 }
 
 /*


More information about the svn-src-all mailing list