diff options
| -rw-r--r-- | lib/idr.c | 16 |
1 files changed, 10 insertions, 6 deletions
| @@ -38,14 +38,15 @@ static kmem_cache_t *idr_layer_cache; | |||
| 38 | static struct idr_layer *alloc_layer(struct idr *idp) | 38 | static struct idr_layer *alloc_layer(struct idr *idp) |
| 39 | { | 39 | { |
| 40 | struct idr_layer *p; | 40 | struct idr_layer *p; |
| 41 | unsigned long flags; | ||
| 41 | 42 | ||
| 42 | spin_lock(&idp->lock); | 43 | spin_lock_irqsave(&idp->lock, flags); |
| 43 | if ((p = idp->id_free)) { | 44 | if ((p = idp->id_free)) { |
| 44 | idp->id_free = p->ary[0]; | 45 | idp->id_free = p->ary[0]; |
| 45 | idp->id_free_cnt--; | 46 | idp->id_free_cnt--; |
| 46 | p->ary[0] = NULL; | 47 | p->ary[0] = NULL; |
| 47 | } | 48 | } |
| 48 | spin_unlock(&idp->lock); | 49 | spin_unlock_irqrestore(&idp->lock, flags); |
| 49 | return(p); | 50 | return(p); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| @@ -59,12 +60,14 @@ static void __free_layer(struct idr *idp, struct idr_layer *p) | |||
| 59 | 60 | ||
| 60 | static void free_layer(struct idr *idp, struct idr_layer *p) | 61 | static void free_layer(struct idr *idp, struct idr_layer *p) |
| 61 | { | 62 | { |
| 63 | unsigned long flags; | ||
| 64 | |||
| 62 | /* | 65 | /* |
| 63 | * Depends on the return element being zeroed. | 66 | * Depends on the return element being zeroed. |
| 64 | */ | 67 | */ |
| 65 | spin_lock(&idp->lock); | 68 | spin_lock_irqsave(&idp->lock, flags); |
| 66 | __free_layer(idp, p); | 69 | __free_layer(idp, p); |
| 67 | spin_unlock(&idp->lock); | 70 | spin_unlock_irqrestore(&idp->lock, flags); |
| 68 | } | 71 | } |
| 69 | 72 | ||
| 70 | /** | 73 | /** |
| @@ -168,6 +171,7 @@ static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id) | |||
| 168 | { | 171 | { |
| 169 | struct idr_layer *p, *new; | 172 | struct idr_layer *p, *new; |
| 170 | int layers, v, id; | 173 | int layers, v, id; |
| 174 | unsigned long flags; | ||
| 171 | 175 | ||
| 172 | id = starting_id; | 176 | id = starting_id; |
| 173 | build_up: | 177 | build_up: |
| @@ -191,14 +195,14 @@ build_up: | |||
| 191 | * The allocation failed. If we built part of | 195 | * The allocation failed. If we built part of |
| 192 | * the structure tear it down. | 196 | * the structure tear it down. |
| 193 | */ | 197 | */ |
| 194 | spin_lock(&idp->lock); | 198 | spin_lock_irqsave(&idp->lock, flags); |
| 195 | for (new = p; p && p != idp->top; new = p) { | 199 | for (new = p; p && p != idp->top; new = p) { |
| 196 | p = p->ary[0]; | 200 | p = p->ary[0]; |
| 197 | new->ary[0] = NULL; | 201 | new->ary[0] = NULL; |
| 198 | new->bitmap = new->count = 0; | 202 | new->bitmap = new->count = 0; |
| 199 | __free_layer(idp, new); | 203 | __free_layer(idp, new); |
| 200 | } | 204 | } |
| 201 | spin_unlock(&idp->lock); | 205 | spin_unlock_irqrestore(&idp->lock, flags); |
| 202 | return -1; | 206 | return -1; |
| 203 | } | 207 | } |
| 204 | new->ary[0] = p; | 208 | new->ary[0] = p; |
