Skip to content

Commit

Permalink
efivars: parameterize efivars
Browse files Browse the repository at this point in the history
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>
Cc: Matt Domsch <Matt_Domsch@dell.com>,
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Mike Waychison authored and Greg Kroah-Hartman committed Mar 14, 2011
1 parent d502fbb commit 4142ef1
Showing 1 changed file with 31 additions and 18 deletions.
49 changes: 31 additions & 18 deletions drivers/firmware/efivars.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -124,6 +122,7 @@ struct efi_variable {


struct efivar_entry {
struct efivars *efivars;
struct efi_variable var;
struct list_head list;
struct kobject kobj;
Expand All @@ -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
Expand All @@ -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;

Expand Down Expand Up @@ -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;

Expand All @@ -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;

Expand All @@ -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;

Expand All @@ -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))
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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");
}
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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));
Expand Down Expand Up @@ -691,6 +699,8 @@ create_efivars_bin_attributes(struct efivars *efivars)
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
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -788,6 +800,7 @@ efivars_init(void)
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) {
Expand Down

0 comments on commit 4142ef1

Please sign in to comment.