summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/unify
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/unify')
-rw-r--r--xlators/cluster/unify/src/unify.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/xlators/cluster/unify/src/unify.c b/xlators/cluster/unify/src/unify.c
index 337cd46882e..34321082832 100644
--- a/xlators/cluster/unify/src/unify.c
+++ b/xlators/cluster/unify/src/unify.c
@@ -341,15 +341,29 @@ unify_lookup_cbk (call_frame_t *frame,
callcnt = --local->call_count;
if (op_ret == -1) {
- if ((op_errno != ENOTCONN) && (op_errno != ENOENT)) {
+ if (local->revalidate &&
+ (op_errno == ESTALE)) {
+ /* ESTALE takes priority */
+ local->op_errno = op_errno;
+ local->failed = 1;
+ }
+
+ if ((op_errno != ENOTCONN)
+ && (op_errno != ENOENT)
+ && (local->op_errno != ESTALE)) {
+ /* if local->op_errno is already ESTALE, then
+ * ESTALE has to propogated to the parent first.
+ * do not enter here.
+ */
gf_log (this->name, GF_LOG_ERROR,
"child(%s): path(%s): %s",
priv->xl_array[(long)cookie]->name,
local->loc1.path, strerror (op_errno));
- local->op_errno = op_errno;
+ local->op_errno = op_errno;
local->failed = 1;
} else if (local->revalidate &&
+ (local->op_errno != ESTALE) &&
!(priv->optimist && (op_errno == ENOENT))) {
gf_log (this->name,
@@ -420,7 +434,13 @@ unify_lookup_cbk (call_frame_t *frame,
local->list [local->index++] =
(int16_t)(long)cookie;
}
-
+
+ if (!local->revalidate && S_ISDIR (buf->st_mode)) {
+ /* fresh lookup of a directory */
+ inode_ctx_put (local->loc1.inode, this,
+ priv->inode_generation);
+ }
+
if ((!local->dict) && dict &&
(priv->xl_array[(long)cookie] != NS(this))) {
local->dict = dict_ref (dict);
@@ -507,7 +527,8 @@ unify_lookup_cbk (call_frame_t *frame,
if ((local->op_ret >= 0) && local->failed &&
local->revalidate) {
/* Done revalidate, but it failed */
- if (op_errno != ENOTCONN) {
+ if ((op_errno != ENOTCONN)
+ && (local->op_errno != ESTALE)) {
gf_log (this->name, GF_LOG_ERROR,
"Revalidate failed for path(%s): %s",
local->loc1.path, strerror (op_errno));
@@ -572,6 +593,11 @@ unify_lookup (call_frame_t *frame,
STACK_UNWIND (frame, -1, ENOMEM, loc->inode, NULL, NULL);
return 0;
}
+
+ if (inode_ctx_get (loc->inode, this, NULL)
+ && S_ISDIR (loc->inode->st_mode)) {
+ local->revalidate = 1;
+ }
if (!inode_ctx_get (loc->inode, this, NULL) &&
loc->inode->st_mode &&