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 /xlators/cluster/afr | |
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
Diffstat (limited to 'xlators/cluster/afr')
-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) { |