diff options
author | Mohit Agrawal <moagrawal@redhat.com> | 2018-11-26 14:40:00 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-12-11 04:01:40 +0000 |
commit | e82bcc33ed2d5cd54d3f918397f31818089299ad (patch) | |
tree | f392bbd8df4979f13eebac86df6177e88682ec13 /xlators | |
parent | 2b7b6ff28fa92335613d0b5715acd552cfcfd759 (diff) | |
download | glusterfs-e82bcc33ed2d5cd54d3f918397f31818089299ad.tar.gz glusterfs-e82bcc33ed2d5cd54d3f918397f31818089299ad.tar.xz glusterfs-e82bcc33ed2d5cd54d3f918397f31818089299ad.zip |
posix: posix_health_check_thread_proc crash due to priv is NULL
Problem: posix_fini sends a cancellation request to health_check
thread and cleanup priv without ensuring health_check thread
is running
Solution: Make health_check && disk_space thread joinable and call
gf_thread_cleanup_xint to wait unless thread is not finished
Change-Id: I4d37b08138766881dab0922a47ed68a2c3411f13
fixes: bz#1636570
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/storage/posix/src/posix-common.c | 15 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 8 |
2 files changed, 14 insertions, 9 deletions
diff --git a/xlators/storage/posix/src/posix-common.c b/xlators/storage/posix/src/posix-common.c index fd7c9fe779..111542ef3a 100644 --- a/xlators/storage/posix/src/posix-common.c +++ b/xlators/storage/posix/src/posix-common.c @@ -1071,18 +1071,25 @@ void posix_fini(xlator_t *this) { struct posix_private *priv = this->private; + gf_boolean_t health_check = _gf_false; + if (!priv) return; LOCK(&priv->lock); - if (priv->health_check_active) { + { + health_check = priv->health_check_active; priv->health_check_active = _gf_false; - pthread_cancel(priv->health_check); - priv->health_check = 0; } UNLOCK(&priv->lock); + + if (health_check) { + (void)gf_thread_cleanup_xint(priv->health_check); + priv->health_check = 0; + } + if (priv->disk_space_check) { priv->disk_space_check_active = _gf_false; - pthread_cancel(priv->disk_space_check); + (void)gf_thread_cleanup_xint(priv->disk_space_check); priv->disk_space_check = 0; } if (priv->janitor) { diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 8f76eacd8c..ed0516d4c4 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -2116,8 +2116,6 @@ posix_spawn_health_check_thread(xlator_t *xl) goto unlock; } - /* run the thread detached, resources will be freed on exit */ - pthread_detach(priv->health_check); priv->health_check_active = _gf_true; } unlock: @@ -2220,9 +2218,9 @@ posix_spawn_disk_space_check_thread(xlator_t *xl) priv->disk_space_check_active = _gf_false; } - ret = gf_thread_create_detached(&priv->disk_space_check, - posix_disk_space_check_thread_proc, xl, - "posix_reserve"); + ret = gf_thread_create(&priv->disk_space_check, NULL, + posix_disk_space_check_thread_proc, xl, + "posix_reserve"); if (ret < 0) { priv->disk_space_check_active = _gf_false; gf_msg(xl->name, GF_LOG_ERROR, errno, P_MSG_DISK_SPACE_CHECK_FAILED, |