slub: fix/clean free_debug_processing return paths
[linux-2.6-block.git] / mm / slub.c
index a03e0ae71643d3ec3d4397481f7599bbfe81fa1d..744d29b43bf6a2082b6af2397544327e026cea0c 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1053,24 +1053,25 @@ static noinline int free_debug_processing(
        void *object = head;
        int cnt = 0;
        unsigned long uninitialized_var(flags);
+       int ret = 0;
 
        spin_lock_irqsave(&n->list_lock, flags);
        slab_lock(page);
 
        if (!check_slab(s, page))
-               goto fail;
+               goto out;
 
 next_object:
        cnt++;
 
        if (!check_valid_pointer(s, page, object)) {
                slab_err(s, page, "Invalid object pointer 0x%p", object);
-               goto fail;
+               goto out;
        }
 
        if (on_freelist(s, page, object)) {
                object_err(s, page, object, "Object already free");
-               goto fail;
+               goto out;
        }
 
        if (!check_object(s, page, object, SLUB_RED_ACTIVE))
@@ -1087,7 +1088,7 @@ next_object:
                } else
                        object_err(s, page, object,
                                        "page slab pointer corrupt.");
-               goto fail;
+               goto out;
        }
 
        if (s->flags & SLAB_STORE_USER)
@@ -1101,6 +1102,8 @@ next_object:
                object = get_freepointer(s, object);
                goto next_object;
        }
+       ret = 1;
+
 out:
        if (cnt != bulk_cnt)
                slab_err(s, page, "Bulk freelist count(%d) invalid(%d)\n",
@@ -1108,13 +1111,9 @@ out:
 
        slab_unlock(page);
        spin_unlock_irqrestore(&n->list_lock, flags);
-       return 1;
-
-fail:
-       slab_unlock(page);
-       spin_unlock_irqrestore(&n->list_lock, flags);
-       slab_fix(s, "Object at 0x%p not freed", object);
-       return 0;
+       if (!ret)
+               slab_fix(s, "Object at 0x%p not freed", object);
+       return ret;
 }
 
 static int __init setup_slub_debug(char *str)