diff options
| author | Pavan Sondur <pavan@gluster.com> | 2009-12-02 08:34:25 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-12-02 10:29:37 -0800 | 
| commit | 494db717941e90ae209d416e00bf2c63490ba75e (patch) | |
| tree | 5f535c4af9014e59debafd8f3c4b055ffd78b592 | |
| parent | 7d740b2c01224019525fda01235f56c3a4416747 (diff) | |
features/locks: Release blocked locks also when server requests to release all locks of a 'transport'.
Signed-off-by: Pavan Vilas Sondur <pavan@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 222 (Enhance Internal locks to support multilple domains and rewrite inodelks)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=222
| -rw-r--r-- | xlators/features/locks/src/entrylk.c | 21 | ||||
| -rw-r--r-- | xlators/features/locks/src/inodelk.c | 37 | 
2 files changed, 46 insertions, 12 deletions
diff --git a/xlators/features/locks/src/entrylk.c b/xlators/features/locks/src/entrylk.c index e96097cc1f8..7f890429a5a 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 89bb81f4224..b2a5cb2e4a5 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:  | 
