summaryrefslogtreecommitdiffstats
path: root/xlators/features/locks
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/features/locks')
-rw-r--r--xlators/features/locks/src/entrylk.c21
-rw-r--r--xlators/features/locks/src/inodelk.c37
2 files changed, 46 insertions, 12 deletions
diff --git a/xlators/features/locks/src/entrylk.c b/xlators/features/locks/src/entrylk.c
index e96097cc1..7f890429a 100644
--- a/xlators/features/locks/src/entrylk.c
+++ b/xlators/features/locks/src/entrylk.c
@@ -513,9 +513,20 @@ release_entry_locks_for_transport (xlator_t *this, pl_inode_t *pinode,
pthread_mutex_lock (&pinode->mutex);
{
- if (list_empty (&dom->entrylk_list)) {
- goto unlock;
- }
+ list_for_each_entry_safe (lock, tmp, &dom->blocked_entrylks,
+ blocked_locks) {
+ if (lock->trans != trans)
+ continue;
+
+ list_del_init (&lock->blocked_locks);
+
+ gf_log (this->name, GF_LOG_TRACE,
+ "releasing lock on held by "
+ "{transport=%p}",trans);
+
+ FREE (lock->basename);
+ FREE (lock);
+ }
list_for_each_entry_safe (lock, tmp, &dom->entrylk_list,
domain_list) {
@@ -526,7 +537,7 @@ release_entry_locks_for_transport (xlator_t *this, pl_inode_t *pinode,
gf_log (this->name, GF_LOG_TRACE,
"releasing lock on held by "
- "{transport=%p}",trans);;
+ "{transport=%p}",trans);
FREE (lock->basename);
FREE (lock);
@@ -535,7 +546,7 @@ release_entry_locks_for_transport (xlator_t *this, pl_inode_t *pinode,
__grant_blocked_entry_locks (this, pinode, dom, &granted);
}
-unlock:
+
pthread_mutex_unlock (&pinode->mutex);
list_for_each_entry_safe (lock, tmp, &granted, blocked_locks) {
diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c
index 89bb81f42..b2a5cb2e4 100644
--- a/xlators/features/locks/src/inodelk.c
+++ b/xlators/features/locks/src/inodelk.c
@@ -307,10 +307,12 @@ __grant_blocked_inode_locks (xlator_t *this, pl_inode_t *pl_inode, pl_dom_list_t
pl_inode_lock_t *bl = NULL;
pl_inode_lock_t *tmp = NULL;
- list_for_each_entry_safe (bl, tmp, &dom->blocked_inodelks, blocked_locks) {
+ struct list_head blocked_list;
- if (__inodelk_grantable (dom, bl))
- continue;
+ INIT_LIST_HEAD (&blocked_list);
+ list_splice_init (&dom->blocked_inodelks, &blocked_list);
+
+ list_for_each_entry_safe (bl, tmp, &blocked_list, blocked_locks) {
list_del_init (&bl->blocked_locks);
@@ -368,8 +370,27 @@ release_inode_locks_of_transport (xlator_t *this, pl_dom_list_t *dom,
pthread_mutex_lock (&pinode->mutex);
{
- if (list_empty (&dom->inodelk_list)) {
- goto unlock;
+
+ list_for_each_entry_safe (l, tmp, &dom->blocked_inodelks, blocked_locks) {
+ if (l->transport != trans)
+ continue;
+
+ list_del_init (&l->blocked_locks);
+
+ if (inode_path (inode, NULL, &path) < 0) {
+ gf_log (this->name, GF_LOG_TRACE,
+ "inode_path failed");
+ goto unlock;
+ }
+
+ gf_log (this->name, GF_LOG_TRACE,
+ "releasing lock on %s held by "
+ "{transport=%p, pid=%"PRId64"}",
+ path, trans,
+ (uint64_t) l->client_pid);
+
+ FREE (l);
+
}
list_for_each_entry_safe (l, tmp, &dom->inodelk_list, list) {
@@ -380,8 +401,6 @@ release_inode_locks_of_transport (xlator_t *this, pl_dom_list_t *dom,
grant_blocked_inode_locks (this, pinode, l, dom);
- __destroy_inode_lock (l);
-
if (inode_path (inode, NULL, &path) < 0) {
gf_log (this->name, GF_LOG_TRACE,
"inode_path failed");
@@ -394,6 +413,10 @@ release_inode_locks_of_transport (xlator_t *this, pl_dom_list_t *dom,
path, trans,
(uint64_t) l->client_pid);
+
+ __destroy_inode_lock (l);
+
+
}
}
unlock: