Whamcloud - gitweb
LU-11719 ldlm: Adjust search_* functions 54/33754/6
authorPatrick Farrell <paf@cray.com>
Mon, 3 Dec 2018 16:36:08 +0000 (10:36 -0600)
committerOleg Drokin <green@whamcloud.com>
Fri, 4 Jan 2019 04:48:41 +0000 (04:48 +0000)
The search_itree and search_queue functions should both
return either a pointer to a found lock or NULL.

Currently, search_itree just returns the contents of
data->lmd_lock, whether or not a lock was found.

search_queue will do the same under certain cirumstances.

Zero lmd_lock in both search_* functions, and also stop
searching in search_itree once a lock is found.

cray-bug-id: LUS-6783
Signed-off-by: Patrick Farrell <paf@cray.com>
Change-Id: Ie231166756e60c228370f8f1a019ccfe14dfda6a
Reviewed-on: https://review.whamcloud.com/33754
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/ldlm/ldlm_lock.c

index 5e7afe6..f83971c 100644 (file)
@@ -1262,6 +1262,8 @@ static struct ldlm_lock *search_itree(struct ldlm_resource *res,
        };
        int idx;
 
        };
        int idx;
 
+       data->lmd_lock = NULL;
+
        for (idx = 0; idx < LCK_MODE_NUM; idx++) {
                struct ldlm_interval_tree *tree = &res->lr_itree[idx];
 
        for (idx = 0; idx < LCK_MODE_NUM; idx++) {
                struct ldlm_interval_tree *tree = &res->lr_itree[idx];
 
@@ -1273,8 +1275,11 @@ static struct ldlm_lock *search_itree(struct ldlm_resource *res,
 
                interval_search(tree->lit_root, &ext,
                                itree_overlap_cb, data);
 
                interval_search(tree->lit_root, &ext,
                                itree_overlap_cb, data);
+               if (data->lmd_lock)
+                       return data->lmd_lock;
        }
        }
-       return data->lmd_lock;
+
+       return NULL;
 }
 
 
 }
 
 
@@ -1292,11 +1297,14 @@ static struct ldlm_lock *search_queue(struct list_head *queue,
        struct ldlm_lock *lock;
        int rc;
 
        struct ldlm_lock *lock;
        int rc;
 
+       data->lmd_lock = NULL;
+
        list_for_each_entry(lock, queue, l_res_link) {
                rc = lock_matches(lock, data);
                if (rc == INTERVAL_ITER_STOP)
                        return data->lmd_lock;
        }
        list_for_each_entry(lock, queue, l_res_link) {
                rc = lock_matches(lock, data);
                if (rc == INTERVAL_ITER_STOP)
                        return data->lmd_lock;
        }
+
        return NULL;
 }
 
        return NULL;
 }