From 0d02e8358ad0dbb5148e1df9bb015d8aebcfdc4c Mon Sep 17 00:00:00 2001 From: Mike Snitzer Date: Mon, 5 Aug 2013 18:18:27 -0400 Subject: [PATCH 8/9] dm stats: factor dm_stat_bio out of dm_stats_bio agk raised this as something to fixup due to embedded declarations --- drivers/md/dm-stats.c | 68 +++++++++++++++++++++++++++--------------------- 1 files changed, 38 insertions(+), 30 deletions(-) diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c index 850084e..2025228 100644 --- a/drivers/md/dm-stats.c +++ b/drivers/md/dm-stats.c @@ -457,6 +457,42 @@ static void dm_stat_for_entry(struct dm_stat *m, size_t entry, preempt_enable(); } +void dm_stat_bio(struct dm_stat *m, unsigned long bi_rw, + sector_t bi_sector, sector_t end_sector, + bool end, unsigned long duration, struct dm_stats_aux *aux) +{ + sector_t rel_sector, offset; + unsigned todo; + size_t entry; + unsigned fragment_len; + + if (end_sector <= m->start || bi_sector >= m->end) + return; + if (unlikely(bi_sector < m->start)) { + rel_sector = 0; + todo = end_sector - m->start; + } else { + rel_sector = bi_sector - m->start; + todo = end_sector - bi_sector; + } + if (unlikely(end_sector > m->end)) + todo -= end_sector - m->end; + + offset = sector_div(rel_sector, m->step); + entry = rel_sector; + do { + BUG_ON(entry >= m->n_entries); + fragment_len = todo; + if (fragment_len > m->step - offset) + fragment_len = m->step - offset; + dm_stat_for_entry(m, entry, bi_rw, fragment_len, + aux->merged, end, duration); + todo -= fragment_len; + entry++; + offset = 0; + } while (unlikely(todo != 0)); +} + void dm_stats_bio(struct dm_stats *st, unsigned long bi_rw, sector_t bi_sector, unsigned bi_sectors, bool end, unsigned long duration, struct dm_stats_aux *aux) @@ -485,36 +521,8 @@ void dm_stats_bio(struct dm_stats *st, rcu_read_lock(); - list_for_each_entry_rcu(m, &st->list, list_entry) { - sector_t rel_sector, offset; - unsigned todo; - size_t entry; - if (end_sector <= m->start || bi_sector >= m->end) - continue; - if (unlikely(bi_sector < m->start)) { - rel_sector = 0; - todo = end_sector - m->start; - } else { - rel_sector = bi_sector - m->start; - todo = end_sector - bi_sector; - } - if (unlikely(end_sector > m->end)) - todo -= end_sector - m->end; - offset = sector_div(rel_sector, m->step); - entry = rel_sector; - do { - unsigned fragment_len; - BUG_ON(entry >= m->n_entries); - fragment_len = todo; - if (fragment_len > m->step - offset) - fragment_len = m->step - offset; - dm_stat_for_entry(m, entry, bi_rw, fragment_len, - aux->merged, end, duration); - todo -= fragment_len; - entry++; - offset = 0; - } while (unlikely(todo != 0)); - } + list_for_each_entry_rcu(m, &st->list, list_entry) + dm_stat_bio(m, bi_rw, bi_sector, end_sector, end, duration, aux); rcu_read_unlock(); } -- 1.7.1