diff options
Diffstat (limited to 'xlators/protocol/client/src/client-lk.c')
-rw-r--r-- | xlators/protocol/client/src/client-lk.c | 94 |
1 files changed, 35 insertions, 59 deletions
diff --git a/xlators/protocol/client/src/client-lk.c b/xlators/protocol/client/src/client-lk.c index 6468fb4511e..b5e11aa07fd 100644 --- a/xlators/protocol/client/src/client-lk.c +++ b/xlators/protocol/client/src/client-lk.c @@ -43,14 +43,10 @@ dump_client_locks_fd (clnt_fd_ctx_t *fdctx) client_posix_lock_t *lock = NULL; int count = 0; - pthread_mutex_lock (&fdctx->mutex); - { - list_for_each_entry (lock, &fdctx->lock_list, list) { - __dump_client_lock (lock); - count++; - } + list_for_each_entry (lock, &fdctx->lock_list, list) { + __dump_client_lock (lock); + count++; } - pthread_mutex_unlock (&fdctx->mutex); return count; @@ -59,23 +55,27 @@ dump_client_locks_fd (clnt_fd_ctx_t *fdctx) int dump_client_locks (inode_t *inode) { - fd_t *fd = NULL; - xlator_t *this = NULL; - clnt_fd_ctx_t *fdctx = NULL; + fd_t *fd = NULL; + xlator_t *this = NULL; + clnt_fd_ctx_t *fdctx = NULL; + clnt_conf_t *conf = NULL; int total_count = 0; int locks_fd_count = 0; this = THIS; + conf = this->private; LOCK (&inode->lock); { list_for_each_entry (fd, &inode->fd_list, inode_list) { locks_fd_count = 0; + pthread_spin_lock(&conf->fd_lock); fdctx = this_fd_get_ctx (fd, this); if (fdctx) locks_fd_count = dump_client_locks_fd (fdctx); + pthread_spin_unlock(&conf->fd_lock); total_count += locks_fd_count; } @@ -327,13 +327,7 @@ __insert_and_merge (clnt_fd_ctx_t *fdctx, client_posix_lock_t *lock) static void client_setlk (clnt_fd_ctx_t *fdctx, client_posix_lock_t *lock) { - pthread_mutex_lock (&fdctx->mutex); - { - __insert_and_merge (fdctx, lock); - } - pthread_mutex_unlock (&fdctx->mutex); - - return; + __insert_and_merge (fdctx, lock); } static void @@ -349,6 +343,7 @@ delete_granted_locks_owner (fd_t *fd, gf_lkowner_t *owner) client_posix_lock_t *lock = NULL; client_posix_lock_t *tmp = NULL; xlator_t *this = NULL; + clnt_conf_t *conf = NULL; struct list_head delete_list; int ret = 0; @@ -356,25 +351,29 @@ delete_granted_locks_owner (fd_t *fd, gf_lkowner_t *owner) INIT_LIST_HEAD (&delete_list); this = THIS; + conf = this->private; + + pthread_spin_lock(&conf->fd_lock); + fdctx = this_fd_get_ctx (fd, this); if (!fdctx) { + pthread_spin_unlock(&conf->fd_lock); + gf_msg (this->name, GF_LOG_WARNING, EINVAL, PC_MSG_FD_CTX_INVALID, "fdctx not valid"); ret = -1; goto out; } - pthread_mutex_lock (&fdctx->mutex); - { - list_for_each_entry_safe (lock, tmp, &fdctx->lock_list, list) { - if (!is_same_lkowner (&lock->owner, owner)) { - list_del_init (&lock->list); - list_add_tail (&lock->list, &delete_list); - count++; - } + list_for_each_entry_safe (lock, tmp, &fdctx->lock_list, list) { + if (!is_same_lkowner (&lock->owner, owner)) { + list_del_init (&lock->list); + list_add_tail (&lock->list, &delete_list); + count++; } } - pthread_mutex_unlock (&fdctx->mutex); + + pthread_spin_unlock(&conf->fd_lock); list_for_each_entry_safe (lock, tmp, &delete_list, list) { list_del_init (&lock->list); @@ -390,39 +389,6 @@ out: } int32_t -delete_granted_locks_fd (clnt_fd_ctx_t *fdctx) -{ - client_posix_lock_t *lock = NULL; - client_posix_lock_t *tmp = NULL; - xlator_t *this = NULL; - - struct list_head delete_list; - int ret = 0; - int count = 0; - - INIT_LIST_HEAD (&delete_list); - this = THIS; - - pthread_mutex_lock (&fdctx->mutex); - { - list_splice_init (&fdctx->lock_list, &delete_list); - } - pthread_mutex_unlock (&fdctx->mutex); - - list_for_each_entry_safe (lock, tmp, &delete_list, list) { - list_del_init (&lock->list); - count++; - destroy_client_lock (lock); - } - - /* FIXME: Need to actually print the locks instead of count */ - gf_msg_trace (this->name, 0, - "Number of locks cleared=%d", count); - - return ret; -} - -int32_t client_cmd_to_gf_cmd (int32_t cmd, int32_t *gf_cmd) { int ret = 0; @@ -497,13 +463,19 @@ client_add_lock_for_recovery (fd_t *fd, struct gf_flock *flock, clnt_fd_ctx_t *fdctx = NULL; xlator_t *this = NULL; client_posix_lock_t *lock = NULL; + clnt_conf_t *conf = NULL; int ret = 0; this = THIS; + conf = this->private; + + pthread_spin_lock(&conf->fd_lock); fdctx = this_fd_get_ctx (fd, this); if (!fdctx) { + pthread_spin_unlock(&conf->fd_lock); + gf_msg (this->name, GF_LOG_WARNING, 0, PC_MSG_FD_GET_FAIL, "failed to get fd context. sending EBADFD"); ret = -EBADFD; @@ -512,12 +484,16 @@ client_add_lock_for_recovery (fd_t *fd, struct gf_flock *flock, lock = new_client_lock (flock, owner, cmd, fd); if (!lock) { + pthread_spin_unlock(&conf->fd_lock); + ret = -ENOMEM; goto out; } client_setlk (fdctx, lock); + pthread_spin_unlock(&conf->fd_lock); + out: return ret; |