diff options
-rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index c96603b8295..b7c522fe588 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -253,16 +253,18 @@ struct ios_local { #define BUMP_STATS(iosstat, type) \ do { \ struct ios_conf *conf = NULL; \ + uint64_t value = 0; \ \ conf = this->private; \ \ LOCK(&iosstat->lock); \ { \ iosstat->counters[type]++; \ - ios_stat_add_to_list (&conf->list[type], \ - iosstat->counters[type], iosstat); \ + value = iosstat->counters[type]; \ } \ UNLOCK (&iosstat->lock); \ + ios_stat_add_to_list (&conf->list[type], \ + value, iosstat); \ \ } while (0) @@ -273,6 +275,7 @@ struct ios_local { double elapsed; \ struct timeval *begin, *end; \ double throughput; \ + int flag = 0; \ \ begin = &frame->begin; \ end = &frame->end; \ @@ -290,11 +293,13 @@ struct ios_local { throughput; \ gettimeofday (&iosstat-> \ thru_counters[type].time, NULL); \ - ios_stat_add_to_list (&conf->thru_list[type], \ - throughput, iosstat); \ + flag = 1; \ } \ } \ UNLOCK (&iosstat->lock); \ + if (flag) \ + ios_stat_add_to_list (&conf->thru_list[type], \ + throughput, iosstat); \ } while (0) int @@ -329,7 +334,12 @@ ios_fd_ctx_set (fd_t *fd, xlator_t *this, struct ios_fd *iosfd) int ios_stat_ref (struct ios_stat *iosstat) { - iosstat->refcnt++; + LOCK (&iosstat->lock); + { + iosstat->refcnt++; + } + UNLOCK (&iosstat->lock); + return iosstat->refcnt; } |