diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2017-09-05 21:42:26 +0530 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-09-17 12:48:22 +0000 |
commit | 3fccf92b8af269324ef94e3d42e1746a01ec9d89 (patch) | |
tree | 334f9fa6a53ef6e8c96cbc14836e2ff61fa0ab3d /xlators | |
parent | 6c6abbf2662ac48cd3626c50f7fea87bfd0f76bf (diff) |
features/shard: Return aggregated size in stbuf of LINK fop
Backport of:
> Change-Id: I42df7679d63fec9b4c03b8dbc66c5625f097fac0
> Reviewed-on: https://review.gluster.org/18209
> BUG: 1488546
> cherry-picked from 91430817ce5bcbeabf057e9c978485728a85fb2b
Change-Id: I42df7679d63fec9b4c03b8dbc66c5625f097fac0
BUG: 1488719
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: https://review.gluster.org/18212
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/features/shard/src/shard.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index 2a2a7b1f4bf..c59045d8cff 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -2235,11 +2235,16 @@ shard_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, struct iatt *postparent, dict_t *xdata) { + shard_local_t *local = NULL; + + local = frame->local; if (op_ret < 0) goto err; shard_inode_ctx_set (inode, this, buf, 0, SHARD_MASK_NLINK | SHARD_MASK_TIMES); + buf->ia_size = local->prebuf.ia_size; + buf->ia_blocks = local->prebuf.ia_blocks; SHARD_STACK_UNWIND (link, frame, op_ret, op_errno, inode, buf, preparent, postparent, xdata); @@ -2250,12 +2255,32 @@ err: return 0; } +int +shard_post_lookup_link_handler (call_frame_t *frame, xlator_t *this) +{ + shard_local_t *local = NULL; + + local = frame->local; + + if (local->op_ret < 0) { + SHARD_STACK_UNWIND (link, frame, local->op_ret, local->op_errno, + NULL, NULL, NULL, NULL, NULL); + return 0; + } + + STACK_WIND (frame, shard_link_cbk, FIRST_CHILD(this), + FIRST_CHILD(this)->fops->link, &local->loc, &local->loc2, + local->xattr_req); + return 0; +} + int32_t shard_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, dict_t *xdata) { int ret = -1; uint64_t block_size = 0; + shard_local_t *local = NULL; ret = shard_inode_ctx_get_block_size (oldloc->inode, this, &block_size); if (ret) { @@ -2273,8 +2298,23 @@ shard_link (call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc, return 0; } - STACK_WIND (frame, shard_link_cbk, FIRST_CHILD(this), - FIRST_CHILD(this)->fops->link, oldloc, newloc, xdata); + if (!this->itable) + this->itable = oldloc->inode->table; + + local = mem_get0 (this->local_pool); + if (!local) + goto err; + + frame->local = local; + + loc_copy (&local->loc, oldloc); + loc_copy (&local->loc2, newloc); + local->xattr_req = (xdata) ? dict_ref (xdata) : dict_new (); + if (!local->xattr_req) + goto err; + + shard_lookup_base_file (frame, this, &local->loc, + shard_post_lookup_link_handler); return 0; err: |