diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index d0126aa63e3..6ffb9098421 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -58,10 +58,27 @@ resolve_gfid_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret == -1) { if (op_errno == ENOENT) { - gf_msg_debug (this->name, 0, "%s/%s: failed to resolve" - " (%s)", + gf_msg_debug (this->name, 0, + "%s/%s: failed to resolve (%s)", uuid_utoa (resolve_loc->pargfid), resolve_loc->name, strerror (op_errno)); + if (resolve->type == RESOLVE_NOT) { + do { + inode = inode_grep (state->itable, + resolve_loc->parent, + resolve->bname); + + if (inode) { + gf_msg_debug (this->name, 0, "%s/%s: " + "removing stale dentry", + uuid_utoa (resolve_loc->pargfid), + resolve->bname); + inode_unlink (inode, + resolve_loc->parent, + resolve->bname); + } + } while (inode); + } } else { gf_msg (this->name, GF_LOG_WARNING, op_errno, PS_MSG_GFID_RESOLVE_FAILED, "%s/%s: failed to " @@ -318,11 +335,13 @@ resolve_entry_simple (call_frame_t *frame) if (resolve->type == RESOLVE_NOT) { gf_msg_debug (this->name, 0, "inode (pointer: %p gfid:%s found" - " for path (%s) while type is RESOLVE_NOT", + " for path (%s) while type is RESOLVE_NOT. " + "Performing lookup on backend to rule out any " + "possible stale dentries in inode table", inode, uuid_utoa (inode->gfid), resolve->path); resolve->op_ret = -1; resolve->op_errno = EEXIST; - ret = -1; + ret = 1; goto out; } |