diff options
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 2a857f27021..da36a3b33a5 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -678,10 +678,12 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int ret = -1; int is_dir = 0; int is_linkfile = 0; + int follow_link = 0; call_frame_t *copy = NULL; dht_local_t *copy_local = NULL; char gfid[GF_UUID_BUF_SIZE] = {0}; uint32_t vol_commit_hash = 0; + xlator_t *subvol = NULL; GF_VALIDATE_OR_GOTO ("dht", frame, err); GF_VALIDATE_OR_GOTO ("dht", this, err); @@ -772,17 +774,10 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, is_dir = check_is_dir (inode, stbuf, xattr); is_linkfile = check_is_linkfile (inode, stbuf, xattr, conf->link_xattr_name); - if (is_linkfile) { - gf_msg (this->name, GF_LOG_INFO, 0, - DHT_MSG_REVALIDATE_CBK_INFO, - "Revalidate: linkfile found %s, (gfid = %s)", - local->loc.path, gfid); - local->return_estale = 1; - + follow_link = 1; goto unlock; } - if (is_dir) { ret = dht_dir_has_layout (xattr, conf->xattr_name); if (ret >= 0) { @@ -830,6 +825,23 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } unlock: UNLOCK (&frame->lock); + + if (follow_link) { + gf_uuid_copy (local->gfid, stbuf->ia_gfid); + + subvol = dht_linkfile_subvol (this, inode, stbuf, xattr); + if (!subvol) { + op_errno = ESTALE; + local->op_ret = -1; + } else { + + STACK_WIND (frame, dht_lookup_linkfile_cbk, + subvol, subvol->fops->lookup, + &local->loc, local->xattr_req); + return 0; + } + } + out: this_call_cnt = dht_frame_return (frame); |