From f0f90361f532065721362591b909edd3f2f22588 Mon Sep 17 00:00:00 2001 From: Pranith K Date: Tue, 22 Mar 2011 02:03:46 +0000 Subject: cluster/afr: skip openfd flush when the file is already deleted Signed-off-by: Pranith Kumar K Signed-off-by: Anand Avati BUG: 2497 (client crashes) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2497 --- xlators/cluster/afr/src/afr-open.c | 23 +++++++++++++++++------ 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 074a9d32c..8c87ce893 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; @@ -582,6 +585,16 @@ afr_openfd_flush (call_frame_t *frame, xlator_t *this, fd_t *fd) priv = this->private; 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 @@ -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 e716e20ef..764b99807 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) { -- cgit