diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-lk-common.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-lk-common.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 1f2a11755bf..c17f60f62c4 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -613,12 +613,16 @@ static int32_t afr_unlock_common_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *xdata) { - afr_local_t *local = NULL; - afr_internal_lock_t *int_lock = NULL; - int call_count = 0; + afr_local_t *local = NULL; + afr_internal_lock_t *int_lock = NULL; + afr_fd_ctx_t *fd_ctx = NULL; + afr_private_t *priv = NULL; + int call_count = 0; + int ret = 0; local = frame->local; int_lock = &local->internal_lock; + priv = this->private; LOCK (&frame->lock); { @@ -629,11 +633,15 @@ afr_unlock_common_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (call_count == 0) { gf_msg_trace (this->name, 0, "All internal locks unlocked"); - + if (local->fd) { + fd_ctx = afr_fd_ctx_get (local->fd, this); + if (0 == AFR_COUNT (fd_ctx->lock_acquired, priv->child_count)) + ret = afr_write_subvol_reset (frame, this); + } int_lock->lock_cbk (frame, this); } - return 0; + return ret; } void |