diff options
author | Vikas Gorur <vikas@gluster.com> | 2009-12-07 05:44:31 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-12-07 05:31:37 -0800 |
commit | a12bfdc8f32212354824a1b8dd7b27840518c4dc (patch) | |
tree | 4a163a15206ebe42e1fa6bbb466cd5ade6e4043c | |
parent | 0ae2b4be39214426a50f5e1fd09562f309819f32 (diff) |
cluster/afr: Sync the parent directory's mtime during missing entries self-heal.
Signed-off-by: Vikas Gorur <vikas@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 137 (Parent directory mtime not reset after a create in self-heal)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=137
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index a0e19210a..fe48660c0 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -834,6 +834,8 @@ sh_destroy_cbk (call_frame_t *frame, void *cookie, xlator_t *this, { afr_local_t *local = NULL; + loc_t *parent_loc = cookie; + int call_count = 0; local = frame->local; @@ -844,6 +846,11 @@ sh_destroy_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local->loc.path, strerror (op_errno)); } + if (parent_loc) { + loc_wipe (parent_loc); + FREE (parent_loc); + } + call_count = afr_frame_return (frame); if (call_count == 0) { @@ -869,6 +876,8 @@ sh_missing_entries_newentry_cbk (call_frame_t *frame, void *cookie, int call_count = 0; int child_index = 0; + loc_t *parent_loc = NULL; + struct stat stbuf; int32_t valid; @@ -901,16 +910,27 @@ sh_missing_entries_newentry_cbk (call_frame_t *frame, void *cookie, setattr_frame->local = CALLOC (1, sizeof (afr_local_t)); - ((afr_local_t *)setattr_frame->local)->call_count = 1; + ((afr_local_t *)setattr_frame->local)->call_count = 2; gf_log (this->name, GF_LOG_TRACE, "setattr (%s) on subvolume %s", local->loc.path, priv->children[child_index]->name); - STACK_WIND (setattr_frame, sh_destroy_cbk, - priv->children[child_index], - priv->children[child_index]->fops->setattr, - &local->loc, &stbuf, valid); + STACK_WIND_COOKIE (setattr_frame, sh_destroy_cbk, + (void *) (long) 0, + priv->children[child_index], + priv->children[child_index]->fops->setattr, + &local->loc, &stbuf, valid); + + valid = GF_SET_ATTR_ATIME | GF_SET_ATTR_MTIME; + parent_loc = CALLOC (1, sizeof (*parent_loc)); + afr_build_parent_loc (parent_loc, &local->loc); + + STACK_WIND_COOKIE (setattr_frame, sh_destroy_cbk, + (void *) (long) parent_loc, + priv->children[child_index], + priv->children[child_index]->fops->setattr, + parent_loc, &sh->parentbuf, valid); } call_count = afr_frame_return (frame); @@ -1224,7 +1244,7 @@ sh_missing_entries_lookup_cbk (call_frame_t *frame, void *cookie, buf->st_mode); local->self_heal.buf[child_index] = *buf; - + local->self_heal.parentbuf = *postparent; } else { gf_log (this->name, GF_LOG_TRACE, "path %s on subvolume %s => -1 (%s)", |