libgfapi, timer: Fix a crash seen in timer when glfs_fini was invoked.
The crash is seen when, glfs_init failed for some reason and glfs_fini was called for cleaning up the partial initialization. The fix is in two folds: 1. In timer store and restore the THIS, previously it was being overwritten. 2. In glfs_free_from_ctx() and glfs_fini() check for NULL before destroying. Change-Id: If40bf69936b873a1da8e348c9d92c66f2f07994b BUG: 1202290 Signed-off-by: Poornima G <pgurusid@redhat.com> Reviewed-on: http://review.gluster.org/9895 Reviewed-by: Raghavendra Talur <rtalur@redhat.com> Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
This commit is contained in:
parent
33944a3eb3
commit
c99c72b35f
@ -664,7 +664,9 @@ priv_glfs_free_from_ctx (struct glfs *fs)
|
||||
|
||||
(void) pthread_mutex_destroy (&fs->mutex);
|
||||
|
||||
FREE (fs->volname);
|
||||
if (fs->volname)
|
||||
FREE (fs->volname);
|
||||
|
||||
FREE (fs);
|
||||
}
|
||||
|
||||
@ -934,13 +936,17 @@ pub_glfs_fini (struct glfs *fs)
|
||||
}
|
||||
|
||||
ctx = fs->ctx;
|
||||
if (!ctx) {
|
||||
goto free_fs;
|
||||
}
|
||||
|
||||
__glfs_entry_fs (fs);
|
||||
|
||||
if (ctx->mgmt) {
|
||||
rpc_clnt_disable (ctx->mgmt);
|
||||
ctx->mgmt = NULL;
|
||||
}
|
||||
|
||||
__glfs_entry_fs (fs);
|
||||
|
||||
call_pool = fs->ctx->pool;
|
||||
|
||||
while (countdown--) {
|
||||
@ -1069,6 +1075,7 @@ pub_glfs_fini (struct glfs *fs)
|
||||
if (glusterfs_ctx_destroy (ctx) != 0)
|
||||
ret = -1;
|
||||
|
||||
free_fs:
|
||||
glfs_free_from_ctx (fs);
|
||||
|
||||
fail:
|
||||
|
@ -141,6 +141,7 @@ gf_timer_proc (void *ctx)
|
||||
gf_timer_registry_t *reg = NULL;
|
||||
const struct timespec sleepts = {.tv_sec = 1, .tv_nsec = 0, };
|
||||
gf_timer_t *event = NULL;
|
||||
xlator_t *old_THIS = NULL;
|
||||
|
||||
if (ctx == NULL)
|
||||
{
|
||||
@ -174,11 +175,16 @@ gf_timer_proc (void *ctx)
|
||||
}
|
||||
}
|
||||
pthread_mutex_unlock (®->lock);
|
||||
if (event->xl)
|
||||
THIS = event->xl;
|
||||
if (need_cbk)
|
||||
event->callbk (event->data);
|
||||
|
||||
if (need_cbk) {
|
||||
if (event->xl) {
|
||||
old_THIS = THIS;
|
||||
THIS = event->xl;
|
||||
}
|
||||
event->callbk (event->data);
|
||||
if (event->xl) {
|
||||
THIS = old_THIS;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user