143 lines
4.0 KiB
Diff
143 lines
4.0 KiB
Diff
From: Seth Forshee <seth.forshee@canonical.com>
|
|
Date: Thu, 7 Mar 2013 11:40:17 -0600
|
|
Subject: efivars: Allow disabling use as a pstore backend
|
|
|
|
commit ed9dc8ce7a1c8115dba9483a9b51df8b63a2e0ef upstream.
|
|
|
|
Add a new option, CONFIG_EFI_VARS_PSTORE, which can be set to N to
|
|
avoid using efivars as a backend to pstore, as some users may want to
|
|
compile out the code completely.
|
|
|
|
Set the default to Y to maintain backwards compatability, since this
|
|
feature has always been enabled until now.
|
|
|
|
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
|
|
Cc: Josh Boyer <jwboyer@redhat.com>
|
|
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
|
|
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
|
|
Cc: Tony Luck <tony.luck@intel.com>
|
|
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
|
[bwh: Backported to 3.2: adjust context]
|
|
---
|
|
drivers/firmware/Kconfig | 9 +++++++
|
|
drivers/firmware/efivars.c | 64 ++++++++++++++------------------------------
|
|
2 files changed, 29 insertions(+), 44 deletions(-)
|
|
|
|
--- a/drivers/firmware/Kconfig
|
|
+++ b/drivers/firmware/Kconfig
|
|
@@ -53,6 +53,15 @@ config EFI_VARS
|
|
Subsequent efibootmgr releases may be found at:
|
|
<http://linux.dell.com/efibootmgr>
|
|
|
|
+config EFI_VARS_PSTORE
|
|
+ bool "Register efivars backend for pstore"
|
|
+ depends on EFI_VARS && PSTORE
|
|
+ default y
|
|
+ help
|
|
+ Say Y here to enable use efivars as a backend to pstore. This
|
|
+ will allow writing console messages, crash dumps, or anything
|
|
+ else supported by pstore to EFI variables.
|
|
+
|
|
config EFI_PCDP
|
|
bool "Console device selection via EFI PCDP or HCDP table"
|
|
depends on ACPI && EFI && IA64
|
|
--- a/drivers/firmware/efivars.c
|
|
+++ b/drivers/firmware/efivars.c
|
|
@@ -660,8 +660,6 @@ static struct kobj_type efivar_ktype = {
|
|
.default_attrs = def_attrs,
|
|
};
|
|
|
|
-static struct pstore_info efi_pstore_info;
|
|
-
|
|
static inline void
|
|
efivar_unregister(struct efivar_entry *var)
|
|
{
|
|
@@ -698,7 +696,7 @@ static int efi_status_to_err(efi_status_
|
|
return err;
|
|
}
|
|
|
|
-#ifdef CONFIG_PSTORE
|
|
+#ifdef CONFIG_EFI_VARS_PSTORE
|
|
|
|
static int efi_pstore_open(struct pstore_info *psi)
|
|
{
|
|
@@ -848,36 +846,6 @@ static int efi_pstore_erase(enum pstore_
|
|
|
|
return 0;
|
|
}
|
|
-#else
|
|
-static int efi_pstore_open(struct pstore_info *psi)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int efi_pstore_close(struct pstore_info *psi)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
|
|
- struct timespec *timespec,
|
|
- char **buf, struct pstore_info *psi)
|
|
-{
|
|
- return -1;
|
|
-}
|
|
-
|
|
-static int efi_pstore_write(enum pstore_type_id type, u64 *id,
|
|
- unsigned int part, size_t size, struct pstore_info *psi)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-static int efi_pstore_erase(enum pstore_type_id type, u64 id,
|
|
- struct pstore_info *psi)
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-#endif
|
|
|
|
static struct pstore_info efi_pstore_info = {
|
|
.owner = THIS_MODULE,
|
|
@@ -889,6 +857,24 @@ static struct pstore_info efi_pstore_inf
|
|
.erase = efi_pstore_erase,
|
|
};
|
|
|
|
+static void efivar_pstore_register(struct efivars *efivars)
|
|
+{
|
|
+ efivars->efi_pstore_info = efi_pstore_info;
|
|
+ efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL);
|
|
+ if (efivars->efi_pstore_info.buf) {
|
|
+ efivars->efi_pstore_info.bufsize = 1024;
|
|
+ efivars->efi_pstore_info.data = efivars;
|
|
+ spin_lock_init(&efivars->efi_pstore_info.buf_lock);
|
|
+ pstore_register(&efivars->efi_pstore_info);
|
|
+ }
|
|
+}
|
|
+#else
|
|
+static void efivar_pstore_register(struct efivars *efivars)
|
|
+{
|
|
+ return;
|
|
+}
|
|
+#endif
|
|
+
|
|
static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
|
|
struct bin_attribute *bin_attr,
|
|
char *buf, loff_t pos, size_t count)
|
|
@@ -1272,15 +1258,7 @@ int register_efivars(struct efivars *efi
|
|
if (error)
|
|
unregister_efivars(efivars);
|
|
|
|
- efivars->efi_pstore_info = efi_pstore_info;
|
|
-
|
|
- efivars->efi_pstore_info.buf = kmalloc(4096, GFP_KERNEL);
|
|
- if (efivars->efi_pstore_info.buf) {
|
|
- efivars->efi_pstore_info.bufsize = 1024;
|
|
- efivars->efi_pstore_info.data = efivars;
|
|
- spin_lock_init(&efivars->efi_pstore_info.buf_lock);
|
|
- pstore_register(&efivars->efi_pstore_info);
|
|
- }
|
|
+ efivar_pstore_register(efivars);
|
|
|
|
out:
|
|
kfree(variable_name);
|