diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-18 13:39:40 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-18 13:39:40 -0400 |
| commit | 9baa5059485d6559081d27d9b1fe1714f3fccab1 (patch) | |
| tree | eb3c5b88985a195b99c0ee27c997c51feeba7dc4 | |
| parent | f42bcf1aa84a4c4348d53ac3013eff2b642987e5 (diff) | |
| parent | 802e4c6f5887205eda110c6bfb90c9bfa93dc8a7 (diff) | |
Merge tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux
Pull pstore/compression fixes from Tony Luck:
"Three pstore fixes related to compression:
1) Better adjustment of size of compression buffer (was too big for
EFIVARS backend resulting in compression failure
2) Use zlib_inflateInit2 instead of zlib_inflateInit
3) Don't print messages about compression failure. They will waste
space that may better be used to log console output leading to the
crash"
* tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux:
pstore: Remove the messages related to compression failure
pstore: Use zlib_inflateInit2 instead of zlib_inflateInit
pstore: Adjust buffer size for compression for smaller registered buffers
| -rw-r--r-- | fs/pstore/platform.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 4ffb7ab5e397..b8e93a40a5d3 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c | |||
| @@ -168,7 +168,7 @@ static int pstore_decompress(void *in, void *out, size_t inlen, size_t outlen) | |||
| 168 | int err, ret; | 168 | int err, ret; |
| 169 | 169 | ||
| 170 | ret = -EIO; | 170 | ret = -EIO; |
| 171 | err = zlib_inflateInit(&stream); | 171 | err = zlib_inflateInit2(&stream, WINDOW_BITS); |
| 172 | if (err != Z_OK) | 172 | if (err != Z_OK) |
| 173 | goto error; | 173 | goto error; |
| 174 | 174 | ||
| @@ -195,8 +195,29 @@ error: | |||
| 195 | static void allocate_buf_for_compression(void) | 195 | static void allocate_buf_for_compression(void) |
| 196 | { | 196 | { |
| 197 | size_t size; | 197 | size_t size; |
| 198 | size_t cmpr; | ||
| 199 | |||
| 200 | switch (psinfo->bufsize) { | ||
| 201 | /* buffer range for efivars */ | ||
| 202 | case 1000 ... 2000: | ||
| 203 | cmpr = 56; | ||
| 204 | break; | ||
| 205 | case 2001 ... 3000: | ||
| 206 | cmpr = 54; | ||
| 207 | break; | ||
| 208 | case 3001 ... 3999: | ||
| 209 | cmpr = 52; | ||
| 210 | break; | ||
| 211 | /* buffer range for nvram, erst */ | ||
| 212 | case 4000 ... 10000: | ||
| 213 | cmpr = 45; | ||
| 214 | break; | ||
| 215 | default: | ||
| 216 | cmpr = 60; | ||
| 217 | break; | ||
| 218 | } | ||
| 198 | 219 | ||
| 199 | big_oops_buf_sz = (psinfo->bufsize * 100) / 45; | 220 | big_oops_buf_sz = (psinfo->bufsize * 100) / cmpr; |
| 200 | big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL); | 221 | big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL); |
| 201 | if (big_oops_buf) { | 222 | if (big_oops_buf) { |
| 202 | size = max(zlib_deflate_workspacesize(WINDOW_BITS, MEM_LEVEL), | 223 | size = max(zlib_deflate_workspacesize(WINDOW_BITS, MEM_LEVEL), |
| @@ -295,10 +316,6 @@ static void pstore_dump(struct kmsg_dumper *dumper, | |||
| 295 | compressed = true; | 316 | compressed = true; |
| 296 | total_len = zipped_len; | 317 | total_len = zipped_len; |
| 297 | } else { | 318 | } else { |
| 298 | pr_err("pstore: compression failed for Part %d" | ||
| 299 | " returned %d\n", part, zipped_len); | ||
| 300 | pr_err("pstore: Capture uncompressed" | ||
| 301 | " oops/panic report of Part %d\n", part); | ||
| 302 | compressed = false; | 319 | compressed = false; |
| 303 | total_len = copy_kmsg_to_buffer(hsize, len); | 320 | total_len = copy_kmsg_to_buffer(hsize, len); |
| 304 | } | 321 | } |
