Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 235497
b: refs/heads/master
c: 4142ef1
h: refs/heads/master
i:
  235495: 76f8147
v: v3
  • Loading branch information
Mike Waychison authored and Greg Kroah-Hartman committed Mar 14, 2011
1 parent e95ae23 commit fe9f2a5
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 19 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d502fbb0dc4d4babe5fb330257fa49a83fbf86a6
refs/heads/master: 4142ef146aee440731de956d9f9f3170d5a238ae
49 changes: 31 additions & 18 deletions trunk/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 fe9f2a5

Please sign in to comment.