Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed9dc8ce authored by Seth Forshee's avatar Seth Forshee Committed by Matt Fleming
Browse files

efivars: Allow disabling use as a pstore backend



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: default avatarSeth 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>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent f6161aa1
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -53,6 +53,15 @@ config EFI_VARS
	  Subsequent efibootmgr releases may be found at:
	  Subsequent efibootmgr releases may be found at:
	  <http://linux.dell.com/efibootmgr>
	  <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
config EFI_PCDP
	bool "Console device selection via EFI PCDP or HCDP table"
	bool "Console device selection via EFI PCDP or HCDP table"
	depends on ACPI && EFI && IA64
	depends on ACPI && EFI && IA64
+20 −44
Original line number Original line Diff line number Diff line
@@ -1309,9 +1309,7 @@ static const struct inode_operations efivarfs_dir_inode_operations = {
	.create = efivarfs_create,
	.create = efivarfs_create,
};
};


static struct pstore_info efi_pstore_info;
#ifdef CONFIG_EFI_VARS_PSTORE

#ifdef CONFIG_PSTORE


static int efi_pstore_open(struct pstore_info *psi)
static int efi_pstore_open(struct pstore_info *psi)
{
{
@@ -1514,38 +1512,6 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,


	return 0;
	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, int *count,
			       struct timespec *timespec,
			       char **buf, struct pstore_info *psi)
{
	return -1;
}

static int efi_pstore_write(enum pstore_type_id type,
		enum kmsg_dump_reason reason, u64 *id,
		unsigned int part, int count, size_t size,
		struct pstore_info *psi)
{
	return 0;
}

static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
			    struct timespec time, struct pstore_info *psi)
{
	return 0;
}
#endif


static struct pstore_info efi_pstore_info = {
static struct pstore_info efi_pstore_info = {
	.owner		= THIS_MODULE,
	.owner		= THIS_MODULE,
@@ -1557,6 +1523,24 @@ static struct pstore_info efi_pstore_info = {
	.erase		= efi_pstore_erase,
	.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,
static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
			     struct bin_attribute *bin_attr,
			     struct bin_attribute *bin_attr,
			     char *buf, loff_t pos, size_t count)
			     char *buf, loff_t pos, size_t count)
@@ -2025,15 +2009,7 @@ int register_efivars(struct efivars *efivars,
	if (error)
	if (error)
		unregister_efivars(efivars);
		unregister_efivars(efivars);


	efivars->efi_pstore_info = efi_pstore_info;
	efivar_pstore_register(efivars);

	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);
	}


	register_filesystem(&efivarfs_type);
	register_filesystem(&efivarfs_type);