idr: error checking factorization
Nadia Derbey [Fri, 25 Jul 2008 08:47:59 +0000 (01:47 -0700)]
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>

include/linux/idr.h
lib/idr.c

index 1af61d2..762c3f2 100644 (file)
@@ -73,6 +73,12 @@ struct idr {
 }
 #define DEFINE_IDR(name)       struct idr name = IDR_INIT(name)
 
+/* Actions to be taken after a call to _idr_sub_alloc */
+#define IDR_NEED_TO_GROW -2
+#define IDR_NOMORE_SPACE -3
+
+#define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC)
+
 /*
  * This is what we export.
  */
index 9d905b1..80ba06f 100644 (file)
--- 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)
                        /* if already at the top layer, we need to grow */
                        if (!(p = pa[l])) {
                                *starting_id = id;
-                               return -2;
+                               return IDR_NEED_TO_GROW;
                        }
 
                        /* 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)
                        id = ((id >> sh) ^ n ^ m) << sh;
                }
                if ((id >= MAX_ID_BIT) || (id < 0))
-                       return -3;
+                       return IDR_NOMORE_SPACE;
                if (l == 0)
                        break;
                /*
@@ -229,7 +229,7 @@ build_up:
        idp->top = p;
        idp->layers = layers;
        v = sub_alloc(idp, &id, pa);
-       if (v == -2)
+       if (v == IDR_NEED_TO_GROW)
                goto build_up;
        return(v);
 }
@@ -278,12 +278,8 @@ int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id)
         * This is a cheap hack until the IDR code can be fixed to
         * return proper error values.
         */
-       if (rv < 0) {
-               if (rv == -1)
-                       return -EAGAIN;
-               else /* Will be -3 */
-                       return -ENOSPC;
-       }
+       if (rv < 0)
+               return _idr_rc_to_errno(rv);
        *id = rv;
        return 0;
 }
@@ -313,12 +309,8 @@ int idr_get_new(struct idr *idp, void *ptr, int *id)
         * This is a cheap hack until the IDR code can be fixed to
         * return proper error values.
         */
-       if (rv < 0) {
-               if (rv == -1)
-                       return -EAGAIN;
-               else /* Will be -3 */
-                       return -ENOSPC;
-       }
+       if (rv < 0)
+               return _idr_rc_to_errno(rv);
        *id = rv;
        return 0;
 }
@@ -696,12 +688,8 @@ int ida_get_new_above(struct ida *ida, int starting_id, int *p_id)
  restart:
        /* get vacant slot */
        t = idr_get_empty_slot(&ida->idr, idr_id, pa);
-       if (t < 0) {
-               if (t == -1)
-                       return -EAGAIN;
-               else /* will be -3 */
-                       return -ENOSPC;
-       }
+       if (t < 0)
+               return _idr_rc_to_errno(t);
 
        if (t * IDA_BITMAP_BITS >= MAX_ID_BIT)
                return -ENOSPC;