From: Mike Waychison <mikew@google.com>
To: Greg KH <greg@kroah.com>, Matt Domsch <Matt_Domsch@dell.com>,
Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Duncan Laurie <dlaurie@google.com>,
Aaron Durbin <adurbin@google.com>,
x86@kernel.org, linux-kernel@vger.kernel.org,
Tim Hockin <thockin@google.com>, San Mehat <san@google.com>
Subject: [PATCH v2 03/12] efivars: parameterize efivars
Date: Fri, 11 Mar 2011 17:43:11 -0800 [thread overview]
Message-ID: <20110312014311.6133.37898.stgit@mike.mtv.corp.google.com> (raw)
In-Reply-To: <20110312014254.6133.43079.stgit@mike.mtv.corp.google.com>
Now that we all global variable state is encapsulated by struct efivars,
parameterize all functions to the efivars local to the control flow rather
than at file scope. We do this by removing the variable "efivars" at file
scope and move its storage down to the end of the file.
Variables get at efivars by storing the efivars pointer within each
efivar_entry. The "new_var" and "del_var" binary attribute files get at
the efivars through the private pointer.
Signed-off-by: Mike Waychison <mikew@google.com>
---
drivers/firmware/efivars.c | 49 ++++++++++++++++++++++++++++----------------
1 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 528ce47..5633018 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -103,8 +103,6 @@ struct efivars {
struct kset *kset;
struct bin_attribute *new_var, *del_var;
};
-static struct efivars __efivars;
-static struct efivars *efivars = &__efivars;
/*
* The maximum size of VariableName + Data = 1024
@@ -124,6 +122,7 @@ struct efi_variable {
struct efivar_entry {
+ struct efivars *efivars;
struct efi_variable var;
struct list_head list;
struct kobject kobj;
@@ -150,9 +149,10 @@ struct efivar_attribute efivar_attr_##_name = { \
* Prototype for sysfs creation function
*/
static int
-efivar_create_sysfs_entry(unsigned long variable_name_size,
- efi_char16_t *variable_name,
- efi_guid_t *vendor_guid);
+efivar_create_sysfs_entry(struct efivars *efivars,
+ unsigned long variable_name_size,
+ efi_char16_t *variable_name,
+ efi_guid_t *vendor_guid);
/* Return the number of unicode characters in data */
static unsigned long
@@ -176,7 +176,7 @@ utf8_strsize(efi_char16_t *data, unsigned long maxlength)
}
static efi_status_t
-get_var_data(struct efi_variable *var)
+get_var_data(struct efivars *efivars, struct efi_variable *var)
{
efi_status_t status;
@@ -221,7 +221,7 @@ efivar_attr_read(struct efivar_entry *entry, char *buf)
if (!entry || !buf)
return -EINVAL;
- status = get_var_data(var);
+ status = get_var_data(entry->efivars, var);
if (status != EFI_SUCCESS)
return -EIO;
@@ -244,7 +244,7 @@ efivar_size_read(struct efivar_entry *entry, char *buf)
if (!entry || !buf)
return -EINVAL;
- status = get_var_data(var);
+ status = get_var_data(entry->efivars, var);
if (status != EFI_SUCCESS)
return -EIO;
@@ -261,7 +261,7 @@ efivar_data_read(struct efivar_entry *entry, char *buf)
if (!entry || !buf)
return -EINVAL;
- status = get_var_data(var);
+ status = get_var_data(entry->efivars, var);
if (status != EFI_SUCCESS)
return -EIO;
@@ -276,6 +276,7 @@ static ssize_t
efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
{
struct efi_variable *new_var, *var = &entry->var;
+ struct efivars *efivars = entry->efivars;
efi_status_t status = EFI_NOT_FOUND;
if (count != sizeof(struct efi_variable))
@@ -325,7 +326,7 @@ efivar_show_raw(struct efivar_entry *entry, char *buf)
if (!entry || !buf)
return 0;
- status = get_var_data(var);
+ status = get_var_data(entry->efivars, var);
if (status != EFI_SUCCESS)
return -EIO;
@@ -413,6 +414,7 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
char *buf, loff_t pos, size_t count)
{
struct efi_variable *new_var = (struct efi_variable *)buf;
+ struct efivars *efivars = bin_attr->private;
struct efivar_entry *search_efivar, *n;
unsigned long strsize1, strsize2;
efi_status_t status = EFI_NOT_FOUND;
@@ -459,8 +461,11 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
spin_unlock(&efivars->lock);
/* Create the entry in sysfs. Locking is not required here */
- status = efivar_create_sysfs_entry(utf8_strsize(new_var->VariableName,
- 1024), new_var->VariableName, &new_var->VendorGuid);
+ status = efivar_create_sysfs_entry(efivars,
+ utf8_strsize(new_var->VariableName,
+ 1024),
+ new_var->VariableName,
+ &new_var->VendorGuid);
if (status) {
printk(KERN_WARNING "efivars: variable created, but sysfs entry wasn't.\n");
}
@@ -472,6 +477,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
char *buf, loff_t pos, size_t count)
{
struct efi_variable *del_var = (struct efi_variable *)buf;
+ struct efivars *efivars = bin_attr->private;
struct efivar_entry *search_efivar, *n;
unsigned long strsize1, strsize2;
efi_status_t status = EFI_NOT_FOUND;
@@ -580,9 +586,10 @@ static struct kobject *efi_kobj;
* Returns 1 on failure, 0 on success
*/
static int
-efivar_create_sysfs_entry(unsigned long variable_name_size,
- efi_char16_t *variable_name,
- efi_guid_t *vendor_guid)
+efivar_create_sysfs_entry(struct efivars *efivars,
+ unsigned long variable_name_size,
+ efi_char16_t *variable_name,
+ efi_guid_t *vendor_guid)
{
int i, short_name_size = variable_name_size / sizeof(efi_char16_t) + 38;
char *short_name;
@@ -597,6 +604,7 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
return 1;
}
+ new_efivar->efivars = efivars;
memcpy(new_efivar->var.VariableName, variable_name,
variable_name_size);
memcpy(&(new_efivar->var.VendorGuid), vendor_guid, sizeof(efi_guid_t));
@@ -691,6 +699,8 @@ out_free:
return error;
}
+static struct efivars __efivars;
+
/*
* For now we register the efi subsystem with the firmware subsystem
* and the vars subsystem with the efi subsystem. In the future, it
@@ -706,6 +716,7 @@ efivars_init(void)
efi_guid_t vendor_guid;
efi_char16_t *variable_name;
unsigned long variable_name_size = 1024;
+ struct efivars *efivars = &__efivars;
int error = 0;
if (!efi_enabled)
@@ -751,9 +762,10 @@ efivars_init(void)
&vendor_guid);
switch (status) {
case EFI_SUCCESS:
- efivar_create_sysfs_entry(variable_name_size,
- variable_name,
- &vendor_guid);
+ efivar_create_sysfs_entry(efivars,
+ variable_name_size,
+ variable_name,
+ &vendor_guid);
break;
case EFI_NOT_FOUND:
break;
@@ -788,6 +800,7 @@ out_free:
static void __exit
efivars_exit(void)
{
+ struct efivars *efivars = &__efivars;
struct efivar_entry *entry, *n;
list_for_each_entry_safe(entry, n, &efivars->list, list) {
next prev parent reply other threads:[~2011-03-12 1:43 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-12 1:42 [PATCH v2 00/12] google firmware support Mike Waychison
2011-03-12 1:43 ` [PATCH v2 01/12] efivars: move efivars globals into struct efivars Mike Waychison
2011-03-12 1:43 ` [PATCH v2 02/12] efivars: Make efivars bin_attributes dynamic Mike Waychison
2011-03-12 1:43 ` Mike Waychison [this message]
2011-03-12 1:43 ` [PATCH v2 04/12] efivars: Split out variable registration Mike Waychison
2011-03-12 1:43 ` [PATCH v2 05/12] efivars: Parameterize operations Mike Waychison
2011-03-12 1:43 ` [PATCH v2 06/12] efivars: Expose efivars functionality to external drivers Mike Waychison
2011-03-12 1:43 ` [PATCH v2 07/12] efivars: Add Documentation Mike Waychison
2011-03-12 1:43 ` [PATCH v2 08/12] x86: get_bios_ebda_length() Mike Waychison
2011-03-14 15:43 ` Greg KH
2011-03-12 1:43 ` [PATCH v2 09/12] x86: Better comments for get_bios_ebda() Mike Waychison
2011-03-14 15:43 ` Greg KH
2011-03-12 1:43 ` [PATCH v2 10/12] Introduce CONFIG_GOOGLE_FIRMWARE Mike Waychison
2011-03-14 15:45 ` Greg KH
2011-03-14 19:49 ` Mike Waychison
2011-03-14 19:59 ` Greg KH
2011-03-14 20:06 ` Mike Waychison
2011-03-12 1:43 ` [PATCH v2 11/12] driver: Google EFI SMI Mike Waychison
2011-03-14 15:47 ` Greg KH
2011-03-14 20:01 ` Mike Waychison
2011-03-14 20:13 ` Greg KH
2011-03-14 21:09 ` Mike Waychison
2011-03-14 23:05 ` Alan Cox
2011-03-12 1:43 ` [PATCH v2 12/12] driver: Google Memory Console Mike Waychison
2011-03-14 4:54 ` H. Peter Anvin
2011-03-14 4:58 ` Tim Hockin
2011-03-14 5:02 ` H. Peter Anvin
2011-03-14 9:22 ` Ingo Molnar
2011-03-14 14:01 ` Tim Hockin
2011-03-14 14:23 ` Ingo Molnar
2011-03-14 15:47 ` Greg KH
2011-03-14 20:03 ` Mike Waychison
2011-03-14 22:46 ` H. Peter Anvin
2011-03-12 3:54 ` [PATCH v2 00/12] google firmware support Matt Domsch
2011-03-14 15:42 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110312014311.6133.37898.stgit@mike.mtv.corp.google.com \
--to=mikew@google.com \
--cc=Matt_Domsch@dell.com \
--cc=adurbin@google.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=dlaurie@google.com \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=san@google.com \
--cc=thockin@google.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®