diff options
Diffstat (limited to 'lib/idr.c')
| -rw-r--r-- | lib/idr.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/idr.c b/lib/idr.c index 5acf9bb1096..ed055b297c8 100644 --- a/lib/idr.c +++ b/lib/idr.c @@ -767,8 +767,8 @@ EXPORT_SYMBOL(ida_pre_get);   * @starting_id: id to start search at   * @p_id:	pointer to the allocated handle   * - * Allocate new ID above or equal to @ida.  It should be called with - * any required locks. + * Allocate new ID above or equal to @starting_id.  It should be called + * with any required locks.   *   * If memory is required, it will return %-EAGAIN, you should unlock   * and go back to the ida_pre_get() call.  If the ida is full, it will @@ -944,6 +944,7 @@ int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end,  {  	int ret, id;  	unsigned int max; +	unsigned long flags;  	BUG_ON((int)start < 0);  	BUG_ON((int)end < 0); @@ -959,7 +960,7 @@ again:  	if (!ida_pre_get(ida, gfp_mask))  		return -ENOMEM; -	spin_lock(&simple_ida_lock); +	spin_lock_irqsave(&simple_ida_lock, flags);  	ret = ida_get_new_above(ida, start, &id);  	if (!ret) {  		if (id > max) { @@ -969,7 +970,7 @@ again:  			ret = id;  		}  	} -	spin_unlock(&simple_ida_lock); +	spin_unlock_irqrestore(&simple_ida_lock, flags);  	if (unlikely(ret == -EAGAIN))  		goto again; @@ -985,10 +986,12 @@ EXPORT_SYMBOL(ida_simple_get);   */  void ida_simple_remove(struct ida *ida, unsigned int id)  { +	unsigned long flags; +  	BUG_ON((int)id < 0); -	spin_lock(&simple_ida_lock); +	spin_lock_irqsave(&simple_ida_lock, flags);  	ida_remove(ida, id); -	spin_unlock(&simple_ida_lock); +	spin_unlock_irqrestore(&simple_ida_lock, flags);  }  EXPORT_SYMBOL(ida_simple_remove);  |