]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
src/ubi.c: Importing changes from `main`.
authorFlorian Forster <octo@collectd.org>
Tue, 19 Dec 2023 08:51:56 +0000 (09:51 +0100)
committerFlorian Forster <octo@collectd.org>
Mon, 22 Jan 2024 20:22:04 +0000 (21:22 +0100)
Changes:
8c56291be070d7fcb99158157e1d42256dc4930e ubi: add percent evaluation for the bad blocks
d4e3332fc5198504483c0eac2b83b6cc48feb01a ubi: perpartion for percentage evaluation of the bad blocks

src/ubi.c

index 0485db872db965208a3c4f969f5d2353beb59c37..4d1f924d656138d2f2773624059c175d945843e6 100644 (file)
--- a/src/ubi.c
+++ b/src/ubi.c
@@ -35,6 +35,9 @@
 #define DEV_BAD_COUNT                                                          \
   "bad_peb_count" // Count of bad physical eraseblocks on the underlying MTD
                   // device.
+// Value reserved for bad block
+#define DEV_RESERVED_BAD_BLOCK "reserved_for_bad"
+
 #define MAXIMUM_ERASE "max_ec" // Current maximum erase counter value
 
 /*
@@ -84,9 +87,9 @@ static void ubi_submit(const char *dev_name, const char *type, gauge_t value) {
   plugin_dispatch_values(&vl);
 } /* void ubi_submit */
 
-static int ubi_read_dev_attr(const char *dev_name, const char *attr) {
+static int ubi_read_dev_attr(const char *dev_name, const char *attr,
+                             int *value) {
   FILE *f;
-  int val;
   char
       str[sizeof(SYS_PATH) + strlen(dev_name) + sizeof("/") + strlen(attr) + 1];
   int n;
@@ -98,7 +101,7 @@ static int ubi_read_dev_attr(const char *dev_name, const char *attr) {
     return -1;
   }
 
-  n = fscanf(f, "%d", &val);
+  n = fscanf(f, "%d", value);
   fclose(f);
 
   if (n != 1) {
@@ -106,19 +109,72 @@ static int ubi_read_dev_attr(const char *dev_name, const char *attr) {
     return -1;
   }
 
-  ubi_submit(dev_name, attr, (gauge_t)val);
-
   return 0;
 } /* int ubi_read_dev_attr */
 
 static inline int ubi_read_dev_bad_count(const char *dev_name) {
-  return ubi_read_dev_attr(dev_name, DEV_BAD_COUNT);
+  int ret;
+  int value;
+
+  ret = ubi_read_dev_attr(dev_name, DEV_BAD_COUNT, &value);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME " : Unable to read bad_peb_count");
+    return -1;
+  }
+
+  ubi_submit(dev_name, DEV_BAD_COUNT, (gauge_t)value);
+
+  return 0;
 } /* int ubi_read_dev_bad_count */
 
 static inline int ubi_read_max_ec(const char *dev_name) {
-  return ubi_read_dev_attr(dev_name, MAXIMUM_ERASE);
+  int ret;
+  int value;
+
+  ret = ubi_read_dev_attr(dev_name, MAXIMUM_ERASE, &value);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME " : Unable to read max_ec");
+    return -1;
+  }
+
+  ubi_submit(dev_name, MAXIMUM_ERASE, (gauge_t)value);
+
+  return 0;
 } /* int ubi_read_max_ec */
 
+static inline int ubi_read_percent(const char *dev_name) {
+  int ret;
+  int bcount;
+  int bblock;
+
+  ret = ubi_read_dev_attr(dev_name, DEV_BAD_COUNT, &bcount);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME " : Unable to read bad_peb_count");
+    return -1;
+  }
+
+  ret = ubi_read_dev_attr(dev_name, DEV_RESERVED_BAD_BLOCK, &bblock);
+
+  if (ret != 0) {
+    ERROR(PLUGIN_NAME " : Unable to read reserved_for_bad");
+    return -1;
+  }
+
+  if (bblock == 0) {
+    ERROR(PLUGIN_NAME
+          " : Percentage value cannot be determined (reserved_for_bad = 0)");
+    return -2;
+  }
+
+  ubi_submit(dev_name, "percent",
+             (gauge_t)((float_t)bcount / (float_t)bblock * 100.0));
+
+  return 0;
+} /* int ubi_read_percent */
+
 static int ubi_read(void) {
   DIR *dir;
   struct dirent *dirent;
@@ -134,6 +190,7 @@ static int ubi_read(void) {
 
     ubi_read_dev_bad_count(dirent->d_name);
     ubi_read_max_ec(dirent->d_name);
+    ubi_read_percent(dirent->d_name);
   }
 
   closedir(dir);