Commit 45006972 authored by Madper Xie's avatar Madper Xie Committed by Greg Kroah-Hartman

efi-pstore: Make efi-pstore return a unique id

commit fdeadb43 upstream.

Pstore fs expects that backends provide a unique id which could avoid
pstore making entries as duplication or denominating entries the same
name. So I combine the timestamp, part and count into id.
Signed-off-by: default avatarMadper Xie <cxie@redhat.com>
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
[hkp: Backported to 3.10: adjust context]
Signed-off-by: default avatarHu Keping <hukeping@huawei.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 681f5717
...@@ -38,6 +38,12 @@ struct pstore_read_data { ...@@ -38,6 +38,12 @@ struct pstore_read_data {
char **buf; char **buf;
}; };
static inline u64 generic_id(unsigned long timestamp,
unsigned int part, int count)
{
return (timestamp * 100 + part) * 1000 + count;
}
static int efi_pstore_read_func(struct efivar_entry *entry, void *data) static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
{ {
efi_guid_t vendor = LINUX_EFI_CRASH_GUID; efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
...@@ -56,7 +62,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data) ...@@ -56,7 +62,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
if (sscanf(name, "dump-type%u-%u-%d-%lu", if (sscanf(name, "dump-type%u-%u-%d-%lu",
cb_data->type, &part, &cnt, &time) == 4) { cb_data->type, &part, &cnt, &time) == 4) {
*cb_data->id = part; *cb_data->id = generic_id(time, part, cnt);
*cb_data->count = cnt; *cb_data->count = cnt;
cb_data->timespec->tv_sec = time; cb_data->timespec->tv_sec = time;
cb_data->timespec->tv_nsec = 0; cb_data->timespec->tv_nsec = 0;
...@@ -67,7 +73,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data) ...@@ -67,7 +73,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
* which doesn't support holding * which doesn't support holding
* multiple logs, remains. * multiple logs, remains.
*/ */
*cb_data->id = part; *cb_data->id = generic_id(time, part, 0);
*cb_data->count = 0; *cb_data->count = 0;
cb_data->timespec->tv_sec = time; cb_data->timespec->tv_sec = time;
cb_data->timespec->tv_nsec = 0; cb_data->timespec->tv_nsec = 0;
...@@ -185,14 +191,16 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count, ...@@ -185,14 +191,16 @@ static int efi_pstore_erase(enum pstore_type_id type, u64 id, int count,
char name[DUMP_NAME_LEN]; char name[DUMP_NAME_LEN];
efi_char16_t efi_name[DUMP_NAME_LEN]; efi_char16_t efi_name[DUMP_NAME_LEN];
int found, i; int found, i;
unsigned int part;
sprintf(name, "dump-type%u-%u-%d-%lu", type, (unsigned int)id, count, do_div(id, 1000);
time.tv_sec); 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++) for (i = 0; i < DUMP_NAME_LEN; i++)
efi_name[i] = name[i]; efi_name[i] = name[i];
edata.id = id; edata.id = part;
edata.type = type; edata.type = type;
edata.count = count; edata.count = count;
edata.time = time; edata.time = time;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment