OSDN Git Service

efi: Don't use spinlocks for efi vars
[android-x86/kernel.git] / drivers / firmware / efi / efivars.c
index 116b244..3e626fd 100644 (file)
@@ -510,7 +510,8 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
                vendor = del_var->VendorGuid;
        }
 
-       efivar_entry_iter_begin();
+       if (efivar_entry_iter_begin())
+               return -EINTR;
        entry = efivar_entry_find(name, vendor, &efivar_sysfs_list, true);
        if (!entry)
                err = -EINVAL;
@@ -575,7 +576,10 @@ efivar_create_sysfs_entry(struct efivar_entry *new_var)
                return ret;
 
        kobject_uevent(&new_var->kobj, KOBJ_ADD);
-       efivar_entry_add(new_var, &efivar_sysfs_list);
+       if (efivar_entry_add(new_var, &efivar_sysfs_list)) {
+               efivar_unregister(new_var);
+               return -EINTR;
+       }
 
        return 0;
 }
@@ -690,7 +694,10 @@ static int efivars_sysfs_callback(efi_char16_t *name, efi_guid_t vendor,
 
 static int efivar_sysfs_destroy(struct efivar_entry *entry, void *data)
 {
-       efivar_entry_remove(entry);
+       int err = efivar_entry_remove(entry);
+
+       if (err)
+               return err;
        efivar_unregister(entry);
        return 0;
 }
@@ -698,7 +705,14 @@ static int efivar_sysfs_destroy(struct efivar_entry *entry, void *data)
 static void efivars_sysfs_exit(void)
 {
        /* Remove all entries and destroy */
-       __efivar_entry_iter(efivar_sysfs_destroy, &efivar_sysfs_list, NULL, NULL);
+       int err;
+
+       err = __efivar_entry_iter(efivar_sysfs_destroy, &efivar_sysfs_list,
+                                 NULL, NULL);
+       if (err) {
+               pr_err("efivars: Failed to destroy sysfs entries\n");
+               return;
+       }
 
        if (efivars_new_var)
                sysfs_remove_bin_file(&efivars_kset->kobj, efivars_new_var);