/*
* Global variables
*/
+static value_to_rate_state_t arc_hits_state;
+static value_to_rate_state_t arc_misses_state;
+static value_to_rate_state_t l2_hits_state;
+static value_to_rate_state_t l2_misses_state;
#if defined(KERNEL_LINUX)
#include "utils_llist.h"
}
#elif defined(KERNEL_SOLARIS)
+
+#if HAVE_KSTAT_H
+#include <kstat.h>
+#endif
+
extern kstat_ctl_t *kc;
static long long get_zfs_value(kstat_t *ksp, char *name) {
za_submit_gauge("cache_ratio", type_instance, ratio);
}
-static value_to_rate_state_t arc_hits_state, arc_misses_state, l2_hits_state,
- l2_misses_state;
-
static int za_read(void) {
gauge_t arc_hits, arc_misses, l2_hits, l2_misses;
kstat_t *ksp = NULL;
fh = fopen(ZOL_ARCSTATS_FILE, "r");
if (fh == NULL) {
- char errbuf[1024];
ERROR("zfs_arc plugin: Opening \"%s\" failed: %s", ZOL_ARCSTATS_FILE,
- sstrerror(errno, errbuf, sizeof(errbuf)));
+ STRERRNO);
+ return -1;
+ }
+
+ /* Ignore the first two lines because they contain information about the rest
+ * of the file.
+ * See kstat_seq_show_headers module/spl/spl-kstat.c of the spl kernel module.
+ */
+ if ((fgets(buffer, sizeof(buffer), fh) == NULL) ||
+ (fgets(buffer, sizeof(buffer), fh) == NULL)) {
+ ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.",
+ ZOL_ARCSTATS_FILE);
+ fclose(fh);
return -1;
}
ERROR("zfs_arc plugin: \"%s\" does not contain a single line.",
ZOL_ARCSTATS_FILE);
fclose(fh);
- return -1;
+ return (-1);
}
if (fgets(buffer, sizeof(buffer), fh) == NULL) {
ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.",
ZOL_ARCSTATS_FILE);
fclose(fh);
- return -1;
+ return (-1);
}
while (fgets(buffer, sizeof(buffer), fh) != NULL) {
}
#endif
- memset(&arc_hits_state, 0, sizeof(arc_hits_state));
- memset(&arc_misses_state, 0, sizeof(arc_misses_state));
- memset(&l2_hits_state, 0, sizeof(l2_hits_state));
- memset(&l2_misses_state, 0, sizeof(l2_misses_state));
-
return 0;
} /* }}} int za_init */