Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/ufs {ffs_nodealloccg, ext2fs_nodealloccg, ext2fs_mapsearch...



details:   https://anonhg.NetBSD.org/src/rev/9e2ede593467
branches:  trunk
changeset: 762938:9e2ede593467
user:      rmind <rmind%NetBSD.org@localhost>
date:      Sun Mar 06 04:46:26 2011 +0000

description:
{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).

diffstat:

 sys/ufs/ext2fs/ext2fs_alloc.c |  32 ++++++++++++--------------------
 sys/ufs/ffs/ffs_alloc.c       |  20 ++++++++------------
 2 files changed, 20 insertions(+), 32 deletions(-)

diffs (111 lines):

diff -r bc88ba118e60 -r 9e2ede593467 sys/ufs/ext2fs/ext2fs_alloc.c
--- a/sys/ufs/ext2fs/ext2fs_alloc.c     Sun Mar 06 04:41:58 2011 +0000
+++ b/sys/ufs/ext2fs/ext2fs_alloc.c     Sun Mar 06 04:46:26 2011 +0000
@@ -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);
+       map = bbp[i] ^ 0xff;
+       if (map == 0) {
+               printf("fs = %s\n", fs->e2fs_fsmnt);
+               panic("ext2fs_mapsearch: block not in map");
        }
-       printf("fs = %s\n", fs->e2fs_fsmnt);
-       panic("ext2fs_mapsearch: block not in map");
-       /* NOTREACHED */
+       return i * NBBY + ffs(map) - 1;
 }
 
 /*
diff -r bc88ba118e60 -r 9e2ede593467 sys/ufs/ffs/ffs_alloc.c
--- a/sys/ufs/ffs/ffs_alloc.c   Sun Mar 06 04:41:58 2011 +0000
+++ b/sys/ufs/ffs/ffs_alloc.c   Sun Mar 06 04:46:26 2011 +0000
@@ -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);



Home | Main Index | Thread Index | Old Index