|
@@ -486,6 +486,58 @@ static int clobbering_unread_rtas_event(void)
|
|
|
NVRAM_RTAS_READ_TIMEOUT);
|
|
|
}
|
|
|
|
|
|
+/* Derived from logfs_compress() */
|
|
|
+static int nvram_compress(const void *in, void *out, size_t inlen,
|
|
|
+ size_t outlen)
|
|
|
+{
|
|
|
+ int err, ret;
|
|
|
+
|
|
|
+ ret = -EIO;
|
|
|
+ err = zlib_deflateInit2(&stream, COMPR_LEVEL, Z_DEFLATED, WINDOW_BITS,
|
|
|
+ MEM_LEVEL, Z_DEFAULT_STRATEGY);
|
|
|
+ if (err != Z_OK)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ stream.next_in = in;
|
|
|
+ stream.avail_in = inlen;
|
|
|
+ stream.total_in = 0;
|
|
|
+ stream.next_out = out;
|
|
|
+ stream.avail_out = outlen;
|
|
|
+ stream.total_out = 0;
|
|
|
+
|
|
|
+ err = zlib_deflate(&stream, Z_FINISH);
|
|
|
+ if (err != Z_STREAM_END)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ err = zlib_deflateEnd(&stream);
|
|
|
+ if (err != Z_OK)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ if (stream.total_out >= stream.total_in)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ ret = stream.total_out;
|
|
|
+error:
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/* Compress the text from big_oops_buf into oops_buf. */
|
|
|
+static int zip_oops(size_t text_len)
|
|
|
+{
|
|
|
+ struct oops_log_info *oops_hdr = (struct oops_log_info *)oops_buf;
|
|
|
+ int zipped_len = nvram_compress(big_oops_buf, oops_data, text_len,
|
|
|
+ oops_data_sz);
|
|
|
+ if (zipped_len < 0) {
|
|
|
+ pr_err("nvram: compression failed; returned %d\n", zipped_len);
|
|
|
+ pr_err("nvram: logging uncompressed oops/panic report\n");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ oops_hdr->version = OOPS_HDR_VERSION;
|
|
|
+ oops_hdr->report_length = (u16) zipped_len;
|
|
|
+ oops_hdr->timestamp = get_seconds();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_PSTORE
|
|
|
static int nvram_pstore_open(struct pstore_info *psi)
|
|
|
{
|
|
@@ -759,58 +811,6 @@ int __init pSeries_nvram_init(void)
|
|
|
}
|
|
|
|
|
|
|
|
|
-/* Derived from logfs_compress() */
|
|
|
-static int nvram_compress(const void *in, void *out, size_t inlen,
|
|
|
- size_t outlen)
|
|
|
-{
|
|
|
- int err, ret;
|
|
|
-
|
|
|
- ret = -EIO;
|
|
|
- err = zlib_deflateInit2(&stream, COMPR_LEVEL, Z_DEFLATED, WINDOW_BITS,
|
|
|
- MEM_LEVEL, Z_DEFAULT_STRATEGY);
|
|
|
- if (err != Z_OK)
|
|
|
- goto error;
|
|
|
-
|
|
|
- stream.next_in = in;
|
|
|
- stream.avail_in = inlen;
|
|
|
- stream.total_in = 0;
|
|
|
- stream.next_out = out;
|
|
|
- stream.avail_out = outlen;
|
|
|
- stream.total_out = 0;
|
|
|
-
|
|
|
- err = zlib_deflate(&stream, Z_FINISH);
|
|
|
- if (err != Z_STREAM_END)
|
|
|
- goto error;
|
|
|
-
|
|
|
- err = zlib_deflateEnd(&stream);
|
|
|
- if (err != Z_OK)
|
|
|
- goto error;
|
|
|
-
|
|
|
- if (stream.total_out >= stream.total_in)
|
|
|
- goto error;
|
|
|
-
|
|
|
- ret = stream.total_out;
|
|
|
-error:
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-/* Compress the text from big_oops_buf into oops_buf. */
|
|
|
-static int zip_oops(size_t text_len)
|
|
|
-{
|
|
|
- struct oops_log_info *oops_hdr = (struct oops_log_info *)oops_buf;
|
|
|
- int zipped_len = nvram_compress(big_oops_buf, oops_data, text_len,
|
|
|
- oops_data_sz);
|
|
|
- if (zipped_len < 0) {
|
|
|
- pr_err("nvram: compression failed; returned %d\n", zipped_len);
|
|
|
- pr_err("nvram: logging uncompressed oops/panic report\n");
|
|
|
- return -1;
|
|
|
- }
|
|
|
- oops_hdr->version = OOPS_HDR_VERSION;
|
|
|
- oops_hdr->report_length = (u16) zipped_len;
|
|
|
- oops_hdr->timestamp = get_seconds();
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* This is our kmsg_dump callback, called after an oops or panic report
|
|
|
* has been written to the printk buffer. We want to capture as much
|