diff options
-rw-r--r-- | tests/bugs/bug-765564.t | 3 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-lk-common.c | 25 |
2 files changed, 16 insertions, 12 deletions
diff --git a/tests/bugs/bug-765564.t b/tests/bugs/bug-765564.t index cf00f520f14..c1f29d92e09 100644 --- a/tests/bugs/bug-765564.t +++ b/tests/bugs/bug-765564.t @@ -63,6 +63,9 @@ function rm_mv_correctness () { return $ret } +TEST touch a; +TEST mv a b; + TEST rm_mv_correctness; TEST umount $M0; cleanup; diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 802f91f5fa7..265330d115b 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -1030,6 +1030,7 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie) int ret = 0; int child_index = 0; int lockee_no = 0; + gf_boolean_t is_entrylk = _gf_false; local = frame->local; int_lock = &local->internal_lock; @@ -1074,23 +1075,23 @@ afr_lock_blocking (call_frame_t *frame, xlator_t *this, int cookie) child_index++; } - if ((int_lock->lk_expected_count == int_lock->lk_attempted_count) && - ((afr_is_entrylk (int_lock, local->transaction.type) && - int_lock->entrylk_lock_count == 0) || - (int_lock->lock_count == 0))){ - - gf_log (this->name, GF_LOG_INFO, - "unable to lock on even one child"); + if (int_lock->lk_expected_count == int_lock->lk_attempted_count) { + is_entrylk = afr_is_entrylk (int_lock, local->transaction.type); - local->op_ret = -1; - int_lock->lock_op_ret = -1; + if ((is_entrylk && int_lock->entrylk_lock_count == 0) || + (!is_entrylk && int_lock->lock_count == 0)) { + gf_log (this->name, GF_LOG_INFO, + "unable to lock on even one child"); - afr_copy_locked_nodes (frame, this); + local->op_ret = -1; + int_lock->lock_op_ret = -1; - afr_unlock(frame, this); + afr_copy_locked_nodes (frame, this); - return 0; + afr_unlock(frame, this); + return 0; + } } if (int_lock->lk_expected_count == int_lock->lk_attempted_count) { |