This patch fixes the following sparse warning: warning: context imbalance in 'put_rsb' - unexpected unlock
it does this by unlock the ls_rsbtbl[bucket].lock lock inside of the release functionality of kref_put_lock() and do a __releases() annotation at the release function. Signed-off-by: Alexander Aring <aahri...@redhat.com> --- fs/dlm/lock.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index 4b5cff76d376..70ee15c44bd2 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c @@ -352,12 +352,9 @@ static void put_rsb(struct dlm_rsb *r) { struct dlm_ls *ls = r->res_ls; uint32_t bucket = r->res_bucket; - int rv; - rv = kref_put_lock(&r->res_ref, toss_rsb, - &ls->ls_rsbtbl[bucket].lock); - if (rv) - spin_unlock(&ls->ls_rsbtbl[bucket].lock); + kref_put_lock(&r->res_ref, toss_rsb, + &ls->ls_rsbtbl[bucket].lock); } void dlm_put_rsb(struct dlm_rsb *r) @@ -1140,20 +1137,24 @@ void dlm_dump_rsb_name(struct dlm_ls *ls, char *name, int len) } static void toss_rsb(struct kref *kref) + __releases(&ls->ls_rsbtbl[bucket].lock) { struct dlm_rsb *r = container_of(kref, struct dlm_rsb, res_ref); + uint32_t bucket = r->res_bucket; struct dlm_ls *ls = r->res_ls; DLM_ASSERT(list_empty(&r->res_root_list), dlm_print_rsb(r);); kref_init(&r->res_ref); - rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[r->res_bucket].keep); - rsb_insert(r, &ls->ls_rsbtbl[r->res_bucket].toss); + rb_erase(&r->res_hashnode, &ls->ls_rsbtbl[bucket].keep); + rsb_insert(r, &ls->ls_rsbtbl[bucket].toss); r->res_toss_time = jiffies; - ls->ls_rsbtbl[r->res_bucket].flags |= DLM_RTF_SHRINK; + ls->ls_rsbtbl[bucket].flags |= DLM_RTF_SHRINK; if (r->res_lvbptr) { dlm_free_lvb(r->res_lvbptr); r->res_lvbptr = NULL; } + + spin_unlock(&ls->ls_rsbtbl[bucket].lock); } /* See comment for unhold_lkb */ -- 2.31.1