1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Persistent Storage - platform driver interface parts. 4 * 5 * Copyright (C) 2007-2008 Google, Inc. 6 * Copyright (C) 2010 Intel Corporation <tony.luck@intel.com> 7 */ 8 9 #define pr_fmt(fmt) "pstore: " fmt 10 11 #include <linux/atomic.h> 12 #include <linux/types.h> 13 #include <linux/errno.h> 14 #include <linux/init.h> 15 #include <linux/kmsg_dump.h> 16 #include <linux/console.h> 17 #include <linux/module.h> 18 #include <linux/pstore.h> 19 #if IS_ENABLED(CONFIG_PSTORE_LZO_COMPRESS) 20 #include <linux/lzo.h> 21 #endif 22 #if IS_ENABLED(CONFIG_PSTORE_LZ4_COMPRESS) || IS_ENABLED(CONFIG_PSTORE_LZ4HC_COMPRESS) 23 #include <linux/lz4.h> 24 #endif 25 #if IS_ENABLED(CONFIG_PSTORE_ZSTD_COMPRESS) 26 #include <linux/zstd.h> 27 #endif 28 #include <linux/crypto.h> 29 #include <linux/string.h> 30 #include <linux/timer.h> 31 #include <linux/slab.h> 32 #include <linux/uaccess.h> 33 #include <linux/jiffies.h> 34 #include <linux/workqueue.h> 35 36 #include "internal.h" 37 38 /* 39 * We defer making "oops" entries appear in pstore - see 40 * whether the system is actually still running well enough 41 * to let someone see the entry 42 */ 43 static int pstore_update_ms = -1; 44 module_param_named(update_ms, pstore_update_ms, int, 0600); 45 MODULE_PARM_DESC(update_ms, "milliseconds before pstore updates its content " 46 "(default is -1, which means runtime updates are disabled; " 47 "enabling this option is not safe, it may lead to further " 48 "corruption on Oopses)"); 49 50 /* Names should be in the same order as the enum pstore_type_id */ 51 static const char * const pstore_type_names[] = { 52 "dmesg", 53 "mce", 54 "console", 55 "ftrace", 56 "rtas", 57 "powerpc-ofw", 58 "powerpc-common", 59 "pmsg", 60 "powerpc-opal", 61 }; 62 63 static int pstore_new_entry; 64 65 static void pstore_timefunc(struct timer_list *); 66 static DEFINE_TIMER(pstore_timer, pstore_timefunc); 67 68 static void pstore_dowork(struct work_struct *); 69 static DECLARE_WORK(pstore_work, pstore_dowork); 70 71 /* 72 * pstore_lock just protects "psinfo" during 73 * calls to pstore_register() 74 */ 75 static DEFINE_SPINLOCK(pstore_lock); 76 struct pstore_info *psinfo; 77 78 static char *backend; 79 static char *compress = 80 #ifdef CONFIG_PSTORE_COMPRESS_DEFAULT 81 CONFIG_PSTORE_COMPRESS_DEFAULT; 82 #else 83 NULL; 84 #endif 85 86 /* Compression parameters */ 87 static struct crypto_comp *tfm; 88 89 struct pstore_zbackend { 90 int (*zbufsize)(size_t size); 91 const char *name; 92 }; 93 94 static char *big_oops_buf; 95 static size_t big_oops_buf_sz; 96 97 /* How much of the console log to snapshot */ 98 unsigned long kmsg_bytes = PSTORE_DEFAULT_KMSG_BYTES; 99 100 void pstore_set_kmsg_bytes(int bytes) 101 { 102 kmsg_bytes = bytes; 103 } 104 105 /* Tag each group of saved records with a sequence number */ 106 static int oopscount; 107 108 const char *pstore_type_to_name(enum pstore_type_id type) 109 { 110 BUILD_BUG_ON(ARRAY_SIZE(pstore_type_names) != PSTORE_TYPE_MAX); 111 112 if (WARN_ON_ONCE(type >= PSTORE_TYPE_MAX)) 113 return "unknown"; 114 115 return pstore_type_names[type]; 116 } 117 EXPORT_SYMBOL_GPL(pstore_type_to_name); 118 119 enum pstore_type_id pstore_name_to_type(const char *name) 120 { 121 int i; 122 123 for (i = 0; i < PSTORE_TYPE_MAX; i++) { 124 if (!strcmp(pstore_type_names[i], name)) 125 return i; 126 } 127 128 return PSTORE_TYPE_MAX; 129 } 130 EXPORT_SYMBOL_GPL(pstore_name_to_type); 131 132 static const char *get_reason_str(enum kmsg_dump_reason reason) 133 { 134 switch (reason) { 135 case KMSG_DUMP_PANIC: 136 return "Panic"; 137 case KMSG_DUMP_OOPS: 138 return "Oops"; 139 case KMSG_DUMP_EMERG: 140 return "Emergency"; 141 case KMSG_DUMP_RESTART: 142 return "Restart"; 143 case KMSG_DUMP_HALT: 144 return "Halt"; 145 case KMSG_DUMP_POWEROFF: 146 return "Poweroff"; 147 default: 148 return "Unknown"; 149 } 150 } 151 152 /* 153 * Should pstore_dump() wait for a concurrent pstore_dump()? If 154 * not, the current pstore_dump() will report a failure to dump 155 * and return. 156 */ 157 static bool pstore_cannot_wait(enum kmsg_dump_reason reason) 158 { 159 /* In NMI path, pstore shouldn't block regardless of reason. */ 160 if (in_nmi()) 161 return true; 162 163 switch (reason) { 164 /* In panic case, other cpus are stopped by smp_send_stop(). */ 165 case KMSG_DUMP_PANIC: 166 /* Emergency restart shouldn't be blocked. */ 167 case KMSG_DUMP_EMERG: 168 return true; 169 default: 170 return false; 171 } 172 } 173 174 #if IS_ENABLED(CONFIG_PSTORE_DEFLATE_COMPRESS) 175 static int zbufsize_deflate(size_t size) 176 { 177 size_t cmpr; 178 179 switch (size) { 180 /* buffer range for efivars */ 181 case 1000 ... 2000: 182 cmpr = 56; 183 break; 184 case 2001 ... 3000: 185 cmpr = 54; 186 break; 187 case 3001 ... 3999: 188 cmpr = 52; 189 break; 190 /* buffer range for nvram, erst */ 191 case 4000 ... 10000: 192 cmpr = 45; 193 break; 194 default: 195 cmpr = 60; 196 break; 197 } 198 199 return (size * 100) / cmpr; 200 } 201 #endif 202 203 #if IS_ENABLED(CONFIG_PSTORE_LZO_COMPRESS) 204 static int zbufsize_lzo(size_t size) 205 { 206 return lzo1x_worst_compress(size); 207 } 208 #endif 209 210 #if IS_ENABLED(CONFIG_PSTORE_LZ4_COMPRESS) || IS_ENABLED(CONFIG_PSTORE_LZ4HC_COMPRESS) 211 static int zbufsize_lz4(size_t size) 212 { 213 return LZ4_compressBound(size); 214 } 215 #endif 216 217 #if IS_ENABLED(CONFIG_PSTORE_842_COMPRESS) 218 static int zbufsize_842(size_t size) 219 { 220 return size; 221 } 222 #endif 223 224 #if IS_ENABLED(CONFIG_PSTORE_ZSTD_COMPRESS) 225 static int zbufsize_zstd(size_t size) 226 { 227 return ZSTD_compressBound(size); 228 } 229 #endif 230 231 static const struct pstore_zbackend *zbackend __ro_after_init; 232 233 static const struct pstore_zbackend zbackends[] = { 234 #if IS_ENABLED(CONFIG_PSTORE_DEFLATE_COMPRESS) 235 { 236 .zbufsize = zbufsize_deflate, 237 .name = "deflate", 238 }, 239 #endif 240 #if IS_ENABLED(CONFIG_PSTORE_LZO_COMPRESS) 241 { 242 .zbufsize = zbufsize_lzo, 243 .name = "lzo", 244 }, 245 #endif 246 #if IS_ENABLED(CONFIG_PSTORE_LZ4_COMPRESS) 247 { 248 .zbufsize = zbufsize_lz4, 249 .name = "lz4", 250 }, 251 #endif 252 #if IS_ENABLED(CONFIG_PSTORE_LZ4HC_COMPRESS) 253 { 254 .zbufsize = zbufsize_lz4, 255 .name = "lz4hc", 256 }, 257 #endif 258 #if IS_ENABLED(CONFIG_PSTORE_842_COMPRESS) 259 { 260 .zbufsize = zbufsize_842, 261 .name = "842", 262 }, 263 #endif 264 #if IS_ENABLED(CONFIG_PSTORE_ZSTD_COMPRESS) 265 { 266 .zbufsize = zbufsize_zstd, 267 .name = "zstd", 268 }, 269 #endif 270 { } 271 }; 272 273 static int pstore_compress(const void *in, void *out, 274 unsigned int inlen, unsigned int outlen) 275 { 276 int ret; 277 278 ret = crypto_comp_compress(tfm, in, inlen, out, &outlen); 279 if (ret) { 280 pr_err("crypto_comp_compress failed, ret = %d!\n", ret); 281 return ret; 282 } 283 284 return outlen; 285 } 286 287 static void allocate_buf_for_compression(void) 288 { 289 struct crypto_comp *ctx; 290 int size; 291 char *buf; 292 293 /* Skip if not built-in or compression backend not selected yet. */ 294 if (!IS_ENABLED(CONFIG_PSTORE_COMPRESS) || !zbackend) 295 return; 296 297 /* Skip if no pstore backend yet or compression init already done. */ 298 if (!psinfo || tfm) 299 return; 300 301 if (!crypto_has_comp(zbackend->name, 0, 0)) { 302 pr_err("Unknown compression: %s\n", zbackend->name); 303 return; 304 } 305 306 size = zbackend->zbufsize(psinfo->bufsize); 307 if (size <= 0) { 308 pr_err("Invalid compression size for %s: %d\n", 309 zbackend->name, size); 310 return; 311 } 312 313 buf = kmalloc(size, GFP_KERNEL); 314 if (!buf) { 315 pr_err("Failed %d byte compression buffer allocation for: %s\n", 316 size, zbackend->name); 317 return; 318 } 319 320 ctx = crypto_alloc_comp(zbackend->name, 0, 0); 321 if (IS_ERR_OR_NULL(ctx)) { 322 kfree(buf); 323 pr_err("crypto_alloc_comp('%s') failed: %ld\n", zbackend->name, 324 PTR_ERR(ctx)); 325 return; 326 } 327 328 /* A non-NULL big_oops_buf indicates compression is available. */ 329 tfm = ctx; 330 big_oops_buf_sz = size; 331 big_oops_buf = buf; 332 333 pr_info("Using crash dump compression: %s\n", zbackend->name); 334 } 335 336 static void free_buf_for_compression(void) 337 { 338 if (IS_ENABLED(CONFIG_PSTORE_COMPRESS) && tfm) 339 crypto_free_comp(tfm); 340 kfree(big_oops_buf); 341 big_oops_buf = NULL; 342 big_oops_buf_sz = 0; 343 } 344 345 /* 346 * Called when compression fails, since the printk buffer 347 * would be fetched for compression calling it again when 348 * compression fails would have moved the iterator of 349 * printk buffer which results in fetching old contents. 350 * Copy the recent messages from big_oops_buf to psinfo->buf 351 */ 352 static size_t copy_kmsg_to_buffer(int hsize, size_t len) 353 { 354 size_t total_len; 355 size_t diff; 356 357 total_len = hsize + len; 358 359 if (total_len > psinfo->bufsize) { 360 diff = total_len - psinfo->bufsize + hsize; 361 memcpy(psinfo->buf, big_oops_buf, hsize); 362 memcpy(psinfo->buf + hsize, big_oops_buf + diff, 363 psinfo->bufsize - hsize); 364 total_len = psinfo->bufsize; 365 } else 366 memcpy(psinfo->buf, big_oops_buf, total_len); 367 368 return total_len; 369 } 370 371 void pstore_record_init(struct pstore_record *record, 372 struct pstore_info *psinfo) 373 { 374 memset(record, 0, sizeof(*record)); 375 376 record->psi = psinfo; 377 378 /* Report zeroed timestamp if called before timekeeping has resumed. */ 379 record->time = ns_to_timespec64(ktime_get_real_fast_ns()); 380 } 381 382 /* 383 * callback from kmsg_dump. Save as much as we can (up to kmsg_bytes) from the 384 * end of the buffer. 385 */ 386 static void pstore_dump(struct kmsg_dumper *dumper, 387 enum kmsg_dump_reason reason) 388 { 389 unsigned long total = 0; 390 const char *why; 391 unsigned int part = 1; 392 int ret; 393 394 why = get_reason_str(reason); 395 396 if (down_trylock(&psinfo->buf_lock)) { 397 /* Failed to acquire lock: give up if we cannot wait. */ 398 if (pstore_cannot_wait(reason)) { 399 pr_err("dump skipped in %s path: may corrupt error record\n", 400 in_nmi() ? "NMI" : why); 401 return; 402 } 403 if (down_interruptible(&psinfo->buf_lock)) { 404 pr_err("could not grab semaphore?!\n"); 405 return; 406 } 407 } 408 409 oopscount++; 410 while (total < kmsg_bytes) { 411 char *dst; 412 size_t dst_size; 413 int header_size; 414 int zipped_len = -1; 415 size_t dump_size; 416 struct pstore_record record; 417 418 pstore_record_init(&record, psinfo); 419 record.type = PSTORE_TYPE_DMESG; 420 record.count = oopscount; 421 record.reason = reason; 422 record.part = part; 423 record.buf = psinfo->buf; 424 425 if (big_oops_buf) { 426 dst = big_oops_buf; 427 dst_size = big_oops_buf_sz; 428 } else { 429 dst = psinfo->buf; 430 dst_size = psinfo->bufsize; 431 } 432 433 /* Write dump header. */ 434 header_size = snprintf(dst, dst_size, "%s#%d Part%u\n", why, 435 oopscount, part); 436 dst_size -= header_size; 437 438 /* Write dump contents. */ 439 if (!kmsg_dump_get_buffer(dumper, true, dst + header_size, 440 dst_size, &dump_size)) 441 break; 442 443 if (big_oops_buf) { 444 zipped_len = pstore_compress(dst, psinfo->buf, 445 header_size + dump_size, 446 psinfo->bufsize); 447 448 if (zipped_len > 0) { 449 record.compressed = true; 450 record.size = zipped_len; 451 } else { 452 record.size = copy_kmsg_to_buffer(header_size, 453 dump_size); 454 } 455 } else { 456 record.size = header_size + dump_size; 457 } 458 459 ret = psinfo->write(&record); 460 if (ret == 0 && reason == KMSG_DUMP_OOPS && pstore_is_mounted()) 461 pstore_new_entry = 1; 462 463 total += record.size; 464 part++; 465 } 466 467 up(&psinfo->buf_lock); 468 } 469 470 static struct kmsg_dumper pstore_dumper = { 471 .dump = pstore_dump, 472 }; 473 474 /* 475 * Register with kmsg_dump to save last part of console log on panic. 476 */ 477 static void pstore_register_kmsg(void) 478 { 479 kmsg_dump_register(&pstore_dumper); 480 } 481 482 static void pstore_unregister_kmsg(void) 483 { 484 kmsg_dump_unregister(&pstore_dumper); 485 } 486 487 #ifdef CONFIG_PSTORE_CONSOLE 488 static void pstore_console_write(struct console *con, const char *s, unsigned c) 489 { 490 struct pstore_record record; 491 492 if (!c) 493 return; 494 495 pstore_record_init(&record, psinfo); 496 record.type = PSTORE_TYPE_CONSOLE; 497 498 record.buf = (char *)s; 499 record.size = c; 500 psinfo->write(&record); 501 } 502 503 static struct console pstore_console = { 504 .name = "pstore", 505 .write = pstore_console_write, 506 .flags = CON_PRINTBUFFER | CON_ENABLED | CON_ANYTIME, 507 .index = -1, 508 }; 509 510 static void pstore_register_console(void) 511 { 512 register_console(&pstore_console); 513 } 514 515 static void pstore_unregister_console(void) 516 { 517 unregister_console(&pstore_console); 518 } 519 #else 520 static void pstore_register_console(void) {} 521 static void pstore_unregister_console(void) {} 522 #endif 523 524 static int pstore_write_user_compat(struct pstore_record *record, 525 const char __user *buf) 526 { 527 int ret = 0; 528 529 if (record->buf) 530 return -EINVAL; 531 532 record->buf = memdup_user(buf, record->size); 533 if (IS_ERR(record->buf)) { 534 ret = PTR_ERR(record->buf); 535 goto out; 536 } 537 538 ret = record->psi->write(record); 539 540 kfree(record->buf); 541 out: 542 record->buf = NULL; 543 544 return unlikely(ret < 0) ? ret : record->size; 545 } 546 547 /* 548 * platform specific persistent storage driver registers with 549 * us here. If pstore is already mounted, call the platform 550 * read function right away to populate the file system. If not 551 * then the pstore mount code will call us later to fill out 552 * the file system. 553 */ 554 int pstore_register(struct pstore_info *psi) 555 { 556 struct module *owner = psi->owner; 557 558 if (backend && strcmp(backend, psi->name)) { 559 pr_warn("ignoring unexpected backend '%s'\n", psi->name); 560 return -EPERM; 561 } 562 563 /* Sanity check flags. */ 564 if (!psi->flags) { 565 pr_warn("backend '%s' must support at least one frontend\n", 566 psi->name); 567 return -EINVAL; 568 } 569 570 /* Check for required functions. */ 571 if (!psi->read || !psi->write) { 572 pr_warn("backend '%s' must implement read() and write()\n", 573 psi->name); 574 return -EINVAL; 575 } 576 577 spin_lock(&pstore_lock); 578 if (psinfo) { 579 pr_warn("backend '%s' already loaded: ignoring '%s'\n", 580 psinfo->name, psi->name); 581 spin_unlock(&pstore_lock); 582 return -EBUSY; 583 } 584 585 if (!psi->write_user) 586 psi->write_user = pstore_write_user_compat; 587 psinfo = psi; 588 mutex_init(&psinfo->read_mutex); 589 sema_init(&psinfo->buf_lock, 1); 590 spin_unlock(&pstore_lock); 591 592 if (owner && !try_module_get(owner)) { 593 psinfo = NULL; 594 return -EINVAL; 595 } 596 597 allocate_buf_for_compression(); 598 599 if (pstore_is_mounted()) 600 pstore_get_records(0); 601 602 if (psi->flags & PSTORE_FLAGS_DMESG) 603 pstore_register_kmsg(); 604 if (psi->flags & PSTORE_FLAGS_CONSOLE) 605 pstore_register_console(); 606 if (psi->flags & PSTORE_FLAGS_FTRACE) 607 pstore_register_ftrace(); 608 if (psi->flags & PSTORE_FLAGS_PMSG) 609 pstore_register_pmsg(); 610 611 /* Start watching for new records, if desired. */ 612 if (pstore_update_ms >= 0) { 613 pstore_timer.expires = jiffies + 614 msecs_to_jiffies(pstore_update_ms); 615 add_timer(&pstore_timer); 616 } 617 618 /* 619 * Update the module parameter backend, so it is visible 620 * through /sys/module/pstore/parameters/backend 621 */ 622 backend = psi->name; 623 624 pr_info("Registered %s as persistent store backend\n", psi->name); 625 626 module_put(owner); 627 628 return 0; 629 } 630 EXPORT_SYMBOL_GPL(pstore_register); 631 632 void pstore_unregister(struct pstore_info *psi) 633 { 634 /* Stop timer and make sure all work has finished. */ 635 pstore_update_ms = -1; 636 del_timer_sync(&pstore_timer); 637 flush_work(&pstore_work); 638 639 if (psi->flags & PSTORE_FLAGS_PMSG) 640 pstore_unregister_pmsg(); 641 if (psi->flags & PSTORE_FLAGS_FTRACE) 642 pstore_unregister_ftrace(); 643 if (psi->flags & PSTORE_FLAGS_CONSOLE) 644 pstore_unregister_console(); 645 if (psi->flags & PSTORE_FLAGS_DMESG) 646 pstore_unregister_kmsg(); 647 648 free_buf_for_compression(); 649 650 psinfo = NULL; 651 backend = NULL; 652 } 653 EXPORT_SYMBOL_GPL(pstore_unregister); 654 655 static void decompress_record(struct pstore_record *record) 656 { 657 int ret; 658 int unzipped_len; 659 char *unzipped, *workspace; 660 661 if (!record->compressed) 662 return; 663 664 /* Only PSTORE_TYPE_DMESG support compression. */ 665 if (record->type != PSTORE_TYPE_DMESG) { 666 pr_warn("ignored compressed record type %d\n", record->type); 667 return; 668 } 669 670 /* Missing compression buffer means compression was not initialized. */ 671 if (!big_oops_buf) { 672 pr_warn("no decompression method initialized!\n"); 673 return; 674 } 675 676 /* Allocate enough space to hold max decompression and ECC. */ 677 unzipped_len = big_oops_buf_sz; 678 workspace = kmalloc(unzipped_len + record->ecc_notice_size, 679 GFP_KERNEL); 680 if (!workspace) 681 return; 682 683 /* After decompression "unzipped_len" is almost certainly smaller. */ 684 ret = crypto_comp_decompress(tfm, record->buf, record->size, 685 workspace, &unzipped_len); 686 if (ret) { 687 pr_err("crypto_comp_decompress failed, ret = %d!\n", ret); 688 kfree(workspace); 689 return; 690 } 691 692 /* Append ECC notice to decompressed buffer. */ 693 memcpy(workspace + unzipped_len, record->buf + record->size, 694 record->ecc_notice_size); 695 696 /* Copy decompressed contents into an minimum-sized allocation. */ 697 unzipped = kmemdup(workspace, unzipped_len + record->ecc_notice_size, 698 GFP_KERNEL); 699 kfree(workspace); 700 if (!unzipped) 701 return; 702 703 /* Swap out compressed contents with decompressed contents. */ 704 kfree(record->buf); 705 record->buf = unzipped; 706 record->size = unzipped_len; 707 record->compressed = false; 708 } 709 710 /* 711 * Read all the records from one persistent store backend. Create 712 * files in our filesystem. Don't warn about -EEXIST errors 713 * when we are re-scanning the backing store looking to add new 714 * error records. 715 */ 716 void pstore_get_backend_records(struct pstore_info *psi, 717 struct dentry *root, int quiet) 718 { 719 int failed = 0; 720 unsigned int stop_loop = 65536; 721 722 if (!psi || !root) 723 return; 724 725 mutex_lock(&psi->read_mutex); 726 if (psi->open && psi->open(psi)) 727 goto out; 728 729 /* 730 * Backend callback read() allocates record.buf. decompress_record() 731 * may reallocate record.buf. On success, pstore_mkfile() will keep 732 * the record.buf, so free it only on failure. 733 */ 734 for (; stop_loop; stop_loop--) { 735 struct pstore_record *record; 736 int rc; 737 738 record = kzalloc(sizeof(*record), GFP_KERNEL); 739 if (!record) { 740 pr_err("out of memory creating record\n"); 741 break; 742 } 743 pstore_record_init(record, psi); 744 745 record->size = psi->read(record); 746 747 /* No more records left in backend? */ 748 if (record->size <= 0) { 749 kfree(record); 750 break; 751 } 752 753 decompress_record(record); 754 rc = pstore_mkfile(root, record); 755 if (rc) { 756 /* pstore_mkfile() did not take record, so free it. */ 757 kfree(record->buf); 758 kfree(record); 759 if (rc != -EEXIST || !quiet) 760 failed++; 761 } 762 } 763 if (psi->close) 764 psi->close(psi); 765 out: 766 mutex_unlock(&psi->read_mutex); 767 768 if (failed) 769 pr_warn("failed to create %d record(s) from '%s'\n", 770 failed, psi->name); 771 if (!stop_loop) 772 pr_err("looping? Too many records seen from '%s'\n", 773 psi->name); 774 } 775 776 static void pstore_dowork(struct work_struct *work) 777 { 778 pstore_get_records(1); 779 } 780 781 static void pstore_timefunc(struct timer_list *unused) 782 { 783 if (pstore_new_entry) { 784 pstore_new_entry = 0; 785 schedule_work(&pstore_work); 786 } 787 788 if (pstore_update_ms >= 0) 789 mod_timer(&pstore_timer, 790 jiffies + msecs_to_jiffies(pstore_update_ms)); 791 } 792 793 void __init pstore_choose_compression(void) 794 { 795 const struct pstore_zbackend *step; 796 797 if (!compress) 798 return; 799 800 for (step = zbackends; step->name; step++) { 801 if (!strcmp(compress, step->name)) { 802 zbackend = step; 803 return; 804 } 805 } 806 } 807 808 static int __init pstore_init(void) 809 { 810 int ret; 811 812 pstore_choose_compression(); 813 814 /* 815 * Check if any pstore backends registered earlier but did not 816 * initialize compression because crypto was not ready. If so, 817 * initialize compression now. 818 */ 819 allocate_buf_for_compression(); 820 821 ret = pstore_init_fs(); 822 if (ret) 823 return ret; 824 825 return 0; 826 } 827 late_initcall(pstore_init); 828 829 static void __exit pstore_exit(void) 830 { 831 pstore_exit_fs(); 832 } 833 module_exit(pstore_exit) 834 835 module_param(compress, charp, 0444); 836 MODULE_PARM_DESC(compress, "Pstore compression to use"); 837 838 module_param(backend, charp, 0444); 839 MODULE_PARM_DESC(backend, "Pstore backend to use"); 840 841 MODULE_AUTHOR("Tony Luck <tony.luck@intel.com>"); 842 MODULE_LICENSE("GPL"); 843