diff options
| author | Pranith K <pranithk@gluster.com> | 2011-03-11 05:02:15 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2011-03-22 04:20:21 -0700 | 
| commit | a4233a41bf6a2f9ddbce15a530b1678c55ba24a5 (patch) | |
| tree | d73519669b6f54d0550c05f89082d07e5b4d7295 | |
| parent | e115072f4b654d407fcf435256334645ab471776 (diff) | |
cluster/afr: skip openfd flush when the file is already deleted
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 2497 (client crashes)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2497
| -rw-r--r-- | xlators/cluster/afr/src/afr-open.c | 23 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 2 | 
2 files changed, 19 insertions, 6 deletions
diff --git a/xlators/cluster/afr/src/afr-open.c b/xlators/cluster/afr/src/afr-open.c index 074a9d32c66..8c87ce89328 100644 --- a/xlators/cluster/afr/src/afr-open.c +++ b/xlators/cluster/afr/src/afr-open.c @@ -367,13 +367,17 @@ afr_prepare_loc (call_frame_t *frame, fd_t *fd)          char           *path = NULL;          int             ret = 0; -        if (!fd) +        if ((!fd) || (!fd->inode))                  return -1;          local = frame->local;          ret = inode_path (fd->inode, NULL, (char **)&path); -        if (ret <= 0) +        if (ret <= 0) { +                gf_log (frame->this->name, GF_LOG_DEBUG, +                        "Unable to get path for gfid: %s", +                        uuid_utoa (fd->inode->gfid));                  return -1; +        }          if (local->loc.path) {                  if (strcmp (path, local->loc.path)) @@ -414,8 +418,7 @@ afr_openfd_sh (call_frame_t *frame, xlator_t *this)          local = frame->local;          sh    = &local->self_heal; -        afr_prepare_loc (frame, local->fd); - +        GF_ASSERT (local->loc.path);          /* forcibly trigger missing-entries self-heal */          local->success_count    = 1; @@ -583,6 +586,16 @@ afr_openfd_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)          local = frame->local;          /* +         * If the file is already deleted while the fd is open, no need to +         * perform the openfd flush, call the flush_cbk and get out. +         */ +        ret = afr_prepare_loc (frame, fd); +        if (ret < 0) { +                local->openfd_flush_cbk (frame, this); +                goto out; +        } + +        /*           * Some subvolumes might have come up on which we never           * opened this fd in the first place. Re-open fd's on those           * subvolumes now. @@ -612,8 +625,6 @@ afr_openfd_flush (call_frame_t *frame, xlator_t *this, fd_t *fd)                  goto out;          } -        afr_prepare_loc (frame, fd); -          local->call_count = call_count;          for (i = 0; i < priv->child_count; i++) { diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 30f0cbe09da..16e051c6ff9 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -1559,6 +1559,8 @@ afr_self_heal (call_frame_t *frame, xlator_t *this)  	local = frame->local;  	priv  = this->private; +        GF_ASSERT (local->loc.path); +          afr_set_lk_owner (frame, this);          if (local->self_heal.background) {  | 
