Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 235496
b: refs/heads/master
c: d502fbb
h: refs/heads/master
v: v3
  • Loading branch information
Mike Waychison authored and Greg Kroah-Hartman committed Mar 14, 2011
1 parent 76f8147 commit e95ae23
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 26 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: 29422693c410c68071bdd60e0a0ec590490781aa
refs/heads/master: d502fbb0dc4d4babe5fb330257fa49a83fbf86a6
93 changes: 68 additions & 25 deletions trunk/drivers/firmware/efivars.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ struct efivars {
spinlock_t lock;
struct list_head list;
struct kset *kset;
struct bin_attribute *new_var, *del_var;
};
static struct efivars __efivars;
static struct efivars *efivars = &__efivars;
Expand Down Expand Up @@ -525,16 +526,6 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
return count;
}

static struct bin_attribute var_subsys_attr_new_var = {
.attr = {.name = "new_var", .mode = 0200},
.write = efivar_create,
};

static struct bin_attribute var_subsys_attr_del_var = {
.attr = {.name = "del_var", .mode = 0200},
.write = efivar_delete,
};

/*
* Let's not leave out systab information that snuck into
* the efivars driver
Expand Down Expand Up @@ -640,6 +631,66 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,

return 0;
}

static int
create_efivars_bin_attributes(struct efivars *efivars)
{
struct bin_attribute *attr;
int error;

/* new_var */
attr = kzalloc(sizeof(*attr), GFP_KERNEL);
if (!attr)
return -ENOMEM;

attr->attr.name = "new_var";
attr->attr.mode = 0200;
attr->write = efivar_create;
attr->private = efivars;
efivars->new_var = attr;

/* del_var */
attr = kzalloc(sizeof(*attr), GFP_KERNEL);
if (!attr) {
error = -ENOMEM;
goto out_free;
}
attr->attr.name = "del_var";
attr->attr.mode = 0200;
attr->write = efivar_delete;
attr->private = efivars;
efivars->del_var = attr;

sysfs_bin_attr_init(efivars->new_var);
sysfs_bin_attr_init(efivars->del_var);

/* Register */
error = sysfs_create_bin_file(&efivars->kset->kobj,
efivars->new_var);
if (error) {
printk(KERN_ERR "efivars: unable to create new_var sysfs file"
" due to error %d\n", error);
goto out_free;
}
error = sysfs_create_bin_file(&efivars->kset->kobj,
efivars->del_var);
if (error) {
printk(KERN_ERR "efivars: unable to create del_var sysfs file"
" due to error %d\n", error);
sysfs_remove_bin_file(&efivars->kset->kobj,
efivars->new_var);
goto out_free;
}

return 0;
out_free:
kfree(efivars->new_var);
efivars->new_var = NULL;
kfree(efivars->new_var);
efivars->new_var = NULL;
return error;
}

/*
* For now we register the efi subsystem with the firmware subsystem
* and the vars subsystem with the efi subsystem. In the future, it
Expand Down Expand Up @@ -714,20 +765,7 @@ efivars_init(void)
}
} while (status != EFI_NOT_FOUND);

/*
* Now add attributes to allow creation of new vars
* and deletion of existing ones...
*/
error = sysfs_create_bin_file(&efivars->kset->kobj,
&var_subsys_attr_new_var);
if (error)
printk(KERN_ERR "efivars: unable to create new_var sysfs file"
" due to error %d\n", error);
error = sysfs_create_bin_file(&efivars->kset->kobj,
&var_subsys_attr_del_var);
if (error)
printk(KERN_ERR "efivars: unable to create del_var sysfs file"
" due to error %d\n", error);
error = create_efivars_bin_attributes(efivars);

/* Don't forget the systab entry */
error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
Expand Down Expand Up @@ -758,7 +796,12 @@ efivars_exit(void)
spin_unlock(&efivars->lock);
efivar_unregister(entry);
}

if (efivars->new_var)
sysfs_remove_bin_file(&efivars->kset->kobj, efivars->new_var);
if (efivars->del_var)
sysfs_remove_bin_file(&efivars->kset->kobj, efivars->del_var);
kfree(efivars->new_var);
kfree(efivars->del_var);
kset_unregister(efivars->kset);
kobject_put(efi_kobj);
}
Expand Down

0 comments on commit e95ae23

Please sign in to comment.