diff options
author | Krutika Dhananjay <kdhananj@redhat.com> | 2015-04-29 12:09:26 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-05-02 03:36:21 -0700 |
commit | 5f349f3f0cdc088d2908be0af2c4f1dfa94029e2 (patch) | |
tree | 16dfa3009e8a94f137113534550f173693c3285e /xlators | |
parent | 34833364e9839f0036bccd58ec0a8a963e69263e (diff) |
features/shard: Take hole size into account while computing ia_size
Change-Id: I1a90ad6669c1cb79aaae6b4bd9621c75d9985c8a
BUG: 1207615
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/10446
Tested-by: NetBSD Build System
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Tested-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/features/shard/src/shard.c | 11 | ||||
-rw-r--r-- | xlators/features/shard/src/shard.h | 1 |
2 files changed, 10 insertions, 2 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index f44bcc5dbda..95d4de09256 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -1614,7 +1614,7 @@ shard_update_file_size (call_frame_t *frame, xlator_t *this) if (!xattr_req) goto err; - ret = shard_set_size_attrs (local->postbuf.ia_size, + ret = shard_set_size_attrs (local->postbuf.ia_size + local->hole_size, local->postbuf.ia_blocks, &size_attr); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to set size attrs for" @@ -1673,7 +1673,7 @@ shard_writev_do_cbk (call_frame_t *frame, void *cookie, xlator_t *this, call_count = shard_call_count_return (frame); if (call_count == 0) { if (local->op_ret < 0) { - SHARD_STACK_UNWIND (writev, frame, local->op_ret, + SHARD_STACK_UNWIND (writev, frame, local->written_size, local->op_errno, NULL, NULL, NULL); } else { if (xdata) @@ -1793,6 +1793,13 @@ shard_post_lookup_writev_handler (call_frame_t *frame, xlator_t *this) } local->postbuf = local->prebuf; + + /* At this point, calculate the size of the hole if it is going to be + * created as part of this write. + */ + if (local->offset > local->prebuf.ia_size) + local->hole_size = local->offset - local->prebuf.ia_size; + shard_writev_do (frame, this); return 0; diff --git a/xlators/features/shard/src/shard.h b/xlators/features/shard/src/shard.h index ed452b50190..365616c108c 100644 --- a/xlators/features/shard/src/shard.h +++ b/xlators/features/shard/src/shard.h @@ -151,6 +151,7 @@ typedef struct shard_local { off_t offset; size_t total_size; size_t written_size; + size_t hole_size; loc_t loc; loc_t dot_shard_loc; loc_t loc2; |