diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-transaction.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 915b68ef07d..4c85a4b0d03 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -44,12 +44,16 @@ __afr_txn_write_fop (call_frame_t *frame, xlator_t *this) afr_local_t *local = NULL; afr_private_t *priv = NULL; int call_count = -1; + unsigned char *failed_subvols = NULL; int i = 0; local = frame->local; priv = this->private; - call_count = AFR_COUNT (local->transaction.pre_op, priv->child_count); + failed_subvols = local->transaction.failed_subvols; + + call_count = priv->child_count - AFR_COUNT (failed_subvols, + priv->child_count); if (call_count == 0) { local->transaction.resume (frame, this); @@ -59,7 +63,7 @@ __afr_txn_write_fop (call_frame_t *frame, xlator_t *this) local->call_count = call_count; for (i = 0; i < priv->child_count; i++) { - if (local->transaction.pre_op[i]) { + if (local->transaction.pre_op[i] && !failed_subvols[i]) { local->transaction.wind (frame, this, i); if (!--call_count) @@ -973,8 +977,10 @@ afr_changelog_cbk (call_frame_t *frame, void *cookie, xlator_t *this, priv = this->private; child_index = (long) cookie; - if (op_ret == -1) + if (op_ret == -1) { + local->op_errno = op_errno; afr_transaction_fop_failed (frame, this, child_index); + } if (priv->arbiter_count == 1 && !op_ret) { if (xattr) |