Module Name: src
Committed By: rmind
Date: Sun Mar 6 04:46:27 UTC 2011
Modified Files:
src/sys/ufs/ext2fs: ext2fs_alloc.c
src/sys/ufs/ffs: ffs_alloc.c
Log Message:
{ffs_nodealloccg,ext2fs_nodealloccg,ext2fs_mapsearch}: use XOR and ffs()
to find free bits in the inode and block bitmaps, instead of the loop.
Obtained from FreeBSD (changes by jhb).
To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/ufs/ext2fs/ext2fs_alloc.c
cvs rdiff -u -r1.125 -r1.126 src/sys/ufs/ffs/ffs_alloc.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/ufs/ext2fs/ext2fs_alloc.c
diff -u src/sys/ufs/ext2fs/ext2fs_alloc.c:1.41 src/sys/ufs/ext2fs/ext2fs_alloc.c:1.42
--- src/sys/ufs/ext2fs/ext2fs_alloc.c:1.41 Mon Oct 19 18:41:17 2009
+++ src/sys/ufs/ext2fs/ext2fs_alloc.c Sun Mar 6 04:46:26 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs_alloc.c,v 1.41 2009/10/19 18:41:17 bouyer Exp $ */
+/* $NetBSD: ext2fs_alloc.c,v 1.42 2011/03/06 04:46:26 rmind Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.41 2009/10/19 18:41:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.42 2011/03/06 04:46:26 rmind Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -470,16 +470,12 @@
}
}
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);
fs->e2fs.e2fs_ficount--;
@@ -595,7 +591,6 @@
static daddr_t
ext2fs_mapsearch(struct m_ext2fs *fs, char *bbp, daddr_t bpref)
{
- daddr_t bno;
int start, len, loc, i, map;
/*
@@ -620,15 +615,12 @@
}
}
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;
}
/*
Index: src/sys/ufs/ffs/ffs_alloc.c
diff -u src/sys/ufs/ffs/ffs_alloc.c:1.125 src/sys/ufs/ffs/ffs_alloc.c:1.126
--- src/sys/ufs/ffs/ffs_alloc.c:1.125 Sun Feb 21 13:55:58 2010
+++ src/sys/ufs/ffs/ffs_alloc.c Sun Mar 6 04:46:26 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ffs_alloc.c,v 1.125 2010/02/21 13:55:58 mlelstv Exp $ */
+/* $NetBSD: ffs_alloc.c,v 1.126 2011/03/06 04:46:26 rmind Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.125 2010/02/21 13:55:58 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_alloc.c,v 1.126 2011/03/06 04:46:26 rmind Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ffs.h"
@@ -1330,17 +1330,13 @@
}
}
i = start + len - loc;
- map = inosused[i];
- ipref = i * NBBY;
- for (i = 1; i < (1 << NBBY); i <<= 1, ipref++) {
- if ((map & i) == 0) {
- cgp->cg_irotor = ufs_rw32(ipref, needswap);
- goto gotit;
- }
+ map = inosused[i] ^ 0xff;
+ if (map == 0) {
+ printf("fs = %s\n", fs->fs_fsmnt);
+ panic("ffs_nodealloccg: block not in map");
}
- printf("fs = %s\n", fs->fs_fsmnt);
- panic("ffs_nodealloccg: block not in map");
- /* NOTREACHED */
+ ipref = i * NBBY + ffs(map) - 1;
+ cgp->cg_irotor = ufs_rw32(ipref, needswap);
gotit:
UFS_WAPBL_REGISTER_INODE(ip->i_ump->um_mountp, cg * fs->fs_ipg + ipref,
mode);