blob: 689013ddc68e0f88e3a08a41d94c33b1328e263f [file] [log] [blame]
diff '--exclude=*~' -Nurp sp-oops-extract-0.0.7.orig/src/oopslog.c sp-oops-extract-0.0.7/src/oopslog.c
Index: sp-oops-extract-0.0.7/src/oopslog.c
===================================================================
--- sp-oops-extract-0.0.7.orig/src/oopslog.c 2017-04-05 16:31:18.973231119 -0700
+++ sp-oops-extract-0.0.7/src/oopslog.c 2017-04-05 16:31:18.965231155 -0700
@@ -37,11 +37,18 @@
#include <linux/fs.h>
#include <err.h>
#include <stdint.h>
+#include <stdlib.h>
+#include <limits.h>
-#define OOPS_PAGE_SIZE 4096
+#define DEFAULT_OOPS_PAGE_SIZE 4096
+#define OOPS_PAGE_SIZE_ENV "OOPS_PAGE_SIZE"
+#define OOPS_RECORD_SIZE_PATH "/sys/module/mtdoops/parameters/record_size"
+#define INVALID_OOPS_PAGE_SIZE ULONG_MAX
#define MEMGETINFO _IOR('M', 1, struct mtd_info_user)
+unsigned long OOPS_PAGE_SIZE = DEFAULT_OOPS_PAGE_SIZE;
+
struct mtd_info_user {
uint8_t type;
uint32_t flags;
@@ -55,6 +62,72 @@
uint32_t eccsize;
};
+static unsigned long init_oops_page_size_from_env(void)
+{
+ char *from_env = getenv(OOPS_PAGE_SIZE_ENV);
+ char *endptr = NULL;
+ unsigned long val = INVALID_OOPS_PAGE_SIZE;
+
+ if (!from_env) {
+ return val;
+ }
+
+ errno = 0;
+ val = strtoul(from_env, &endptr, 0);
+ if (from_env == endptr) {
+ // invalid value. Ignore it.
+ val = INVALID_OOPS_PAGE_SIZE;
+ } else if (val == ULONG_MAX && errno == ERANGE) {
+ // invalid value. Ignore it.
+ val = INVALID_OOPS_PAGE_SIZE;
+ } else {
+ // good read, using value.
+ }
+
+ return val;
+}
+
+static unsigned long init_oops_page_size_from_module(void)
+{
+ FILE *fp = fopen(OOPS_RECORD_SIZE_PATH, "r");
+ unsigned long val = INVALID_OOPS_PAGE_SIZE;
+ int items;
+
+ if (!fp) {
+ return INVALID_OOPS_PAGE_SIZE;
+ }
+
+ items = fscanf(fp, "%lu", &val);
+ fclose(fp);
+ if (items != 1) {
+ val = INVALID_OOPS_PAGE_SIZE;
+ }
+
+ return val;
+}
+
+// Set OOPS_PAGE_SIZE value from either environment (OOPS_PAGE_SIZE)
+// or from the kernel module parameter.
+static void init_oops_page_size(void)
+{
+ unsigned long val;
+
+ val = init_oops_page_size_from_env();
+
+ if (val == INVALID_OOPS_PAGE_SIZE) {
+ val = init_oops_page_size_from_module();
+ }
+
+ if (val != INVALID_OOPS_PAGE_SIZE) {
+ OOPS_PAGE_SIZE = val;
+ }
+
+ fprintf(stderr, "Using OOPS_PAGE_SIZE=%lu\n", val);
+ if ((OOPS_PAGE_SIZE % 4096) != 0) {
+ fprintf(stderr, "Warning: OOPS_PAGE_SIZE is supposed to be a multiple of 4096\n");
+ }
+}
+
static int try_to_check_for_bad_blocks(void) {
/* FIXME
* Checking for bad blocks should be implemented here.
@@ -83,6 +156,8 @@
device = argv[1];
+ init_oops_page_size();
+
buf = malloc(OOPS_PAGE_SIZE);
if (!buf) {
err(-1, "Unable to allocate memory");