diff options
Diffstat (limited to 'xlators/features/locks/src')
-rw-r--r-- | xlators/features/locks/src/common.c | 22 | ||||
-rw-r--r-- | xlators/features/locks/src/inodelk.c | 4 |
2 files changed, 16 insertions, 10 deletions
diff --git a/xlators/features/locks/src/common.c b/xlators/features/locks/src/common.c index 0bc7baa30..643a7a80d 100644 --- a/xlators/features/locks/src/common.c +++ b/xlators/features/locks/src/common.c @@ -46,7 +46,7 @@ static int pl_send_prelock_unlock (xlator_t *this, pl_inode_t *pl_inode, posix_lock_t *old_lock); static pl_dom_list_t * -allocate_domain (const char *volume) +__allocate_domain (const char *volume) { pl_dom_list_t *dom = NULL; @@ -88,17 +88,19 @@ get_domain (pl_inode_t *pl_inode, const char *volume) GF_VALIDATE_OR_GOTO (POSIX_LOCKS, pl_inode, out); GF_VALIDATE_OR_GOTO (POSIX_LOCKS, volume, out); - list_for_each_entry (dom, &pl_inode->dom_list, inode_list) { - if (strcmp (dom->domain, volume) == 0) - goto found; - + pthread_mutex_lock (&pl_inode->mutex); + { + list_for_each_entry (dom, &pl_inode->dom_list, inode_list) { + if (strcmp (dom->domain, volume) == 0) + goto unlock; + } + dom = __allocate_domain (volume); + if (dom) + list_add (&dom->inode_list, &pl_inode->dom_list); } - - dom = allocate_domain (volume); - if (dom) - list_add (&dom->inode_list, &pl_inode->dom_list); -found: +unlock: + pthread_mutex_unlock (&pl_inode->mutex); if (dom) { gf_log (POSIX_LOCKS, GF_LOG_TRACE, "Domain %s found", volume); } else { diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c index cbc9186aa..b59f2a280 100644 --- a/xlators/features/locks/src/inodelk.c +++ b/xlators/features/locks/src/inodelk.c @@ -595,6 +595,10 @@ pl_common_inodelk (call_frame_t *frame, xlator_t *this, } dom = get_domain (pinode, volume); + if (!dom) { + op_errno = ENOMEM; + goto unwind; + } if (frame->root->lk_owner.len == 0) { /* |