diff options
| -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 aba54a491ed..4e78b49ee56 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -1626,7 +1626,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" @@ -1685,7 +1685,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) @@ -1805,6 +1805,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;  | 
