static int idr_get_new_above_int(struct idr *idp, void *ptr, int starting_id){	struct idr_layer *p, *new;	int layers, v, id;		id = starting_id;build_up:	p = idp->top;	layers = idp->layers;	if (unlikely(!p)) {		if (!(p = alloc_layer(idp)))			return -1;		layers = 1;	}	/*	 * Add a new layer to the top of the tree if the requested	 * id is larger than the currently allocated space.	 */	while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {		layers++;		if (!p->count)			continue;		if (!(new = alloc_layer(idp))) {			/*			 * The allocation failed.  If we built part of			 * the structure tear it down.			 */			for (new = p; p && p != idp->top; new = p) {				p = p->ary[0];				new->ary[0] = NULL;				new->bitmap = new->count = 0;				free_layer(idp, new);			}			return -1;		}		new->ary[0] = p;		new->count = 1;		if (p->bitmap == IDR_FULL)			__set_bit(0, &new->bitmap);		p = new;	}	idp->top = p;	idp->layers = layers;	v = sub_alloc(idp, ptr, &id);	if (v == -2)		goto build_up;	return(v);}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/e15ae2dd3e436552293e122a5163019e7a0fa450/idr.c/clean/lib/idr.c