diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2012-03-07 17:48:12 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-03-10 02:24:30 -0800 |
commit | f75277b12af4c7e72c448480feec0d0e2e6582cd (patch) | |
tree | 76846886f4d88d8abb83cf4fe95576418d571bbe /xlators/features/locks/src/clear.c | |
parent | 7afa2747234778be3f2cffb860a8c48286dde566 (diff) |
features/locks: Make inodelk ref-counted
Ref when the object is allocated.
Unref after the response is submitted to that inodelk.
Ref when the lock is granted.
Unref when the lock is unlocked.
Change-Id: I2bfe9182b67bea7dc7b9d0ed9f99f1c7fa0b8a3c
BUG: 783449
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Reviewed-on: http://review.gluster.com/2891
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'xlators/features/locks/src/clear.c')
-rw-r--r-- | xlators/features/locks/src/clear.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/xlators/features/locks/src/clear.c b/xlators/features/locks/src/clear.c index ad6d0893cef..d64a15b09e4 100644 --- a/xlators/features/locks/src/clear.c +++ b/xlators/features/locks/src/clear.c @@ -223,7 +223,9 @@ clrlk_clear_inodelk (xlator_t *this, pl_inode_t *pl_inode, pl_dom_list_t *dom, int bcount = 0; int gcount = 0; gf_boolean_t chk_range = _gf_false; + struct list_head released; + INIT_LIST_HEAD (&released); if (clrlk_get_lock_range (args->opts, &ulock, &chk_range)) { *op_errno = EINVAL; goto out; @@ -247,17 +249,23 @@ blkd: continue; bcount++; - list_del_init (&ilock->list); - pl_trace_out (this, ilock->frame, NULL, NULL, F_SETLKW, - &ilock->user_flock, -1, EAGAIN, - ilock->volume); - STACK_UNWIND_STRICT (inodelk, ilock->frame, -1, - EAGAIN); - GF_FREE (ilock); + list_del_init (&ilock->blocked_locks); + list_add (&ilock->blocked_locks, &released); } } pthread_mutex_unlock (&pl_inode->mutex); + list_for_each_entry_safe (ilock, tmp, &released, blocked_locks) { + list_del_init (&ilock->blocked_locks); + pl_trace_out (this, ilock->frame, NULL, NULL, F_SETLKW, + &ilock->user_flock, -1, EAGAIN, + ilock->volume); + STACK_UNWIND_STRICT (inodelk, ilock->frame, -1, + EAGAIN); + //No need to take lock as the locks are only in one list + __pl_inodelk_unref (ilock); + } + if (!(args->kind & CLRLK_GRANTED)) { ret = 0; goto out; @@ -276,14 +284,20 @@ granted: gcount++; list_del_init (&ilock->list); - GF_FREE (ilock); + list_add (&ilock->list, &released); } } pthread_mutex_unlock (&pl_inode->mutex); - grant_blocked_inode_locks (this, pl_inode, dom); + list_for_each_entry_safe (ilock, tmp, &released, list) { + list_del_init (&ilock->list); + //No need to take lock as the locks are only in one list + __pl_inodelk_unref (ilock); + } + ret = 0; out: + grant_blocked_inode_locks (this, pl_inode, dom); *blkd = bcount; *granted = gcount; return ret; |