Whamcloud - gitweb
LU-11719 ldlm: Adjust search_* functions 99/40399/2
authorPatrick Farrell <paf@cray.com>
Mon, 3 Dec 2018 16:36:08 +0000 (10:36 -0600)
committerOleg Drokin <green@whamcloud.com>
Tue, 3 Nov 2020 03:17:18 +0000 (03:17 +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>
Reviewed-on: https://review.whamcloud.com/40399
Tested-by: jenkins <devops@whamcloud.com>
lustre/ldlm/ldlm_lock.c
lustre/osc/osc_lock.c

index 3b403ff..64d331f 100644 (file)
@@ -1285,6 +1285,8 @@ struct ldlm_lock *search_itree(struct ldlm_resource *res,
        };
        int idx;
 
+       data->lmd_lock = NULL;
+
        for (idx = 0; idx < LCK_MODE_NUM; idx++) {
                struct ldlm_interval_tree *tree = &res->lr_itree[idx];
 
@@ -1296,8 +1298,11 @@ struct ldlm_lock *search_itree(struct ldlm_resource *res,
 
                interval_search(tree->lit_root, &ext,
                                itree_overlap_cb, data);
+               if (data->lmd_lock)
+                       return data->lmd_lock;
        }
-       return data->lmd_lock;
+
+       return NULL;
 }
 EXPORT_SYMBOL(search_itree);
 
@@ -1316,11 +1321,14 @@ static struct ldlm_lock *search_queue(struct list_head *queue,
        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;
        }
+
        return NULL;
 }
 
index ced5c41..8bd0f47 100644 (file)
@@ -590,7 +590,7 @@ int osc_ldlm_glimpse_ast(struct ldlm_lock *dlmlock, void *data)
                        cl_object_get(obj);
                }
                unlock_res_and_lock(dlmlock);
-               LDLM_LOCK_PUT(dlmlock);
+               LDLM_LOCK_RELEASE(dlmlock);
 
                dlmlock = NULL;