aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNadia Derbey <Nadia.Derbey@bull.net>2008-07-25 04:47:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-07-25 13:53:41 -0400
commit944ca05c7b4972f2ebf37262e0f4933d178ad6db (patch)
tree5fb7558b8247bb56b7c1781808e7eaf08e8fff4e
parentf098ad655f4dd8e3da98ffbeda9cedcc4459c01a (diff)
idr: error checking factorization
Do some code factorization in the return code analysis. Signed-off-by: Nadia Derbey <Nadia.Derbey@bull.net> Cc: "Paul E. McKenney" <paulmck@us.ibm.com> Cc: Manfred Spraul <manfred@colorfullife.com> Cc: Jim Houston <jim.houston@comcast.net> Cc: Pierre Peiffer <peifferp@gmail.com> Acked-by: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/idr.h6
-rw-r--r--lib/idr.c30
2 files changed, 15 insertions, 21 deletions
diff --git a/include/linux/idr.h b/include/linux/idr.h
index 1af61d23be36..762c3f2c631d 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -73,6 +73,12 @@ struct idr {
73} 73}
74#define DEFINE_IDR(name) struct idr name = IDR_INIT(name) 74#define DEFINE_IDR(name) struct idr name = IDR_INIT(name)
75 75
76/* Actions to be taken after a call to _idr_sub_alloc */
77#define IDR_NEED_TO_GROW -2
78#define IDR_NOMORE_SPACE -3
79
80#define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC)
81
76/* 82/*
77 * This is what we export. 83 * This is what we export.
78 */ 84 */
diff --git a/lib/idr.c b/lib/idr.c
index 9d905b131ecb..80ba06f29d36 100644
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -143,7 +143,7 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
143 /* if already at the top layer, we need to grow */ 143 /* if already at the top layer, we need to grow */
144 if (!(p = pa[l])) { 144 if (!(p = pa[l])) {
145 *starting_id = id; 145 *starting_id = id;
146 return -2; 146 return IDR_NEED_TO_GROW;
147 } 147 }
148 148
149 /* If we need to go up one layer, continue the 149 /* If we need to go up one layer, continue the
@@ -160,7 +160,7 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
160 id = ((id >> sh) ^ n ^ m) << sh; 160 id = ((id >> sh) ^ n ^ m) << sh;
161 } 161 }
162 if ((id >= MAX_ID_BIT) || (id < 0)) 162 if ((id >= MAX_ID_BIT) || (id < 0))
163 return -3; 163 return IDR_NOMORE_SPACE;
164 if (l == 0) 164 if (l == 0)
165 break; 165 break;
166 /* 166 /*
@@ -229,7 +229,7 @@ build_up:
229 idp->top = p; 229 idp->top = p;
230 idp->layers = layers; 230 idp->layers = layers;
231 v = sub_alloc(idp, &id, pa); 231 v = sub_alloc(idp, &id, pa);
232 if (v == -2) 232 if (v == IDR_NEED_TO_GROW)
233 goto build_up; 233 goto build_up;
234 return(v); 234 return(v);
235} 235}
@@ -278,12 +278,8 @@ int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id)
278 * This is a cheap hack until the IDR code can be fixed to 278 * This is a cheap hack until the IDR code can be fixed to
279 * return proper error values. 279 * return proper error values.
280 */ 280 */
281 if (rv < 0) { 281 if (rv < 0)
282 if (rv == -1) 282 return _idr_rc_to_errno(rv);
283 return -EAGAIN;
284 else /* Will be -3 */
285 return -ENOSPC;
286 }
287 *id = rv; 283 *id = rv;
288 return 0; 284 return 0;
289} 285}
@@ -313,12 +309,8 @@ int idr_get_new(struct idr *idp, void *ptr, int *id)
313 * This is a cheap hack until the IDR code can be fixed to 309 * This is a cheap hack until the IDR code can be fixed to
314 * return proper error values. 310 * return proper error values.
315 */ 311 */
316 if (rv < 0) { 312 if (rv < 0)
317 if (rv == -1) 313 return _idr_rc_to_errno(rv);
318 return -EAGAIN;
319 else /* Will be -3 */
320 return -ENOSPC;
321 }
322 *id = rv; 314 *id = rv;
323 return 0; 315 return 0;
324} 316}
@@ -696,12 +688,8 @@ int ida_get_new_above(struct ida *ida, int starting_id, int *p_id)
696 restart: 688 restart:
697 /* get vacant slot */ 689 /* get vacant slot */
698 t = idr_get_empty_slot(&ida->idr, idr_id, pa); 690 t = idr_get_empty_slot(&ida->idr, idr_id, pa);
699 if (t < 0) { 691 if (t < 0)
700 if (t == -1) 692 return _idr_rc_to_errno(t);
701 return -EAGAIN;
702 else /* will be -3 */
703 return -ENOSPC;
704 }
705 693
706 if (t * IDA_BITMAP_BITS >= MAX_ID_BIT) 694 if (t * IDA_BITMAP_BITS >= MAX_ID_BIT)
707 return -ENOSPC; 695 return -ENOSPC;