lib/dma-debug.c: fix __hash_bucket_find()
authorMing Lei <[email protected]>
Fri, 19 Oct 2012 20:57:01 +0000 (13:57 -0700)
committerLinus Torvalds <[email protected]>
Fri, 19 Oct 2012 21:07:48 +0000 (14:07 -0700)
If there is only one match, the unique matched entry should be returned.

Without the fix, the upcoming dma debug interfaces ("dma-debug: new
interfaces to debug dma mapping errors") can't work reliably because
only device and dma_addr are passed to dma_mapping_error().

Signed-off-by: Ming Lei <[email protected]>
Reported-by: Wu Fengguang <[email protected]>
Cc: Joerg Roedel <[email protected]>
Tested-by: Shuah Khan <[email protected]>
Cc: Paul Gortmaker <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
lib/dma-debug.c

index b9087bff008be9ef4b4eb2ebb7acea898b69be8d..d84beb994f36f1c0b6d7e82fa02fc558a13f88c9 100644 (file)
@@ -264,7 +264,7 @@ static struct dma_debug_entry *__hash_bucket_find(struct hash_bucket *bucket,
                                                  match_fn match)
 {
        struct dma_debug_entry *entry, *ret = NULL;
-       int matches = 0, match_lvl, last_lvl = 0;
+       int matches = 0, match_lvl, last_lvl = -1;
 
        list_for_each_entry(entry, &bucket->list, list) {
                if (!match(ref, entry))
@@ -293,7 +293,7 @@ static struct dma_debug_entry *__hash_bucket_find(struct hash_bucket *bucket,
                } else if (match_lvl > last_lvl) {
                        /*
                         * We found an entry that fits better then the
-                        * previous one
+                        * previous one or it is the 1st match.
                         */
                        last_lvl = match_lvl;
                        ret      = entry;