diff options
Diffstat (limited to 'fs/dlm/dir.c')
-rw-r--r-- | fs/dlm/dir.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/dlm/dir.c b/fs/dlm/dir.c index 83641574b016..dc5eb598b81f 100644 --- a/fs/dlm/dir.c +++ b/fs/dlm/dir.c | |||
@@ -351,11 +351,28 @@ int dlm_dir_lookup(struct dlm_ls *ls, int nodeid, char *name, int namelen, | |||
351 | static struct dlm_rsb *find_rsb_root(struct dlm_ls *ls, char *name, int len) | 351 | static struct dlm_rsb *find_rsb_root(struct dlm_ls *ls, char *name, int len) |
352 | { | 352 | { |
353 | struct dlm_rsb *r; | 353 | struct dlm_rsb *r; |
354 | uint32_t hash, bucket; | ||
355 | int rv; | ||
356 | |||
357 | hash = jhash(name, len, 0); | ||
358 | bucket = hash & (ls->ls_rsbtbl_size - 1); | ||
359 | |||
360 | spin_lock(&ls->ls_rsbtbl[bucket].lock); | ||
361 | rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[bucket].keep, name, len, 0, &r); | ||
362 | if (rv) | ||
363 | rv = dlm_search_rsb_tree(&ls->ls_rsbtbl[bucket].toss, | ||
364 | name, len, 0, &r); | ||
365 | spin_unlock(&ls->ls_rsbtbl[bucket].lock); | ||
366 | |||
367 | if (!rv) | ||
368 | return r; | ||
354 | 369 | ||
355 | down_read(&ls->ls_root_sem); | 370 | down_read(&ls->ls_root_sem); |
356 | list_for_each_entry(r, &ls->ls_root_list, res_root_list) { | 371 | list_for_each_entry(r, &ls->ls_root_list, res_root_list) { |
357 | if (len == r->res_length && !memcmp(name, r->res_name, len)) { | 372 | if (len == r->res_length && !memcmp(name, r->res_name, len)) { |
358 | up_read(&ls->ls_root_sem); | 373 | up_read(&ls->ls_root_sem); |
374 | log_error(ls, "find_rsb_root revert to root_list %s", | ||
375 | r->res_name); | ||
359 | return r; | 376 | return r; |
360 | } | 377 | } |
361 | } | 378 | } |