static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count, struct timespec time, struct pstore_info *psi) { struct pstore_erase_data edata; struct efivar_entry *entry = NULL; char name[DUMP_NAME_LEN]; efi_char16_t efi_name[DUMP_NAME_LEN]; int found, i; unsigned int part; do_div(id, 1000); part = do_div(id, 100); sprintf(name, "dump-type%u-%u-%d-%lu", type, part, count, time.tv_sec); for (i = 0; i < DUMP_NAME_LEN; i++) efi_name[i] = name[i]; edata.id = part; edata.type = type; edata.count = count; edata.time = time; edata.name = efi_name; efivar_entry_iter_begin(); found = __efivar_entry_iter(efi_pstore_erase_func, &efivar_sysfs_list, &edata, &entry); efivar_entry_iter_end(); if (found) efivar_unregister(entry); return 0; }
static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t pos, size_t count) { struct efi_variable *del_var = (struct efi_variable *)buf; struct efivar_entry *entry; int err = 0; if (!capable(CAP_SYS_ADMIN)) return -EACCES; efivar_entry_iter_begin(); entry = efivar_entry_find(del_var->VariableName, del_var->VendorGuid, &efivar_sysfs_list, true); if (!entry) err = -EINVAL; else if (__efivar_entry_delete(entry)) err = -EIO; efivar_entry_iter_end(); if (err) return err; efivar_unregister(entry); /* It's dead Jim.... */ return count; }
static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t pos, size_t count) { struct efi_variable *del_var = (struct efi_variable *)buf; struct compat_efi_variable *compat; struct efivar_entry *entry; efi_char16_t *name; efi_guid_t vendor; int err = 0; if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (is_compat()) { if (count != sizeof(*compat)) return -EINVAL; compat = (struct compat_efi_variable *)buf; name = compat->VariableName; vendor = compat->VendorGuid; } else { if (count != sizeof(*del_var)) return -EINVAL; name = del_var->VariableName; vendor = del_var->VendorGuid; } efivar_entry_iter_begin(); entry = efivar_entry_find(name, vendor, &efivar_sysfs_list, true); if (!entry) err = -EINVAL; else if (__efivar_entry_delete(entry)) err = -EIO; if (err) { efivar_entry_iter_end(); return err; } if (!entry->scanning) { efivar_entry_iter_end(); efivar_unregister(entry); } else efivar_entry_iter_end(); /* It's dead Jim.... */ return count; }
static int efi_pstore_open(struct pstore_info *psi) { efivar_entry_iter_begin(); psi->data = NULL; return 0; }