+#if HAVE_IOKIT_IOKITLIB_H
+ CFDictionaryRef props_dict;
+ CFDictionaryRef stats_dict;
+ io_registry_entry_t disk;
+ io_iterator_t disk_list;
+
+ signed long long read_ops;
+ signed long long read_byt;
+ signed long long read_tme;
+ signed long long write_ops;
+ signed long long write_byt;
+ signed long long write_tme;
+
+ /* Get the list of all disk objects. */
+ if (IOServiceGetMatchingServices (io_master_port,
+ IOServiceMatching (kIOBlockStorageDriverClass),
+ &disk_list) != kIOReturnSuccess)
+ {
+ syslog (LOG_ERR, "disk-plugin: IOServiceGetMatchingServices failed.");
+ return;
+ }
+
+ while ((disk = IOIteratorNext (disk_list)) != NULL)
+ {
+ props_dict = NULL;
+ stats_dict = NULL;
+
+ /* We create `props_dict' => we need to release it later */
+ if (IORegistryEntryCreateCFProperties (disk,
+ (CFMutableDictionaryRef *) &props_dict,
+ kCFAllocatorDefault,
+ kNilOptions)
+ != kIOReturnSuccess)
+ {
+ syslog (LOG_ERR, "disk-plugin: IORegistryEntryCreateCFProperties failed.");
+ continue;
+ }
+
+ if (props_dict == NULL)
+ continue;
+
+ stats_dict = (CFDictionaryRef) CFDictionaryGetValue (props_dict,
+ CFSTR (kIOBlockStorageDriverStatisticsKey));
+
+ if (stats_dict == NULL)
+ {
+ CFRelease (props_dict);
+ continue;
+ }
+
+ read_ops = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsReadsKey);
+ read_byt = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsBytesReadKey);
+ read_tme = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsTotalReadTimeKey);
+ write_ops = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsWritesKey);
+ write_byt = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsBytesWrittenKey);
+ write_tme = dict_get_value (stats_dict,
+ kIOBlockStorageDriverStatisticsTotalWriteTimeKey);
+
+ if ((read_ops != -1LL)
+ || (read_byt != -1LL)
+ || (read_tme != -1LL)
+ || (write_ops != -1LL)
+ || (write_byt != -1LL)
+ || (write_tme != -1LL))
+ disk_submit (kIOBlockStorageDriverClass, /* FIXME */
+ read_ops, 0ULL, read_byt, read_tme,
+ write_ops, 0ULL, write_byt, write_tme);
+
+ CFRelease (props_dict);
+ IOObjectRelease (disk);
+ }
+ IOObjectRelease (disk_list);
+/* #endif HAVE_IOKIT_IOKITLIB_H */
+
+#elif KERNEL_LINUX