summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bugs/bug-765564.t3
-rw-r--r--xlators/cluster/afr/src/afr-lk-common.c25
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) {