From: Eric Piel Fixes some long/int confusion on 64-bit machines which was causing failures on ia64 - we end up trying to set bits in the 32-63 range on an int and the kernel locks up. Also cleans up idr.h. George has acked this change. include/linux/idr.h | 38 +++++++++++++++++++++----------------- lib/idr.c | 4 ++-- 2 files changed, 23 insertions(+), 19 deletions(-) diff -puN include/linux/idr.h~posix-timers-64-bit-fix include/linux/idr.h --- 25/include/linux/idr.h~posix-timers-64-bit-fix 2003-03-24 09:21:52.000000000 -0800 +++ 25-akpm/include/linux/idr.h 2003-03-24 09:21:52.000000000 -0800 @@ -13,40 +13,44 @@ #define RESERVED_ID_BITS 8 -#if BITS_PER_LONG == 32 -#define IDR_BITS 5 -#define IDR_FULL 0xffffffff +#if BITS_PER_LONG == 32 +# define IDR_BITS 5 +# define IDR_FULL 0xffffffff #elif BITS_PER_LONG == 64 -#define IDR_BITS 6 -#define IDR_FULL 0xffffffffffffffff +# define IDR_BITS 6 +# define IDR_FULL 0xffffffffffffffff #else -#error "BITS_PER_LONG is not 32 or 64" +# error "BITS_PER_LONG is not 32 or 64" #endif #define IDR_MASK ((1 << IDR_BITS)-1) -/* Leave the possibility of an incomplete final layer */ -#define MAX_LEVEL (BITS_PER_LONG - RESERVED_ID_BITS + IDR_BITS - 1) / IDR_BITS -#define MAX_ID_SHIFT (BITS_PER_LONG - RESERVED_ID_BITS) -#define MAX_ID_BIT (1L << MAX_ID_SHIFT) +/* Define the size of the id's */ +#define BITS_PER_INT (sizeof(int)*8) + +#define MAX_ID_SHIFT (BITS_PER_INT - RESERVED_ID_BITS) +#define MAX_ID_BIT (1 << MAX_ID_SHIFT) #define MAX_ID_MASK (MAX_ID_BIT - 1) +/* Leave the possibility of an incomplete final layer */ +#define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS - 1) / IDR_BITS + /* Number of id_layer structs to leave in free list */ #define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL struct idr_layer { - unsigned long bitmap; // A zero bit means "space here" - int count; // When zero, we can release it - struct idr_layer *ary[1<id_free_cnt < idp->layers + 1) return (-1); _