From 6fbb140c293dcabaf6ec34315d7cc94de07c0782 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Tue, 28 Oct 2014 11:48:02 +0530 Subject: cluster/afr: Preserve errno in case of failures on all subvols Backport of http://review.gluster.org/8984 Problem: When quorum is enabled and the fop fails on all the subvolumes, op_errno is set to EROFS which overrides the actual errno returned from bricks. Fix: Don't override the errno when fop fails on all subvols. Change-Id: I61e57bbf1a69407230ec172a983de18d1c624fd2 BUG: 1162122 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/9087 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/cluster/afr/src/afr-transaction.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index d287e6ab66c..bb582b5940f 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -507,6 +507,10 @@ afr_handle_quorum (call_frame_t *frame) if (priv->quorum_count == 0) return; + /* If the fop already failed return right away to preserve errno */ + if (local->op_ret == -1) + return; + /* * Network split may happen just after the fops are unwound, so check * if the fop succeeded in a way it still follows quorum. If it doesn't, @@ -975,16 +979,23 @@ afr_changelog_pre_op (call_frame_t *frame, xlator_t *this) } } - if (priv->quorum_count && !afr_has_fop_quorum (frame)) { - op_errno = EROFS; - goto err; - } - + /* This condition should not be met with present code, as + * transaction.done will be called if locks are not acquired on even a + * single node. + */ if (call_count == 0) { op_errno = ENOTCONN; goto err; } + /* Check if the fop can be performed on at least + * quorum number of nodes. + */ + if (priv->quorum_count && !afr_has_fop_quorum (frame)) { + op_errno = EROFS; + goto err; + } + xdata_req = dict_new(); if (!xdata_req) { op_errno = ENOMEM; -- cgit