diff options
| author | Pranith Kumar K <pranithk@gluster.com> | 2011-12-20 10:05:12 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-12-22 05:18:11 -0800 | 
| commit | d7d9f3d4002d31ceefed6ce80ec7567eca9ba6d3 (patch) | |
| tree | c17e78eb3caee1df305bc612b22b402d36598037 | |
| parent | 5ccbfdd87bebbc4c65a76c72191ac564ff844df8 (diff) | |
cluster/afr: Set pargfid when missingv3.3.0qa18
client asserts for missing pargfid in case of unlink. So
Afr needs to make sure it is present in that fop.
Change-Id: Iea0ad65e1e7254c8df412942c52d5870e853aa51
BUG: 769055
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Reviewed-on: http://review.gluster.com/2495
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 5 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.h | 3 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 10 | 
3 files changed, 14 insertions, 4 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 2d37eaad5..44bced74c 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1385,6 +1385,7 @@ afr_sh_remove_entry_cbk (call_frame_t *frame, xlator_t *this, int child,  void  afr_sh_call_entry_expunge_remove (call_frame_t *frame, xlator_t *this,                                    int child_index, struct iatt *buf, +                                  struct iatt *parentbuf,                                    afr_expunge_done_cbk_t expunge_done)  {          call_frame_t    *expunge_frame = NULL; @@ -1408,7 +1409,8 @@ afr_sh_call_entry_expunge_remove (call_frame_t *frame, xlator_t *this,          expunge_sh->sh_frame = frame;          loc_copy (&expunge_local->loc, &local->loc);          sh->expunge_done = expunge_done; -        afr_sh_entry_expunge_remove (expunge_frame, this, child_index, buf); +        afr_sh_entry_expunge_remove (expunge_frame, this, child_index, buf, +                                     parentbuf);          return;  out:          gf_log (this->name, GF_LOG_ERROR, "Expunge of %s failed, reason: %s", @@ -1540,6 +1542,7 @@ afr_sh_purge_entry_common (call_frame_t *frame, xlator_t *this,                          "on %d", local->loc.path, i);                  afr_sh_call_entry_expunge_remove (frame, this,                                                    (long) i, &sh->buf[i], +                                                  &sh->parentbufs[i],                                                    afr_sh_remove_entry_cbk);          }  out: diff --git a/xlators/cluster/afr/src/afr-self-heal-common.h b/xlators/cluster/afr/src/afr-self-heal-common.h index da02bfdcf..77c3375cc 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.h +++ b/xlators/cluster/afr/src/afr-self-heal-common.h @@ -97,7 +97,8 @@ afr_sh_common_lookup (call_frame_t *frame, xlator_t *this, loc_t *loc,                        int32_t flags);  int  afr_sh_entry_expunge_remove (call_frame_t *expunge_frame, xlator_t *this, -                             int active_src, struct iatt *buf); +                             int active_src, struct iatt *buf, +                             struct iatt *parentbuf);  int  afr_sh_entrylk (call_frame_t *frame, xlator_t *this, loc_t *loc,                  char *base_name, afr_lock_cbk_t lock_cbk); diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index f87de0c1f..3359029c3 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -475,7 +475,8 @@ afr_sh_entry_expunge_rmdir (call_frame_t *expunge_frame, xlator_t *this,  int  afr_sh_entry_expunge_remove (call_frame_t *expunge_frame, xlator_t *this, -                             int active_src, struct iatt *buf) +                             int active_src, struct iatt *buf, +                             struct iatt *parentbuf)  {          afr_private_t   *priv = NULL;          afr_local_t     *expunge_local = NULL; @@ -484,6 +485,7 @@ afr_sh_entry_expunge_remove (call_frame_t *expunge_frame, xlator_t *this,          int              type = 0;          afr_self_heal_t *sh            = NULL;          afr_local_t     *local         = NULL; +        loc_t           *loc           = NULL;          priv = this->private;          expunge_local = expunge_frame->local; @@ -491,8 +493,11 @@ afr_sh_entry_expunge_remove (call_frame_t *expunge_frame, xlator_t *this,          frame = expunge_sh->sh_frame;          local         = frame->local;          sh            = &local->self_heal; +        loc           = &expunge_local->loc;          type = buf->ia_type; +        if (loc->parent && uuid_is_null (loc->parent->gfid)) +                uuid_copy (loc->pargfid, parentbuf->ia_gfid);          switch (type) {          case IA_IFSOCK: @@ -556,7 +561,8 @@ afr_sh_entry_expunge_lookup_cbk (call_frame_t *expunge_frame, void *cookie,                  goto out;          } -        afr_sh_entry_expunge_remove (expunge_frame, this, active_src, buf); +        afr_sh_entry_expunge_remove (expunge_frame, this, active_src, buf, +                                     postparent);          return 0;  out:  | 
