]> git.hungrycats.org Git - linux/commitdiff
[PATCH] POSIX timers interface long/int cleanup
authorAndrew Morton <akpm@digeo.com>
Fri, 28 Mar 2003 11:18:11 +0000 (03:18 -0800)
committerDave Jones <davej@tetrachloride.(none)>
Fri, 28 Mar 2003 11:18:11 +0000 (03:18 -0800)
From: Eric Piel <Eric.Piel@Bull.Net>

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
lib/idr.c

index 4995cb68a0fa5d5260a1482dcf6408c1fccca22b..69652da724d1870b03d5bcf79043ef917abb2707 100644 (file)
 
 #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<<IDR_BITS];
+       unsigned long            bitmap;        /* A zero bit means "space here" */
+       struct idr_layer        *ary[1<<IDR_BITS];
+       int                      count;         /* When zero, we can release it */
 };
 
 struct idr {
        struct idr_layer *top;
-       int               layers;
-       long              count;
        struct idr_layer *id_free;
-       int               id_free_cnt;
-       spinlock_t        lock;
+       long              count;
+       int               layers;
+       int               id_free_cnt;
+       spinlock_t        lock;
 };
 
 /*
index 5e2c8f29da46d01cfb46b8f31f1c62e938d2b495..ca4b969e60097244b213fc23cea507b2bebda80e 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get);
 
 static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
 {
-       long n, v = 0;
+       int n, v = 0;
        struct idr_layer *p;
        struct idr_layer **pa[MAX_LEVEL];
        struct idr_layer ***paa = &pa[0];
@@ -211,7 +211,7 @@ static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
 
 int idr_get_new(struct idr *idp, void *ptr)
 {
-       long v;
+       int v;
        
        if (idp->id_free_cnt < idp->layers + 1) 
                return (-1);