diff options
| author | Krutika Dhananjay <kdhananj@redhat.com> | 2017-02-22 14:43:46 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2017-02-27 00:00:35 -0500 | 
| commit | a10bc7da360c95524cd79b30d364134f2368f348 (patch) | |
| tree | af65b0adb7261fd5d153e67d736c8942d5857baa | |
| parent | d5dc766ae5489eaa7745c6784022140ac442d3de (diff) | |
features/shard: Put onus of choosing the inode to resolve on individual fops
        Backport of: https://review.gluster.org/16709
... as opposed to adding checks in "common" functions to choose the inode
to resolve based local->fop, which is rather ugly and prone to errors.
Change-Id: I84c5b26160150f2fd87e7f245190c500a4b36bd8
BUG: 1426512
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: https://review.gluster.org/16751
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
| -rw-r--r-- | xlators/features/shard/src/shard.c | 46 | ||||
| -rw-r--r-- | xlators/features/shard/src/shard.h | 1 | 
2 files changed, 21 insertions, 26 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index bdd8934244c..7e8eecc4cfe 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -549,19 +549,20 @@ shard_common_inode_write_success_unwind (glusterfs_fop_t fop,  int  shard_common_resolve_shards (call_frame_t *frame, xlator_t *this, -                             inode_t *res_inode,                               shard_post_resolve_fop_handler_t post_res_handler)  {          int                   i              = -1;          uint32_t              shard_idx_iter = 0;          char                  path[PATH_MAX] = {0,};          inode_t              *inode          = NULL; +        inode_t              *res_inode      = NULL;          shard_priv_t         *priv           = NULL;          shard_local_t        *local          = NULL;          priv = this->private;          local = frame->local;          shard_idx_iter = local->first_block; +        res_inode = local->resolver_base_inode;          if (local->op_ret < 0)                  goto out; @@ -797,10 +798,7 @@ shard_lookup_dot_shard_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          }          shard_link_dot_shard_inode (local, inode, buf); -        shard_common_resolve_shards (frame, this, -                                     (local->fop == GF_FOP_RENAME) ? -                                     local->loc2.inode : local->loc.inode, -                                     local->post_res_handler); +        shard_common_resolve_shards (frame, this, local->post_res_handler);          return 0;  unwind: @@ -1813,6 +1811,8 @@ shard_truncate_begin (call_frame_t *frame, xlator_t *this)                                                 local->block_size);          local->num_blocks = local->last_block - local->first_block + 1; +        local->resolver_base_inode = (local->fop == GF_FOP_TRUNCATE) ? +                                     local->loc.inode : local->fd->inode;          if ((local->first_block == 0) && (local->num_blocks == 1)) {                  if (local->fop == GF_FOP_TRUNCATE) @@ -1844,9 +1844,6 @@ shard_truncate_begin (call_frame_t *frame, xlator_t *this)                                          shard_post_resolve_truncate_handler);          } else {                  shard_common_resolve_shards (frame, this, -                                             (local->fop == GF_FOP_TRUNCATE) ? -                                              local->loc.inode : -                                              local->fd->inode,                                             shard_post_resolve_truncate_handler);          }          return 0; @@ -2158,10 +2155,7 @@ shard_post_lookup_shards_unlink_handler (call_frame_t *frame, xlator_t *this)          local->op_ret = 0;          local->op_errno = 0; -        shard_unlink_shards_do (frame, this, -                                (local->fop == GF_FOP_RENAME) -                                             ? local->loc2.inode -                                             : local->loc.inode); +        shard_unlink_shards_do (frame, this, local->resolver_base_inode);          return 0;  } @@ -2208,14 +2202,10 @@ shard_post_resolve_unlink_handler (call_frame_t *frame, xlator_t *this)          if (!local->call_count)                  shard_unlink_shards_do (frame, this, -                                        (local->fop == GF_FOP_RENAME) -                                                     ? local->loc2.inode -                                                     : local->loc.inode); +                                        local->resolver_base_inode);          else                  shard_common_lookup_shards (frame, this, -                                            (local->fop == GF_FOP_RENAME) -                                                         ? local->loc2.inode -                                                         : local->loc.inode, +                                            local->resolver_base_inode,                                         shard_post_lookup_shards_unlink_handler);          return 0;  } @@ -2252,6 +2242,7 @@ shard_unlink_base_file_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local->last_block = get_highest_block (0, local->prebuf.ia_size,                                                 local->block_size);          local->num_blocks = local->last_block - local->first_block + 1; +        local->resolver_base_inode = local->loc.inode;          /* num_blocks = 1 implies that the file has not crossed its           * shard block size. So unlink boils down to unlinking just the @@ -2282,7 +2273,7 @@ shard_unlink_base_file_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  shard_lookup_dot_shard (frame, this,                                          shard_post_resolve_unlink_handler);          } else { -                shard_common_resolve_shards (frame, this, local->loc.inode, +                shard_common_resolve_shards (frame, this,                                               shard_post_resolve_unlink_handler);          } @@ -2602,6 +2593,7 @@ shard_rename_unlink_dst_shards_do (call_frame_t *frame, xlator_t *this)          local->last_block = get_highest_block (0, local->postbuf.ia_size,                                                 local->dst_block_size);          local->num_blocks = local->last_block - local->first_block + 1; +        local->resolver_base_inode = local->loc2.inode;          if ((local->xattr_rsp) &&              (!dict_get_uint32 (local->xattr_rsp, GET_LINK_COUNT, &link_count)) @@ -2629,7 +2621,7 @@ shard_rename_unlink_dst_shards_do (call_frame_t *frame, xlator_t *this)                  shard_lookup_dot_shard (frame, this,                                          shard_post_resolve_unlink_handler);          } else { -                shard_common_resolve_shards (frame, this, local->loc2.inode, +                shard_common_resolve_shards (frame, this,                                               shard_post_resolve_unlink_handler);          } @@ -3358,6 +3350,7 @@ shard_post_lookup_readv_handler (call_frame_t *frame, xlator_t *this)                                                 local->block_size);          local->num_blocks = local->last_block - local->first_block + 1; +        local->resolver_base_inode = local->loc.inode;          local->inode_list = GF_CALLOC (local->num_blocks, sizeof (inode_t *),                                         gf_shard_mt_inode_list); @@ -3392,7 +3385,7 @@ shard_post_lookup_readv_handler (call_frame_t *frame, xlator_t *this)                  shard_lookup_dot_shard (frame, this,                                          shard_post_resolve_readv_handler);          } else { -                shard_common_resolve_shards (frame, this, local->loc.inode, +                shard_common_resolve_shards (frame, this,                                               shard_post_resolve_readv_handler);          }          return 0; @@ -3876,8 +3869,7 @@ shard_mkdir_dot_shard_cbk (call_frame_t *frame, void *cookie,          shard_link_dot_shard_inode (local, inode, buf);  unwind: -        shard_common_resolve_shards (frame, this, local->loc.inode, -                                     local->post_res_handler); +        shard_common_resolve_shards (frame, this, local->post_res_handler);          return 0;  } @@ -4620,6 +4612,7 @@ shard_common_inode_write_begin (call_frame_t *frame, xlator_t *this,          local->last_block = get_highest_block (offset, local->total_size,                                                 local->block_size);          local->num_blocks = local->last_block - local->first_block + 1; +        local->resolver_base_inode = local->fd->inode;          local->inode_list = GF_CALLOC (local->num_blocks, sizeof (inode_t *),                                         gf_shard_mt_inode_list);          if (!local->inode_list) @@ -4638,12 +4631,13 @@ shard_common_inode_write_begin (call_frame_t *frame, xlator_t *this,          local->dot_shard_loc.inode = inode_find (this->itable,                                                   priv->dot_shard_gfid); -        if (!local->dot_shard_loc.inode) +        if (!local->dot_shard_loc.inode) {                  shard_mkdir_dot_shard (frame, this,                                   shard_common_inode_write_post_resolve_handler); -        else -                shard_common_resolve_shards (frame, this, local->loc.inode, +        } else { +                shard_common_resolve_shards (frame, this,                                   shard_common_inode_write_post_resolve_handler); +        }          return 0;  out: diff --git a/xlators/features/shard/src/shard.h b/xlators/features/shard/src/shard.h index 8303a2ca030..f626fae33c1 100644 --- a/xlators/features/shard/src/shard.h +++ b/xlators/features/shard/src/shard.h @@ -254,6 +254,7 @@ typedef struct shard_local {                  fop_inodelk_cbk_t inodelk_cbk;                  shard_lock_t *shard_lock;          } lock; +        inode_t *resolver_base_inode;  } shard_local_t;  typedef struct shard_inode_ctx {  | 
