|
@@ -681,17 +681,35 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
|
|
|
*count = cnt;
|
|
|
timespec->tv_sec = time;
|
|
|
timespec->tv_nsec = 0;
|
|
|
- get_var_data_locked(efivars, &efivars->walk_entry->var);
|
|
|
- size = efivars->walk_entry->var.DataSize;
|
|
|
- *buf = kmalloc(size, GFP_KERNEL);
|
|
|
- if (*buf == NULL)
|
|
|
- return -ENOMEM;
|
|
|
- memcpy(*buf, efivars->walk_entry->var.Data,
|
|
|
- size);
|
|
|
- efivars->walk_entry = list_entry(efivars->walk_entry->list.next,
|
|
|
- struct efivar_entry, list);
|
|
|
- return size;
|
|
|
+ } else if (sscanf(name, "dump-type%u-%u-%lu",
|
|
|
+ type, &part, &time) == 3) {
|
|
|
+ /*
|
|
|
+ * Check if an old format,
|
|
|
+ * which doesn't support holding
|
|
|
+ * multiple logs, remains.
|
|
|
+ */
|
|
|
+ *id = part;
|
|
|
+ *count = 0;
|
|
|
+ timespec->tv_sec = time;
|
|
|
+ timespec->tv_nsec = 0;
|
|
|
+ } else {
|
|
|
+ efivars->walk_entry = list_entry(
|
|
|
+ efivars->walk_entry->list.next,
|
|
|
+ struct efivar_entry, list);
|
|
|
+ continue;
|
|
|
}
|
|
|
+
|
|
|
+ get_var_data_locked(efivars, &efivars->walk_entry->var);
|
|
|
+ size = efivars->walk_entry->var.DataSize;
|
|
|
+ *buf = kmalloc(size, GFP_KERNEL);
|
|
|
+ if (*buf == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
+ memcpy(*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);
|