Commit 12a7558c authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] lib/idr.c 64-bit fixes

Various overflow problems compiling the lib/idr.c code for ppc64
parent a1861dbf
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
/* Leave the possibility of an incomplete final layer */ /* Leave the possibility of an incomplete final layer */
#define MAX_LEVEL (BITS_PER_LONG - RESERVED_ID_BITS + IDR_BITS - 1) / IDR_BITS #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_SHIFT (BITS_PER_LONG - RESERVED_ID_BITS)
#define MAX_ID_BIT (1 << MAX_ID_SHIFT) #define MAX_ID_BIT (1L << MAX_ID_SHIFT)
#define MAX_ID_MASK (MAX_ID_BIT - 1) #define MAX_ID_MASK (MAX_ID_BIT - 1)
/* Number of id_layer structs to leave in free list */ /* Number of id_layer structs to leave in free list */
...@@ -43,7 +43,7 @@ struct idr_layer { ...@@ -43,7 +43,7 @@ struct idr_layer {
struct idr { struct idr {
struct idr_layer *top; struct idr_layer *top;
int layers; int layers;
int count; long count;
struct idr_layer *id_free; struct idr_layer *id_free;
int id_free_cnt; int id_free_cnt;
spinlock_t lock; spinlock_t lock;
......
...@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get); ...@@ -150,7 +150,7 @@ EXPORT_SYMBOL(idr_pre_get);
static inline int sub_alloc(struct idr *idp, int shift, void *ptr) static inline int sub_alloc(struct idr *idp, int shift, void *ptr)
{ {
int n, v = 0; long n, v = 0;
struct idr_layer *p; struct idr_layer *p;
struct idr_layer **pa[MAX_LEVEL]; struct idr_layer **pa[MAX_LEVEL];
struct idr_layer ***paa = &pa[0]; struct idr_layer ***paa = &pa[0];
...@@ -211,7 +211,7 @@ static inline int sub_alloc(struct idr *idp, int shift, void *ptr) ...@@ -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) int idr_get_new(struct idr *idp, void *ptr)
{ {
int v; long v;
if (idp->id_free_cnt < idp->layers + 1) if (idp->id_free_cnt < idp->layers + 1)
return (-1); return (-1);
...@@ -236,7 +236,7 @@ int idr_get_new(struct idr *idp, void *ptr) ...@@ -236,7 +236,7 @@ int idr_get_new(struct idr *idp, void *ptr)
idp->count++; idp->count++;
v += (idp->count << MAX_ID_SHIFT); v += (idp->count << MAX_ID_SHIFT);
if ( unlikely( v == -1 )) if ( unlikely( v == -1 ))
v += (1 << MAX_ID_SHIFT); v += (1L << MAX_ID_SHIFT);
} }
return(v); return(v);
} }
...@@ -259,7 +259,7 @@ static inline void sub_remove(struct idr *idp, int shift, int id) ...@@ -259,7 +259,7 @@ static inline void sub_remove(struct idr *idp, int shift, int id)
p = p->ary[n]; p = p->ary[n];
shift -= IDR_BITS; shift -= IDR_BITS;
} }
if ( likely(p)){ if (likely(p != NULL)){
int n = id & IDR_MASK; int n = id & IDR_MASK;
__clear_bit(n, &p->bitmap); __clear_bit(n, &p->bitmap);
p->ary[n] = NULL; p->ary[n] = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment