mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
[XFS] Use the generic bitops rather than implementing them ourselves.
This keeps xfs_lowbit64 as it was since there aren't good generic helpers there ... Patch inspired by Andi Kleen. SGI-PV: 981498 SGI-Modid: xfs-linux-melb:xfs-kern:31472a Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net> Signed-off-by: Donald Douwsma <donaldd@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
parent
10fec20ef5
commit
79071eb0b2
3 changed files with 38 additions and 120 deletions
103
fs/xfs/xfs_bit.c
103
fs/xfs/xfs_bit.c
|
@ -25,109 +25,6 @@
|
||||||
* XFS bit manipulation routines, used in non-realtime code.
|
* XFS bit manipulation routines, used in non-realtime code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef HAVE_ARCH_HIGHBIT
|
|
||||||
/*
|
|
||||||
* Index of high bit number in byte, -1 for none set, 0..7 otherwise.
|
|
||||||
*/
|
|
||||||
static const char xfs_highbit[256] = {
|
|
||||||
-1, 0, 1, 1, 2, 2, 2, 2, /* 00 .. 07 */
|
|
||||||
3, 3, 3, 3, 3, 3, 3, 3, /* 08 .. 0f */
|
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, /* 10 .. 17 */
|
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, /* 18 .. 1f */
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, /* 20 .. 27 */
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, /* 28 .. 2f */
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, /* 30 .. 37 */
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, /* 38 .. 3f */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 40 .. 47 */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 48 .. 4f */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 50 .. 57 */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 58 .. 5f */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 60 .. 67 */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 68 .. 6f */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 70 .. 77 */
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, /* 78 .. 7f */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* 80 .. 87 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* 88 .. 8f */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* 90 .. 97 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* 98 .. 9f */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* a0 .. a7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* a8 .. af */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* b0 .. b7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* b8 .. bf */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* c0 .. c7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* c8 .. cf */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* d0 .. d7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* d8 .. df */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* e0 .. e7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* e8 .. ef */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* f0 .. f7 */
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, /* f8 .. ff */
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set.
|
|
||||||
*/
|
|
||||||
inline int
|
|
||||||
xfs_highbit32(
|
|
||||||
__uint32_t v)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_ARCH_HIGHBIT
|
|
||||||
return highbit32(v);
|
|
||||||
#else
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (v & 0xffff0000)
|
|
||||||
if (v & 0xff000000)
|
|
||||||
i = 24;
|
|
||||||
else
|
|
||||||
i = 16;
|
|
||||||
else if (v & 0x0000ffff)
|
|
||||||
if (v & 0x0000ff00)
|
|
||||||
i = 8;
|
|
||||||
else
|
|
||||||
i = 0;
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
return i + xfs_highbit[(v >> i) & 0xff];
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xfs_lowbit64: get low bit set out of 64-bit argument, -1 if none set.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
xfs_lowbit64(
|
|
||||||
__uint64_t v)
|
|
||||||
{
|
|
||||||
__uint32_t w = (__uint32_t)v;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
if (w) { /* lower bits */
|
|
||||||
n = ffs(w);
|
|
||||||
} else { /* upper bits */
|
|
||||||
w = (__uint32_t)(v >> 32);
|
|
||||||
if (w && (n = ffs(w)))
|
|
||||||
n += 32;
|
|
||||||
}
|
|
||||||
return n - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* xfs_highbit64: get high bit set out of 64-bit argument, -1 if none set.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
xfs_highbit64(
|
|
||||||
__uint64_t v)
|
|
||||||
{
|
|
||||||
__uint32_t h = (__uint32_t)(v >> 32);
|
|
||||||
|
|
||||||
if (h)
|
|
||||||
return xfs_highbit32(h) + 32;
|
|
||||||
return xfs_highbit32((__uint32_t)v);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return whether bitmap is empty.
|
* Return whether bitmap is empty.
|
||||||
* Size is number of words in the bitmap, which is padded to word boundary
|
* Size is number of words in the bitmap, which is padded to word boundary
|
||||||
|
|
|
@ -47,13 +47,39 @@ static inline __uint64_t xfs_mask64lo(int n)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get high bit set out of 32-bit argument, -1 if none set */
|
/* Get high bit set out of 32-bit argument, -1 if none set */
|
||||||
extern int xfs_highbit32(__uint32_t v);
|
static inline int xfs_highbit32(__uint32_t v)
|
||||||
|
{
|
||||||
/* Get low bit set out of 64-bit argument, -1 if none set */
|
return fls(v) - 1;
|
||||||
extern int xfs_lowbit64(__uint64_t v);
|
}
|
||||||
|
|
||||||
/* Get high bit set out of 64-bit argument, -1 if none set */
|
/* Get high bit set out of 64-bit argument, -1 if none set */
|
||||||
extern int xfs_highbit64(__uint64_t);
|
static inline int xfs_highbit64(__uint64_t v)
|
||||||
|
{
|
||||||
|
return fls64(v) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get low bit set out of 32-bit argument, -1 if none set */
|
||||||
|
static inline int xfs_lowbit32(__uint32_t v)
|
||||||
|
{
|
||||||
|
unsigned long t = v;
|
||||||
|
return (v) ? find_first_bit(&t, 32) : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get low bit set out of 64-bit argument, -1 if none set */
|
||||||
|
static inline int xfs_lowbit64(__uint64_t v)
|
||||||
|
{
|
||||||
|
__uint32_t w = (__uint32_t)v;
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
if (w) { /* lower bits */
|
||||||
|
n = ffs(w);
|
||||||
|
} else { /* upper bits */
|
||||||
|
w = (__uint32_t)(v >> 32);
|
||||||
|
if (w && (n = ffs(w)))
|
||||||
|
n += 32;
|
||||||
|
}
|
||||||
|
return n - 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return whether bitmap is empty (1 == empty) */
|
/* Return whether bitmap is empty (1 == empty) */
|
||||||
extern int xfs_bitmap_empty(uint *map, uint size);
|
extern int xfs_bitmap_empty(uint *map, uint size);
|
||||||
|
|
|
@ -73,18 +73,6 @@ STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int,
|
||||||
* Internal functions.
|
* Internal functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* xfs_lowbit32: get low bit set out of 32-bit argument, -1 if none set.
|
|
||||||
*/
|
|
||||||
STATIC int
|
|
||||||
xfs_lowbit32(
|
|
||||||
__uint32_t v)
|
|
||||||
{
|
|
||||||
if (v)
|
|
||||||
return ffs(v) - 1;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate space to the bitmap or summary file, and zero it, for growfs.
|
* Allocate space to the bitmap or summary file, and zero it, for growfs.
|
||||||
*/
|
*/
|
||||||
|
@ -450,6 +438,7 @@ xfs_rtallocate_extent_near(
|
||||||
}
|
}
|
||||||
bbno = XFS_BITTOBLOCK(mp, bno);
|
bbno = XFS_BITTOBLOCK(mp, bno);
|
||||||
i = 0;
|
i = 0;
|
||||||
|
ASSERT(minlen != 0);
|
||||||
log2len = xfs_highbit32(minlen);
|
log2len = xfs_highbit32(minlen);
|
||||||
/*
|
/*
|
||||||
* Loop over all bitmap blocks (bbno + i is current block).
|
* Loop over all bitmap blocks (bbno + i is current block).
|
||||||
|
@ -618,6 +607,8 @@ xfs_rtallocate_extent_size(
|
||||||
xfs_suminfo_t sum; /* summary information for extents */
|
xfs_suminfo_t sum; /* summary information for extents */
|
||||||
|
|
||||||
ASSERT(minlen % prod == 0 && maxlen % prod == 0);
|
ASSERT(minlen % prod == 0 && maxlen % prod == 0);
|
||||||
|
ASSERT(maxlen != 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop over all the levels starting with maxlen.
|
* Loop over all the levels starting with maxlen.
|
||||||
* At each level, look at all the bitmap blocks, to see if there
|
* At each level, look at all the bitmap blocks, to see if there
|
||||||
|
@ -675,6 +666,9 @@ xfs_rtallocate_extent_size(
|
||||||
*rtblock = NULLRTBLOCK;
|
*rtblock = NULLRTBLOCK;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
ASSERT(minlen != 0);
|
||||||
|
ASSERT(maxlen != 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop over sizes, from maxlen down to minlen.
|
* Loop over sizes, from maxlen down to minlen.
|
||||||
* This time, when we do the allocations, allow smaller ones
|
* This time, when we do the allocations, allow smaller ones
|
||||||
|
@ -1961,6 +1955,7 @@ xfs_growfs_rt(
|
||||||
nsbp->sb_blocksize * nsbp->sb_rextsize);
|
nsbp->sb_blocksize * nsbp->sb_rextsize);
|
||||||
nsbp->sb_rextents = nsbp->sb_rblocks;
|
nsbp->sb_rextents = nsbp->sb_rblocks;
|
||||||
do_div(nsbp->sb_rextents, nsbp->sb_rextsize);
|
do_div(nsbp->sb_rextents, nsbp->sb_rextsize);
|
||||||
|
ASSERT(nsbp->sb_rextents != 0);
|
||||||
nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
|
nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
|
||||||
nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
|
nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
|
||||||
nrsumsize =
|
nrsumsize =
|
||||||
|
|
Loading…
Reference in a new issue