diff options
Diffstat (limited to 'xlators/protocol/server/src/server-resolve.c')
| -rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 26 | 
1 files changed, 24 insertions, 2 deletions
diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index aa1410e7336..91654ceb172 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -101,6 +101,7 @@ resolve_gfid_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          server_resolve_t     *resolve = NULL;          inode_t              *link_inode = NULL;          loc_t                *resolve_loc = NULL; +        dict_t               *dict = NULL;          state = CALL_STATE (frame);          resolve = state->resolve_now; @@ -161,10 +162,19 @@ resolve_gfid_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          inode_path (resolve_loc->parent, resolve_loc->name,                      (char **) &resolve_loc->path); +        dict = dict_copy_with_ref (state->xdata, NULL); +        if (!dict && state->xdata) +                gf_msg (this->name, GF_LOG_ERROR, ENOMEM, PS_MSG_NO_MEMORY, +                        "BUG: dict allocation failed (pargfid: %s, name: %s), " +                        "still continuing", uuid_utoa (resolve_loc->gfid), +                        resolve_loc->name); +          STACK_WIND (frame, resolve_gfid_entry_cbk,                      frame->root->client->bound_xl,                      frame->root->client->bound_xl->fops->lookup, -                    &resolve->resolve_loc, state->xdata); +                    &resolve->resolve_loc, dict); +        if (dict) +                dict_unref (dict);          return 0;  out:          resolve_continue (frame); @@ -180,6 +190,7 @@ resolve_gfid (call_frame_t *frame)          server_resolve_t     *resolve = NULL;          loc_t                *resolve_loc = NULL;          int                   ret = 0; +        dict_t               *xdata = NULL;          state = CALL_STATE (frame);          this  = frame->this; @@ -194,10 +205,21 @@ resolve_gfid (call_frame_t *frame)          resolve_loc->inode = inode_new (state->itable);          ret = loc_path (resolve_loc, NULL); +        xdata = dict_copy_with_ref (state->xdata, NULL); +        if (!xdata && state->xdata) +                gf_msg (this->name, GF_LOG_ERROR, ENOMEM, PS_MSG_NO_MEMORY, +                        "BUG: dict allocation failed (gfid: %s), " +                        "still continuing", +                        uuid_utoa (resolve_loc->gfid)); +          STACK_WIND (frame, resolve_gfid_cbk,                      frame->root->client->bound_xl,                      frame->root->client->bound_xl->fops->lookup, -                    &resolve->resolve_loc, state->xdata); +                    &resolve->resolve_loc, xdata); + +        if (xdata) +                dict_unref (xdata); +          return 0;  }  | 
