Merge pull request #2097 from YmrDtnJu/zfs_arc
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sat, 31 Dec 2016 12:47:04 +0000 (13:47 +0100)
committerGitHub <noreply@github.com>
Sat, 31 Dec 2016 12:47:04 +0000 (13:47 +0100)
zfs_arc updates for linux

src/zfs_arc.c

index af5130a..aff02b6 100644 (file)
@@ -75,7 +75,6 @@ static long long get_zfs_value(kstat_t *ksp, const char *key) {
 
   e = llist_search(ksp, key);
   if (e == NULL) {
-    ERROR("zfs_arc plugin: `llist_search` failed for key: '%s'.", key);
     return (-1);
   }
 
@@ -152,7 +151,7 @@ static int za_read_derive(kstat_t *ksp, const char *kstat_value,
                           const char *type, const char *type_instance) {
   long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
     return (-1);
   }
 
@@ -165,7 +164,7 @@ static int za_read_gauge(kstat_t *ksp, const char *kstat_value,
                          const char *type, const char *type_instance) {
   long long tmp = get_zfs_value(ksp, (char *)kstat_value);
   if (tmp == -1LL) {
-    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
+    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
     return (-1);
   }
 
@@ -212,6 +211,21 @@ static int za_read(void) {
     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) {
+    ERROR("zfs_arc plugin: \"%s\" does not contain a single line.", ZOL_ARCSTATS_FILE);
+    fclose(fh);
+    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);
+  }
+
   while (fgets(buffer, sizeof(buffer), fh) != NULL) {
     char *fields[3];
     value_t v;