summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/debug/io-stats/src/io-stats.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c
index 6a2aa586ab1..8cc4bf13bf1 100644
--- a/xlators/debug/io-stats/src/io-stats.c
+++ b/xlators/debug/io-stats/src/io-stats.c
@@ -381,6 +381,7 @@ ios_stat_unref (struct ios_stat *iosstat)
UNLOCK (&iosstat->lock);
if (cleanup) {
+ LOCK_DESTROY (&iosstat->lock);
GF_FREE (iosstat);
iosstat = NULL;
}
@@ -2747,6 +2748,17 @@ mem_acct_init (xlator_t *this)
return ret;
}
+void
+ios_conf_destroy (struct ios_conf *conf)
+{
+ if (!conf)
+ return;
+
+ ios_destroy_top_stats (conf);
+ LOCK_DESTROY (&conf->lock);
+ GF_FREE(conf);
+}
+
int
init (xlator_t *this)
{
@@ -2782,12 +2794,13 @@ init (xlator_t *this)
conf = GF_CALLOC (1, sizeof(*conf), gf_io_stats_mt_ios_conf);
- if (!conf) {
- gf_log (this->name, GF_LOG_ERROR,
- "Out of memory.");
- return -1;
- }
+ if (!conf)
+ goto out;
+ /*
+ * Init it just after calloc, so that we are sure the lock is inited
+ * in case of error paths.
+ */
LOCK_INIT (&conf->lock);
gettimeofday (&conf->cumulative.started_at, NULL);
@@ -2795,7 +2808,7 @@ init (xlator_t *this)
ret = ios_init_top_stats (conf);
if (ret)
- return -1;
+ goto out;
GF_OPTION_INIT ("dump-fd-stats", conf->dump_fd_stats, bool, out);
@@ -2838,13 +2851,14 @@ init (xlator_t *this)
this->private = conf;
ret = 0;
out:
- if (!this->private)
+ if (!this->private) {
+ ios_conf_destroy (conf);
ret = -1;
+ }
return ret;
}
-
void
fini (xlator_t *this)
{
@@ -2854,15 +2868,9 @@ fini (xlator_t *this)
return;
conf = this->private;
-
- if (!conf)
- return;
this->private = NULL;
- ios_destroy_top_stats (conf);
-
- GF_FREE(conf);
-
+ ios_conf_destroy (conf);
gf_log (this->name, GF_LOG_INFO,
"io-stats translator unloaded");
return;