|
@@ -38,14 +38,15 @@ static kmem_cache_t *idr_layer_cache;
|
|
static struct idr_layer *alloc_layer(struct idr *idp)
|
|
static struct idr_layer *alloc_layer(struct idr *idp)
|
|
{
|
|
{
|
|
struct idr_layer *p;
|
|
struct idr_layer *p;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
- spin_lock(&idp->lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&idp->lock, flags);
|
|
if ((p = idp->id_free)) {
|
|
if ((p = idp->id_free)) {
|
|
idp->id_free = p->ary[0];
|
|
idp->id_free = p->ary[0];
|
|
idp->id_free_cnt--;
|
|
idp->id_free_cnt--;
|
|
p->ary[0] = NULL;
|
|
p->ary[0] = NULL;
|
|
}
|
|
}
|
|
- spin_unlock(&idp->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&idp->lock, flags);
|
|
return(p);
|
|
return(p);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -59,12 +60,14 @@ static void __free_layer(struct idr *idp, struct idr_layer *p)
|
|
|
|
|
|
static void free_layer(struct idr *idp, struct idr_layer *p)
|
|
static void free_layer(struct idr *idp, struct idr_layer *p)
|
|
{
|
|
{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Depends on the return element being zeroed.
|
|
* Depends on the return element being zeroed.
|
|
*/
|
|
*/
|
|
- spin_lock(&idp->lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&idp->lock, flags);
|
|
__free_layer(idp, p);
|
|
__free_layer(idp, p);
|
|
- spin_unlock(&idp->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&idp->lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -168,6 +171,7 @@ static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id)
|
|
{
|
|
{
|
|
struct idr_layer *p, *new;
|
|
struct idr_layer *p, *new;
|
|
int layers, v, id;
|
|
int layers, v, id;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
id = starting_id;
|
|
id = starting_id;
|
|
build_up:
|
|
build_up:
|
|
@@ -191,14 +195,14 @@ build_up:
|
|
* The allocation failed. If we built part of
|
|
* The allocation failed. If we built part of
|
|
* the structure tear it down.
|
|
* the structure tear it down.
|
|
*/
|
|
*/
|
|
- spin_lock(&idp->lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&idp->lock, flags);
|
|
for (new = p; p && p != idp->top; new = p) {
|
|
for (new = p; p && p != idp->top; new = p) {
|
|
p = p->ary[0];
|
|
p = p->ary[0];
|
|
new->ary[0] = NULL;
|
|
new->ary[0] = NULL;
|
|
new->bitmap = new->count = 0;
|
|
new->bitmap = new->count = 0;
|
|
__free_layer(idp, new);
|
|
__free_layer(idp, new);
|
|
}
|
|
}
|
|
- spin_unlock(&idp->lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&idp->lock, flags);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
new->ary[0] = p;
|
|
new->ary[0] = p;
|