diff options
Diffstat (limited to 'xlators/features/locks/src/inodelk.c')
-rw-r--r-- | xlators/features/locks/src/inodelk.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c index 19b6f739f28..98367831dcf 100644 --- a/xlators/features/locks/src/inodelk.c +++ b/xlators/features/locks/src/inodelk.c @@ -691,31 +691,35 @@ pl_inodelk_client_cleanup(xlator_t *this, pl_ctx_t *ctx) } pthread_mutex_unlock(&ctx->lock); - list_for_each_entry_safe(l, tmp, &unwind, client_list) - { - list_del_init(&l->client_list); + if (!list_empty(&unwind)) { + list_for_each_entry_safe(l, tmp, &unwind, client_list) + { + list_del_init(&l->client_list); - if (l->frame) - STACK_UNWIND_STRICT(inodelk, l->frame, -1, EAGAIN, NULL); - list_add_tail(&l->client_list, &released); + if (l->frame) + STACK_UNWIND_STRICT(inodelk, l->frame, -1, EAGAIN, NULL); + list_add_tail(&l->client_list, &released); + } } - list_for_each_entry_safe(l, tmp, &released, client_list) - { - list_del_init(&l->client_list); + if (!list_empty(&released)) { + list_for_each_entry_safe(l, tmp, &released, client_list) + { + list_del_init(&l->client_list); - pl_inode = l->pl_inode; + pl_inode = l->pl_inode; - dom = get_domain(pl_inode, l->volume); + dom = get_domain(pl_inode, l->volume); - grant_blocked_inode_locks(this, pl_inode, dom, &now, pcontend); + grant_blocked_inode_locks(this, pl_inode, dom, &now, pcontend); - pthread_mutex_lock(&pl_inode->mutex); - { - __pl_inodelk_unref(l); + pthread_mutex_lock(&pl_inode->mutex); + { + __pl_inodelk_unref(l); + } + pthread_mutex_unlock(&pl_inode->mutex); + inode_unref(pl_inode->inode); } - pthread_mutex_unlock(&pl_inode->mutex); - inode_unref(pl_inode->inode); } if (pcontend != NULL) { |