static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, struct timespec *timespec, struct pstore_info *psi) { efi_guid_t vendor = LINUX_EFI_CRASH_GUID; struct efivars *efivars = psi->data; char name[DUMP_NAME_LEN]; int i; unsigned int part, size; unsigned long time; while (&efivars->walk_entry->list != &efivars->list) { if (!efi_guidcmp(efivars->walk_entry->var.VendorGuid, vendor)) { for (i = 0; i < DUMP_NAME_LEN; i++) { name[i] = efivars->walk_entry->var.VariableName[i]; } if (sscanf(name, "dump-type%u-%u-%lu", type, &part, &time) == 3) { *id = part; timespec->tv_sec = time; timespec->tv_nsec = 0; get_var_data_locked(efivars, &efivars->walk_entry->var); size = efivars->walk_entry->var.DataSize; memcpy(psi->buf, efivars->walk_entry->var.Data, size); efivars->walk_entry = list_entry(efivars->walk_entry->list.next, struct efivar_entry, list); return size; } } efivars->walk_entry = list_entry(efivars->walk_entry->list.next, struct efivar_entry, list); }
static efi_status_t get_var_data(struct efivars *efivars, struct efi_variable *var) { efi_status_t status; spin_lock(&efivars->lock); status = get_var_data_locked(efivars, var); spin_unlock(&efivars->lock); if (status != EFI_SUCCESS) { printk(KERN_WARNING "efivars: get_variable() failed 0x%lx!\n", status); } return status; }
static efi_status_t get_var_data(struct efivars *efivars, struct efi_variable *var) { efi_status_t status; unsigned long flags; spin_lock_irqsave(&efivars->lock, flags); status = get_var_data_locked(efivars, var); spin_unlock_irqrestore(&efivars->lock, flags); if (status != EFI_SUCCESS) { printk(KERN_WARNING "efivars: get_variable() failed 0x%lx!\n", status); } return status; }