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) {  | 
