summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/afr/src/afr-common.c82
-rw-r--r--xlators/cluster/afr/src/afr-transaction.c4
2 files changed, 53 insertions, 33 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index bce955cfd03..80aea0c7d62 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -3592,43 +3592,19 @@ afr_fop_lock_wind (call_frame_t *frame, xlator_t *this, int child_index,
}
}
-static int32_t
-afr_unlock_partial_lock_cbk (call_frame_t *frame, void *cookie,
- xlator_t *this, int32_t op_ret,
- int32_t op_errno, dict_t *xdata)
-
+void
+afr_fop_lock_proceed (call_frame_t *frame)
{
afr_local_t *local = NULL;
afr_private_t *priv = NULL;
- int call_count = -1;
- int child_index = (long)cookie;
- uuid_t gfid = {0};
local = frame->local;
- priv = this->private;
-
- if (op_ret < 0 && op_errno != ENOTCONN) {
- if (local->fd)
- gf_uuid_copy (gfid, local->fd->inode->gfid);
- else
- loc_gfid (&local->loc, gfid);
- gf_msg (this->name, GF_LOG_ERROR, op_errno,
- AFR_MSG_UNLOCK_FAIL,
- "%s: Failed to unlock %s on %s "
- "with lk_owner: %s", uuid_utoa (gfid),
- gf_fop_list[local->op],
- priv->children[child_index]->name,
- lkowner_utoa (&frame->root->lk_owner));
- }
-
- call_count = afr_frame_return (frame);
- if (call_count)
- goto out;
+ priv = frame->this->private;
if (local->fop_lock_state != AFR_FOP_LOCK_PARALLEL) {
afr_fop_lock_unwind (frame, local->op, local->op_ret,
local->op_errno, local->xdata_rsp);
- goto out;
+ return;
}
/* At least one child is up */
/*
@@ -3672,8 +3648,42 @@ afr_unlock_partial_lock_cbk (call_frame_t *frame, void *cookie,
default:
break;
}
- afr_serialized_lock_wind (frame, this);
-out:
+ afr_serialized_lock_wind (frame, frame->this);
+}
+
+static int32_t
+afr_unlock_partial_lock_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_private_t *priv = NULL;
+ int call_count = -1;
+ int child_index = (long)cookie;
+ uuid_t gfid = {0};
+
+ local = frame->local;
+ priv = this->private;
+
+ if (op_ret < 0 && op_errno != ENOTCONN) {
+ if (local->fd)
+ gf_uuid_copy (gfid, local->fd->inode->gfid);
+ else
+ loc_gfid (&local->loc, gfid);
+ gf_msg (this->name, GF_LOG_ERROR, op_errno,
+ AFR_MSG_UNLOCK_FAIL,
+ "%s: Failed to unlock %s on %s "
+ "with lk_owner: %s", uuid_utoa (gfid),
+ gf_fop_list[local->op],
+ priv->children[child_index]->name,
+ lkowner_utoa (&frame->root->lk_owner));
+ }
+
+ call_count = afr_frame_return (frame);
+ if (call_count == 0)
+ afr_fop_lock_proceed (frame);
+
return 0;
}
@@ -3685,6 +3695,11 @@ afr_unlock_locks_and_proceed (call_frame_t *frame, xlator_t *this,
afr_private_t *priv = NULL;
afr_local_t *local = NULL;
+ if (call_count == 0) {
+ afr_fop_lock_proceed (frame);
+ goto out;
+ }
+
local = frame->local;
priv = this->private;
local->call_count = call_count;
@@ -3721,6 +3736,7 @@ afr_unlock_locks_and_proceed (call_frame_t *frame, xlator_t *this,
break;
}
+out:
return 0;
}
@@ -3763,7 +3779,7 @@ afr_fop_lock_done (call_frame_t *frame, xlator_t *this)
local->op_errno = local->replies[i].op_errno;
}
- if (afr_fop_lock_is_unlock (frame) || (lock_count == 0))
+ if (afr_fop_lock_is_unlock (frame))
goto unwind;
if (afr_is_conflicting_lock_present (local->op_ret, local->op_errno)) {
@@ -3771,7 +3787,9 @@ afr_fop_lock_done (call_frame_t *frame, xlator_t *this)
} else if (priv->quorum_count && !afr_has_quorum (success, this)) {
local->fop_lock_state = AFR_FOP_LOCK_QUORUM_FAILED;
local->op_ret = -1;
- local->op_errno = afr_quorum_errno (priv);
+ local->op_errno = afr_final_errno (local, priv);
+ if (local->op_errno == 0)
+ local->op_errno = afr_quorum_errno (priv);
afr_unlock_locks_and_proceed (frame, this, lock_count);
} else {
goto unwind;
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c
index 6bfe249d4eb..aef594bfc12 100644
--- a/xlators/cluster/afr/src/afr-transaction.c
+++ b/xlators/cluster/afr/src/afr-transaction.c
@@ -1679,7 +1679,9 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this)
* quorum number of nodes.
*/
if (priv->quorum_count && !afr_has_fop_quorum (frame)) {
- op_errno = afr_quorum_errno (priv);
+ op_errno = int_lock->lock_op_errno;
+ if (op_errno == 0)
+ op_errno = afr_quorum_errno (priv);
goto err;
}