summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/protocol/server/src/server-resolve.c27
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;
}