Lines Matching +full:use +full:- +full:minimum +full:- +full:ecc

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Persistent Storage - platform driver interface parts.
5 * Copyright (C) 2007-2008 Google, Inc.
39 * We defer making "oops" entries appear in pstore - see
43 static int pstore_update_ms = -1;
46 "(default is -1, which means runtime updates are disabled; "
57 "powerpc-ofw",
58 "powerpc-common",
60 "powerpc-opal",
81 MODULE_PARM_DESC(backend, "specific backend to use");
90 MODULE_PARM_DESC(compress, "compression to use");
273 return -EINVAL; in pstore_compress()
290 /* Skip if not built-in or compression backend not selected yet. */ in allocate_buf_for_compression()
298 if (!crypto_has_comp(zbackend->name, 0, 0)) { in allocate_buf_for_compression()
299 pr_err("Unknown compression: %s\n", zbackend->name); in allocate_buf_for_compression()
303 size = zbackend->zbufsize(psinfo->bufsize); in allocate_buf_for_compression()
306 zbackend->name, size); in allocate_buf_for_compression()
313 size, zbackend->name); in allocate_buf_for_compression()
317 ctx = crypto_alloc_comp(zbackend->name, 0, 0); in allocate_buf_for_compression()
320 pr_err("crypto_alloc_comp('%s') failed: %ld\n", zbackend->name, in allocate_buf_for_compression()
325 /* A non-NULL big_oops_buf indicates compression is available. */ in allocate_buf_for_compression()
330 pr_info("Using crash dump compression: %s\n", zbackend->name); in allocate_buf_for_compression()
349 * Copy the recent messages from big_oops_buf to psinfo->buf
358 if (total_len > psinfo->bufsize) { in copy_kmsg_to_buffer()
359 diff = total_len - psinfo->bufsize + hsize; in copy_kmsg_to_buffer()
360 memcpy(psinfo->buf, big_oops_buf, hsize); in copy_kmsg_to_buffer()
361 memcpy(psinfo->buf + hsize, big_oops_buf + diff, in copy_kmsg_to_buffer()
362 psinfo->bufsize - hsize); in copy_kmsg_to_buffer()
363 total_len = psinfo->bufsize; in copy_kmsg_to_buffer()
365 memcpy(psinfo->buf, big_oops_buf, total_len); in copy_kmsg_to_buffer()
375 record->psi = psinfo; in pstore_record_init()
378 record->time = ns_to_timespec64(ktime_get_real_fast_ns()); in pstore_record_init()
395 if (down_trylock(&psinfo->buf_lock)) { in pstore_dump()
402 if (down_interruptible(&psinfo->buf_lock)) { in pstore_dump()
413 int zipped_len = -1; in pstore_dump()
422 record.buf = psinfo->buf; in pstore_dump()
428 dst = psinfo->buf; in pstore_dump()
429 dst_size = psinfo->bufsize; in pstore_dump()
435 dst_size -= header_size; in pstore_dump()
443 zipped_len = pstore_compress(dst, psinfo->buf, in pstore_dump()
445 psinfo->bufsize); in pstore_dump()
458 ret = psinfo->write(&record); in pstore_dump()
468 up(&psinfo->buf_lock); in pstore_dump()
501 psinfo->write(&record); in pstore_console_write()
506 .index = -1,
512 strscpy(pstore_console.name, psinfo->name, in pstore_register_console()
536 if (record->buf) in pstore_write_user_compat()
537 return -EINVAL; in pstore_write_user_compat()
539 record->buf = memdup_user(buf, record->size); in pstore_write_user_compat()
540 if (IS_ERR(record->buf)) { in pstore_write_user_compat()
541 ret = PTR_ERR(record->buf); in pstore_write_user_compat()
545 ret = record->psi->write(record); in pstore_write_user_compat()
547 kfree(record->buf); in pstore_write_user_compat()
549 record->buf = NULL; in pstore_write_user_compat()
551 return unlikely(ret < 0) ? ret : record->size; in pstore_write_user_compat()
563 if (backend && strcmp(backend, psi->name)) { in pstore_register()
564 pr_warn("ignoring unexpected backend '%s'\n", psi->name); in pstore_register()
565 return -EPERM; in pstore_register()
569 if (!psi->flags) { in pstore_register()
571 psi->name); in pstore_register()
572 return -EINVAL; in pstore_register()
576 if (!psi->read || !psi->write) { in pstore_register()
578 psi->name); in pstore_register()
579 return -EINVAL; in pstore_register()
585 psinfo->name, psi->name); in pstore_register()
587 return -EBUSY; in pstore_register()
590 if (!psi->write_user) in pstore_register()
591 psi->write_user = pstore_write_user_compat; in pstore_register()
593 mutex_init(&psinfo->read_mutex); in pstore_register()
594 sema_init(&psinfo->buf_lock, 1); in pstore_register()
596 if (psi->flags & PSTORE_FLAGS_DMESG) in pstore_register()
601 if (psi->flags & PSTORE_FLAGS_DMESG) { in pstore_register()
602 pstore_dumper.max_reason = psinfo->max_reason; in pstore_register()
605 if (psi->flags & PSTORE_FLAGS_CONSOLE) in pstore_register()
607 if (psi->flags & PSTORE_FLAGS_FTRACE) in pstore_register()
609 if (psi->flags & PSTORE_FLAGS_PMSG) in pstore_register()
619 backend = kstrdup(psi->name, GFP_KERNEL); in pstore_register()
621 pr_info("Registered %s as persistent store backend\n", psi->name); in pstore_register()
643 if (psi->flags & PSTORE_FLAGS_PMSG) in pstore_unregister()
645 if (psi->flags & PSTORE_FLAGS_FTRACE) in pstore_unregister()
647 if (psi->flags & PSTORE_FLAGS_CONSOLE) in pstore_unregister()
649 if (psi->flags & PSTORE_FLAGS_DMESG) in pstore_unregister()
674 if (!IS_ENABLED(CONFIG_PSTORE_COMPRESSION) || !record->compressed) in decompress_record()
678 if (record->type != PSTORE_TYPE_DMESG) { in decompress_record()
679 pr_warn("ignored compressed record type %d\n", record->type); in decompress_record()
689 /* Allocate enough space to hold max decompression and ECC. */ in decompress_record()
691 workspace = kmalloc(unzipped_len + record->ecc_notice_size, in decompress_record()
697 ret = crypto_comp_decompress(tfm, record->buf, record->size, in decompress_record()
705 /* Append ECC notice to decompressed buffer. */ in decompress_record()
706 memcpy(workspace + unzipped_len, record->buf + record->size, in decompress_record()
707 record->ecc_notice_size); in decompress_record()
709 /* Copy decompressed contents into an minimum-sized allocation. */ in decompress_record()
710 unzipped = kmemdup(workspace, unzipped_len + record->ecc_notice_size, in decompress_record()
717 kfree(record->buf); in decompress_record()
718 record->buf = unzipped; in decompress_record()
719 record->size = unzipped_len; in decompress_record()
720 record->compressed = false; in decompress_record()
725 * files in our filesystem. Don't warn about -EEXIST errors
726 * when we are re-scanning the backing store looking to add new
738 mutex_lock(&psi->read_mutex); in pstore_get_backend_records()
739 if (psi->open && psi->open(psi)) in pstore_get_backend_records()
747 for (; stop_loop; stop_loop--) { in pstore_get_backend_records()
758 record->size = psi->read(record); in pstore_get_backend_records()
761 if (record->size <= 0) { in pstore_get_backend_records()
770 kfree(record->buf); in pstore_get_backend_records()
772 if (rc != -EEXIST || !quiet) in pstore_get_backend_records()
776 if (psi->close) in pstore_get_backend_records()
777 psi->close(psi); in pstore_get_backend_records()
779 mutex_unlock(&psi->read_mutex); in pstore_get_backend_records()
783 failed, psi->name); in pstore_get_backend_records()
786 psi->name); in pstore_get_backend_records()
811 for (step = zbackends; step->name; step++) { in pstore_choose_compression()
812 if (!strcmp(compress, step->name)) { in pstore_choose_compression()