summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-transaction.c
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2013-06-27 12:59:14 +0530
committerVijay Bellur <vbellur@redhat.com>2013-06-27 23:34:29 -0700
commit0c05cde4a16c426089933803d082183227422307 (patch)
tree78c6d3646e6d1aba4827b0cc77015f7054474ca3 /xlators/cluster/afr/src/afr-transaction.c
parent4bea8a2cfeaa8e037c6566b6a192bc31a2c004ca (diff)
cluster/afr: Handle NULL fdctx in fsync
Problem: If fdctx is NULL in afr_fsync, process crashes because of NULL dereference. Fix: if fdctx is NULL, always say witnessed unstable write so that fsyncs are done properly. Handled fdctx being null in afr_delayed_changelog_post_op otherwise fsync stub is never resumed and the mount was hanging. Change-Id: Icacc900e9be63c29db3325cb0e19cc250adebaac BUG: 978794 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: http://review.gluster.org/5258 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-transaction.c')
-rw-r--r--xlators/cluster/afr/src/afr-transaction.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c
index 8f3673acee9..0ae4fe47761 100644
--- a/xlators/cluster/afr/src/afr-transaction.c
+++ b/xlators/cluster/afr/src/afr-transaction.c
@@ -1402,6 +1402,8 @@ afr_fd_has_witnessed_unstable_write (xlator_t *this, fd_t *fd)
gf_boolean_t witness = _gf_false;
fdctx = afr_fd_ctx_get (fd, this);
+ if (!fdctx)
+ return _gf_true;
LOCK(&fd->lock);
{
@@ -1568,7 +1570,7 @@ afr_delayed_changelog_post_op (xlator_t *this, call_frame_t *frame, fd_t *fd,
fd_ctx = afr_fd_ctx_get (fd, this);
if (!fd_ctx)
- return;
+ goto out;
delta.tv_sec = priv->post_op_delay_secs;
delta.tv_usec = 0;
@@ -1590,6 +1592,7 @@ afr_delayed_changelog_post_op (xlator_t *this, call_frame_t *frame, fd_t *fd,
unlock:
pthread_mutex_unlock (&fd_ctx->delay_lock);
+out:
if (prev_frame) {
local = prev_frame->local;
local->transaction.resume_stub = stub;