Commit 41cb8c33 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pstore-v6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux

Pull pstore updates from Kees Cook:

 - Make PSTORE_RAM available by default on arm64 (Nícolas F R A Prado)

 - Allow for dynamic initialization in modular build (Guilherme G
   Piccoli)

 - Add missing allocation failure check (Kunwu Chan)

 - Avoid duplicate memory zeroing (Christophe JAILLET)

 - Avoid potential double-free during pstorefs umount

* tag 'pstore-v6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  pstore/zone: Don't clear memory twice
  pstore/zone: Add a null pointer check to the psz_kmsg_read
  efi: pstore: Allow dynamic initialization based on module parameter
  arm64: defconfig: Enable PSTORE_RAM
  pstore/ram: Register to module device table
  pstore: inode: Only d_invalidate() is needed
parents a01c9fe3 c8d25d69
...@@ -1616,6 +1616,7 @@ CONFIG_CONFIGFS_FS=y ...@@ -1616,6 +1616,7 @@ CONFIG_CONFIGFS_FS=y
CONFIG_EFIVAR_FS=y CONFIG_EFIVAR_FS=y
CONFIG_UBIFS_FS=m CONFIG_UBIFS_FS=m
CONFIG_SQUASHFS=y CONFIG_SQUASHFS=y
CONFIG_PSTORE_RAM=m
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
CONFIG_NFS_V4=y CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y CONFIG_NFS_V4_1=y
......
...@@ -14,16 +14,43 @@ static unsigned int record_size = 1024; ...@@ -14,16 +14,43 @@ static unsigned int record_size = 1024;
module_param(record_size, uint, 0444); module_param(record_size, uint, 0444);
MODULE_PARM_DESC(record_size, "size of each pstore UEFI var (in bytes, min/default=1024)"); MODULE_PARM_DESC(record_size, "size of each pstore UEFI var (in bytes, min/default=1024)");
static bool efivars_pstore_disable =
IS_ENABLED(CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE);
module_param_named(pstore_disable, efivars_pstore_disable, bool, 0644);
#define PSTORE_EFI_ATTRIBUTES \ #define PSTORE_EFI_ATTRIBUTES \
(EFI_VARIABLE_NON_VOLATILE | \ (EFI_VARIABLE_NON_VOLATILE | \
EFI_VARIABLE_BOOTSERVICE_ACCESS | \ EFI_VARIABLE_BOOTSERVICE_ACCESS | \
EFI_VARIABLE_RUNTIME_ACCESS) EFI_VARIABLE_RUNTIME_ACCESS)
static bool pstore_disable = IS_ENABLED(CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE);
static int efivars_pstore_init(void);
static void efivars_pstore_exit(void);
static int efi_pstore_disable_set(const char *val, const struct kernel_param *kp)
{
int err;
bool old_pstore_disable = pstore_disable;
err = param_set_bool(val, kp);
if (err)
return err;
if (old_pstore_disable != pstore_disable) {
if (pstore_disable)
efivars_pstore_exit();
else
efivars_pstore_init();
}
return 0;
}
static const struct kernel_param_ops pstore_disable_ops = {
.set = efi_pstore_disable_set,
.get = param_get_bool,
};
module_param_cb(pstore_disable, &pstore_disable_ops, &pstore_disable, 0644);
__MODULE_PARM_TYPE(pstore_disable, "bool");
static int efi_pstore_open(struct pstore_info *psi) static int efi_pstore_open(struct pstore_info *psi)
{ {
int err; int err;
...@@ -218,12 +245,12 @@ static struct pstore_info efi_pstore_info = { ...@@ -218,12 +245,12 @@ static struct pstore_info efi_pstore_info = {
.erase = efi_pstore_erase, .erase = efi_pstore_erase,
}; };
static __init int efivars_pstore_init(void) static int efivars_pstore_init(void)
{ {
if (!efivar_supports_writes()) if (!efivar_supports_writes())
return 0; return 0;
if (efivars_pstore_disable) if (pstore_disable)
return 0; return 0;
/* /*
...@@ -250,7 +277,7 @@ static __init int efivars_pstore_init(void) ...@@ -250,7 +277,7 @@ static __init int efivars_pstore_init(void)
return 0; return 0;
} }
static __exit void efivars_pstore_exit(void) static void efivars_pstore_exit(void)
{ {
if (!efi_pstore_info.bufsize) if (!efi_pstore_info.bufsize)
return; return;
......
...@@ -307,7 +307,6 @@ int pstore_put_backend_records(struct pstore_info *psi) ...@@ -307,7 +307,6 @@ int pstore_put_backend_records(struct pstore_info *psi)
{ {
struct pstore_private *pos, *tmp; struct pstore_private *pos, *tmp;
struct dentry *root; struct dentry *root;
int rc = 0;
root = psinfo_lock_root(); root = psinfo_lock_root();
if (!root) if (!root)
...@@ -317,11 +316,8 @@ int pstore_put_backend_records(struct pstore_info *psi) ...@@ -317,11 +316,8 @@ int pstore_put_backend_records(struct pstore_info *psi)
list_for_each_entry_safe(pos, tmp, &records_list, list) { list_for_each_entry_safe(pos, tmp, &records_list, list) {
if (pos->record->psi == psi) { if (pos->record->psi == psi) {
list_del_init(&pos->list); list_del_init(&pos->list);
rc = simple_unlink(d_inode(root), pos->dentry); d_invalidate(pos->dentry);
if (WARN_ON(rc)) simple_unlink(d_inode(root), pos->dentry);
break;
d_drop(pos->dentry);
dput(pos->dentry);
pos->dentry = NULL; pos->dentry = NULL;
} }
} }
...@@ -329,7 +325,7 @@ int pstore_put_backend_records(struct pstore_info *psi) ...@@ -329,7 +325,7 @@ int pstore_put_backend_records(struct pstore_info *psi)
inode_unlock(d_inode(root)); inode_unlock(d_inode(root));
return rc; return 0;
} }
/* /*
......
...@@ -893,6 +893,7 @@ static const struct of_device_id dt_match[] = { ...@@ -893,6 +893,7 @@ static const struct of_device_id dt_match[] = {
{ .compatible = "ramoops" }, { .compatible = "ramoops" },
{} {}
}; };
MODULE_DEVICE_TABLE(of, dt_match);
static struct platform_driver ramoops_driver = { static struct platform_driver ramoops_driver = {
.probe = ramoops_probe, .probe = ramoops_probe,
......
...@@ -973,6 +973,8 @@ static ssize_t psz_kmsg_read(struct pstore_zone *zone, ...@@ -973,6 +973,8 @@ static ssize_t psz_kmsg_read(struct pstore_zone *zone,
char *buf = kasprintf(GFP_KERNEL, "%s: Total %d times\n", char *buf = kasprintf(GFP_KERNEL, "%s: Total %d times\n",
kmsg_dump_reason_str(record->reason), kmsg_dump_reason_str(record->reason),
record->count); record->count);
if (!buf)
return -ENOMEM;
hlen = strlen(buf); hlen = strlen(buf);
record->buf = krealloc(buf, hlen + size, GFP_KERNEL); record->buf = krealloc(buf, hlen + size, GFP_KERNEL);
if (!record->buf) { if (!record->buf) {
...@@ -1215,7 +1217,6 @@ static struct pstore_zone **psz_init_zones(enum pstore_type_id type, ...@@ -1215,7 +1217,6 @@ static struct pstore_zone **psz_init_zones(enum pstore_type_id type,
pr_err("allocate for zones %s failed\n", name); pr_err("allocate for zones %s failed\n", name);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
memset(zones, 0, c * sizeof(*zones));
for (i = 0; i < c; i++) { for (i = 0; i < c; i++) {
zone = psz_init_zone(type, off, record_size); zone = psz_init_zone(type, off, record_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment