summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr.c
diff options
context:
space:
mode:
authorBasavanagowda Kanur <gowda@gluster.com>2009-04-02 06:08:17 +0530
committerAnand V. Avati <avati@amp.gluster.com>2009-04-02 18:09:32 +0530
commit60615a0a78ab8bc93dd027c1338c588c4f3d49a7 (patch)
tree0e8ba8f2e953f0f91050fa1389159ebbfc672969 /xlators/cluster/afr/src/afr.c
parent705c7c9bacafc22b714ac15e3925cb5eaeb45b0a (diff)
cluster/replicate should propogate the ESTALE error to parent, when at least one subvolume returns ESTALE.
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr.c')
-rw-r--r--xlators/cluster/afr/src/afr.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index 73cc5686d..a5acead58 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -355,9 +355,18 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
if (op_errno == ENOENT)
local->enoent_count++;
- if (op_errno != ENOTCONN)
- local->op_errno = op_errno;
-
+ if (op_errno != ENOTCONN) {
+ if (local->op_errno != ESTALE)
+ local->op_errno = op_errno;
+ }
+
+ if (op_errno == ESTALE) {
+ /* no matter what other subvolumes return for
+ * this call, ESTALE _must_ be sent to parent
+ */
+ local->op_ret = -1;
+ local->op_errno = ESTALE;
+ }
goto unlock;
}
@@ -383,7 +392,8 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
/* inode number should be preserved across revalidates */
if (local->success_count == 0) {
- local->op_ret = op_ret;
+ if (local->op_errno != ESTALE)
+ local->op_ret = op_ret;
local->cont.lookup.inode = inode;
local->cont.lookup.xattr = dict_ref (xattr);