efivarfs: remove unused efivarfs_list
Remove all function helpers and mentions of the efivarfs_list now that all consumers of the list have been removed and entry management goes exclusively through the inode. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
parent
fddca52766
commit
a58e954464
4 changed files with 21 additions and 116 deletions
|
@ -77,7 +77,6 @@ static bool efivarfs_valid_name(const char *str, int len)
|
|||
static int efivarfs_create(struct mnt_idmap *idmap, struct inode *dir,
|
||||
struct dentry *dentry, umode_t mode, bool excl)
|
||||
{
|
||||
struct efivarfs_fs_info *info = dir->i_sb->s_fs_info;
|
||||
struct inode *inode = NULL;
|
||||
struct efivar_entry *var;
|
||||
int namelen, i = 0, err = 0;
|
||||
|
@ -92,21 +91,17 @@ static int efivarfs_create(struct mnt_idmap *idmap, struct inode *dir,
|
|||
|
||||
err = guid_parse(dentry->d_name.name + namelen + 1, &vendor);
|
||||
if (err)
|
||||
goto out;
|
||||
if (guid_equal(&vendor, &LINUX_EFI_RANDOM_SEED_TABLE_GUID)) {
|
||||
err = -EPERM;
|
||||
goto out;
|
||||
}
|
||||
return err;
|
||||
if (guid_equal(&vendor, &LINUX_EFI_RANDOM_SEED_TABLE_GUID))
|
||||
return -EPERM;
|
||||
|
||||
if (efivar_variable_is_removable(vendor,
|
||||
dentry->d_name.name, namelen))
|
||||
is_removable = true;
|
||||
|
||||
inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0, is_removable);
|
||||
if (!inode) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (!inode)
|
||||
return -ENOMEM;
|
||||
var = efivar_entry(inode);
|
||||
|
||||
var->var.VendorGuid = vendor;
|
||||
|
@ -118,17 +113,10 @@ static int efivarfs_create(struct mnt_idmap *idmap, struct inode *dir,
|
|||
|
||||
inode->i_private = var;
|
||||
|
||||
err = efivar_entry_add(var, &info->efivarfs_list);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
d_instantiate(dentry, inode);
|
||||
dget(dentry);
|
||||
out:
|
||||
if (err && inode)
|
||||
iput(inode);
|
||||
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int efivarfs_unlink(struct inode *dir, struct dentry *dentry)
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#ifndef EFIVAR_FS_INTERNAL_H
|
||||
#define EFIVAR_FS_INTERNAL_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/efi.h>
|
||||
|
||||
struct efivarfs_mount_opts {
|
||||
|
@ -16,7 +15,6 @@ struct efivarfs_mount_opts {
|
|||
|
||||
struct efivarfs_fs_info {
|
||||
struct efivarfs_mount_opts mount_opts;
|
||||
struct list_head efivarfs_list;
|
||||
struct super_block *sb;
|
||||
struct notifier_block nb;
|
||||
};
|
||||
|
@ -28,7 +26,6 @@ struct efi_variable {
|
|||
|
||||
struct efivar_entry {
|
||||
struct efi_variable var;
|
||||
struct list_head list;
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
|
||||
|
@ -37,12 +34,9 @@ static inline struct efivar_entry *efivar_entry(struct inode *inode)
|
|||
return container_of(inode, struct efivar_entry, vfs_inode);
|
||||
}
|
||||
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *,
|
||||
struct list_head *),
|
||||
void *data, struct list_head *head);
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
|
||||
void *data);
|
||||
|
||||
int efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
|
||||
void __efivar_entry_add(struct efivar_entry *entry, struct list_head *head);
|
||||
int efivar_entry_delete(struct efivar_entry *entry);
|
||||
|
||||
int efivar_entry_size(struct efivar_entry *entry, unsigned long *size);
|
||||
|
@ -53,8 +47,6 @@ int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
|
|||
int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
||||
unsigned long *size, void *data, bool *set);
|
||||
|
||||
int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
|
||||
struct list_head *head, void *data);
|
||||
|
||||
bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data,
|
||||
unsigned long data_size);
|
||||
|
|
|
@ -55,8 +55,6 @@ static void efivarfs_free_inode(struct inode *inode)
|
|||
{
|
||||
struct efivar_entry *entry = efivar_entry(inode);
|
||||
|
||||
if (inode->i_private)
|
||||
list_del(&entry->list);
|
||||
kfree(entry);
|
||||
}
|
||||
|
||||
|
@ -228,8 +226,7 @@ bool efivarfs_variable_is_present(efi_char16_t *variable_name,
|
|||
}
|
||||
|
||||
static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor,
|
||||
unsigned long name_size, void *data,
|
||||
struct list_head *list)
|
||||
unsigned long name_size, void *data)
|
||||
{
|
||||
struct super_block *sb = (struct super_block *)data;
|
||||
struct efivar_entry *entry;
|
||||
|
@ -271,7 +268,6 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor,
|
|||
}
|
||||
|
||||
__efivar_entry_get(entry, NULL, &size, NULL);
|
||||
__efivar_entry_add(entry, list);
|
||||
|
||||
/* copied by the above to local storage in the dentry. */
|
||||
kfree(name);
|
||||
|
@ -361,7 +357,7 @@ static int efivarfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
return efivar_init(efivarfs_callback, sb, &sfi->efivarfs_list);
|
||||
return efivar_init(efivarfs_callback, sb);
|
||||
}
|
||||
|
||||
static int efivarfs_get_tree(struct fs_context *fc)
|
||||
|
@ -396,8 +392,6 @@ static int efivarfs_init_fs_context(struct fs_context *fc)
|
|||
if (!sfi)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&sfi->efivarfs_list);
|
||||
|
||||
sfi->mount_opts.uid = GLOBAL_ROOT_UID;
|
||||
sfi->mount_opts.gid = GLOBAL_ROOT_GID;
|
||||
|
||||
|
@ -413,8 +407,6 @@ static void efivarfs_kill_sb(struct super_block *sb)
|
|||
blocking_notifier_chain_unregister(&efivar_ops_nh, &sfi->nb);
|
||||
kill_litter_super(sb);
|
||||
|
||||
/* Remove all entries and destroy */
|
||||
WARN_ON(!list_empty(&sfi->efivarfs_list));
|
||||
kfree(sfi);
|
||||
}
|
||||
|
||||
|
|
|
@ -364,16 +364,14 @@ static void dup_variable_bug(efi_char16_t *str16, efi_guid_t *vendor_guid,
|
|||
* efivar_init - build the initial list of EFI variables
|
||||
* @func: callback function to invoke for every variable
|
||||
* @data: function-specific data to pass to @func
|
||||
* @head: initialised head of variable list
|
||||
*
|
||||
* Get every EFI variable from the firmware and invoke @func. @func
|
||||
* should call efivar_entry_add() to build the list of variables.
|
||||
* should populate the initial dentry and inode tree.
|
||||
*
|
||||
* Returns 0 on success, or a kernel error code on failure.
|
||||
*/
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *,
|
||||
struct list_head *),
|
||||
void *data, struct list_head *head)
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
|
||||
void *data)
|
||||
{
|
||||
unsigned long variable_name_size = 512;
|
||||
efi_char16_t *variable_name;
|
||||
|
@ -424,7 +422,7 @@ int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *,
|
|||
status = EFI_NOT_FOUND;
|
||||
} else {
|
||||
err = func(variable_name, vendor_guid,
|
||||
variable_name_size, data, head);
|
||||
variable_name_size, data);
|
||||
if (err)
|
||||
status = EFI_NOT_FOUND;
|
||||
}
|
||||
|
@ -456,42 +454,12 @@ free:
|
|||
}
|
||||
|
||||
/**
|
||||
* efivar_entry_add - add entry to variable list
|
||||
* @entry: entry to add to list
|
||||
* @head: list head
|
||||
*
|
||||
* Returns 0 on success, or a kernel error code on failure.
|
||||
*/
|
||||
int efivar_entry_add(struct efivar_entry *entry, struct list_head *head)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = efivar_lock();
|
||||
if (err)
|
||||
return err;
|
||||
list_add(&entry->list, head);
|
||||
efivar_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* __efivar_entry_add - add entry to variable list
|
||||
* @entry: entry to add to list
|
||||
* @head: list head
|
||||
*/
|
||||
void __efivar_entry_add(struct efivar_entry *entry, struct list_head *head)
|
||||
{
|
||||
list_add(&entry->list, head);
|
||||
}
|
||||
|
||||
/**
|
||||
* efivar_entry_delete - delete variable and remove entry from list
|
||||
* efivar_entry_delete - delete variable
|
||||
* @entry: entry containing variable to delete
|
||||
*
|
||||
* Delete the variable from the firmware and remove @entry from the
|
||||
* variable list. It is the caller's responsibility to free @entry
|
||||
* once we return.
|
||||
* Delete the variable from the firmware. It is the caller's
|
||||
* responsibility to free @entry (by deleting the dentry/inode) once
|
||||
* we return.
|
||||
*
|
||||
* Returns 0 on success, -EINTR if we can't grab the semaphore,
|
||||
* converted EFI status code if set_variable() fails.
|
||||
|
@ -605,7 +573,7 @@ int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
|
|||
* get_variable() fail.
|
||||
*
|
||||
* If the EFI variable does not exist when calling set_variable()
|
||||
* (EFI_NOT_FOUND), @entry is removed from the variable list.
|
||||
* (EFI_NOT_FOUND).
|
||||
*/
|
||||
int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
||||
unsigned long *size, void *data, bool *set)
|
||||
|
@ -621,9 +589,8 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
|||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* The lock here protects the get_variable call, the conditional
|
||||
* set_variable call, and removal of the variable from the efivars
|
||||
* list (in the case of an authenticated delete).
|
||||
* The lock here protects the get_variable call and the
|
||||
* conditional set_variable call
|
||||
*/
|
||||
err = efivar_lock();
|
||||
if (err)
|
||||
|
@ -661,37 +628,3 @@ out:
|
|||
return err;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* efivar_entry_iter - iterate over variable list
|
||||
* @func: callback function
|
||||
* @head: head of variable list
|
||||
* @data: function-specific data to pass to callback
|
||||
*
|
||||
* Iterate over the list of EFI variables and call @func with every
|
||||
* entry on the list. It is safe for @func to remove entries in the
|
||||
* list via efivar_entry_delete() while iterating.
|
||||
*
|
||||
* Some notes for the callback function:
|
||||
* - a non-zero return value indicates an error and terminates the loop
|
||||
* - @func is called from atomic context
|
||||
*/
|
||||
int efivar_entry_iter(int (*func)(struct efivar_entry *, void *),
|
||||
struct list_head *head, void *data)
|
||||
{
|
||||
struct efivar_entry *entry, *n;
|
||||
int err = 0;
|
||||
|
||||
err = efivar_lock();
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
list_for_each_entry_safe(entry, n, head, list) {
|
||||
err = func(entry, data);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
efivar_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue