| 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"); |