@@ -71,6 +71,8 @@ struct struct_io_stats {
int reserved;
unsigned long long bytes_read;
unsigned long long bytes_written;
+ unsigned long long cache_hits;
+ unsigned long long cache_misses;
};
struct struct_io_manager {
@@ -536,6 +536,7 @@ static struct unix_cache *find_cached_block(struct unix_private_data *data,
}
if (cache->block == block) {
cache->access_time = ++data->access_time;
+ data->io_stats.cache_hits++;
return cache;
}
if (!oldest_cache ||
@@ -544,6 +545,7 @@ static struct unix_cache *find_cached_block(struct unix_private_data *data,
}
if (eldest)
*eldest = (unused_cache) ? unused_cache : oldest_cache;
+ data->io_stats.cache_misses++;
return 0;
}
@@ -737,7 +739,7 @@ static errcode_t unix_open_channel(const char *name, int fd,
memset(data, 0, sizeof(struct unix_private_data));
data->magic = EXT2_ET_MAGIC_UNIX_IO_CHANNEL;
- data->io_stats.num_fields = 2;
+ data->io_stats.num_fields = 4;
data->flags = flags;
data->dev = fd;
@@ -604,6 +604,19 @@ static void op_destroy(void *p EXT2FS_ATTR((unused)))
translate_error(fs, 0, err);
}
+ if (ff->debug && fs->io->manager->get_stats) {
+ io_stats stats = NULL;
+
+ fs->io->manager->get_stats(fs->io, &stats);
+ dbg_printf(ff, "read: %lluk\n", stats->bytes_read >> 10);
+ dbg_printf(ff, "write: %lluk\n", stats->bytes_written >> 10);
+ dbg_printf(ff, "hits: %llu\n", stats->cache_hits);
+ dbg_printf(ff, "misses: %llu\n", stats->cache_misses);
+ dbg_printf(ff, "hit_ratio: %.1f%%\n",
+ (100.0 * stats->cache_hits) /
+ (stats->cache_hits + stats->cache_misses));
+ }
+
if (ff->kernel) {
char uuid[UUID_STR_SIZE];