- struct disk_util_stat *dus;
- struct flist_head *entry, *next;
- struct disk_util *du;
- double util;
-
- if (flist_empty(&disk_list))
- return;
-
- log_info("\nDisk stats (read/write):\n");
-
- flist_for_each(entry, &disk_list) {
- du = flist_entry(entry, struct disk_util, list);
- dus = &du->dus;
-
- util = (double) 100 * du->dus.io_ticks / (double) du->msec;
- if (util > 100.0)
- util = 100.0;
-
- /* If this node is the slave of a master device, as
- * happens in case of software RAIDs, inward-indent
- * this stats line to reflect a master-slave
- * relationship. Because the master device gets added
- * before the slave devices, we can safely assume that
- * the master's stats line has been displayed in a
- * previous iteration of this loop.
- */
- if (!flist_empty(&du->slavelist))
- log_info(" ");
-
- log_info(" %s: ios=%u/%u, merge=%u/%u, ticks=%u/%u, "
- "in_queue=%u, util=%3.2f%%", du->name,
- dus->ios[0], dus->ios[1],
- dus->merges[0], dus->merges[1],
- dus->ticks[0], dus->ticks[1],
- dus->time_in_queue, util);
-
- /* If the device has slaves, aggregate the stats for
- * those slave devices also.
- */
- if (!flist_empty(&du->slaves))
- aggregate_slaves_stats(du);
-
- log_info("\n");
- }
-
- /*
- * now free the list
- */
- flist_for_each_safe(entry, next, &disk_list) {
- flist_del(entry);
- du = flist_entry(entry, struct disk_util, list);
- disk_util_free(du);
- }