aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAruna Balakrishnaiah <aruna@linux.vnet.ibm.com>2013-08-16 16:57:51 -0400
committerTony Luck <tony.luck@intel.com>2013-08-19 14:53:45 -0400
commitf8c62f34fe868f5bcca88a32e4a5c52b67de661d (patch)
tree450799c8e36e38739004d263babc2b69514b82c6
parent901037ba31c09132b820f2a21b66444fca735749 (diff)
efi-pstore: Read and write to the 'compressed' flag of pstore
In pstore write, Efi will add a character 'C'(compressed) or D'(decompressed) in its header while writing to persistent store. In pstore read, read the header and update the 'compressed' flag accordingly. Signed-off-by: Aruna Balakrishnaiah <aruna@linux.vnet.ibm.com> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r--drivers/firmware/efi/efi-pstore.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
index 9a5425f3f885..5002d50e3781 100644
--- a/drivers/firmware/efi/efi-pstore.c
+++ b/drivers/firmware/efi/efi-pstore.c
@@ -35,6 +35,7 @@ struct pstore_read_data {
35 enum pstore_type_id *type; 35 enum pstore_type_id *type;
36 int *count; 36 int *count;
37 struct timespec *timespec; 37 struct timespec *timespec;
38 bool *compressed;
38 char **buf; 39 char **buf;
39}; 40};
40 41
@@ -42,7 +43,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
42{ 43{
43 efi_guid_t vendor = LINUX_EFI_CRASH_GUID; 44 efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
44 struct pstore_read_data *cb_data = data; 45 struct pstore_read_data *cb_data = data;
45 char name[DUMP_NAME_LEN]; 46 char name[DUMP_NAME_LEN], data_type;
46 int i; 47 int i;
47 int cnt; 48 int cnt;
48 unsigned int part; 49 unsigned int part;
@@ -54,12 +55,23 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
54 for (i = 0; i < DUMP_NAME_LEN; i++) 55 for (i = 0; i < DUMP_NAME_LEN; i++)
55 name[i] = entry->var.VariableName[i]; 56 name[i] = entry->var.VariableName[i];
56 57
57 if (sscanf(name, "dump-type%u-%u-%d-%lu", 58 if (sscanf(name, "dump-type%u-%u-%d-%lu-%c",
59 cb_data->type, &part, &cnt, &time, &data_type) == 5) {
60 *cb_data->id = part;
61 *cb_data->count = cnt;
62 cb_data->timespec->tv_sec = time;
63 cb_data->timespec->tv_nsec = 0;
64 if (data_type == 'C')
65 *cb_data->compressed = true;
66 else
67 *cb_data->compressed = false;
68 } else if (sscanf(name, "dump-type%u-%u-%d-%lu",
58 cb_data->type, &part, &cnt, &time) == 4) { 69 cb_data->type, &part, &cnt, &time) == 4) {
59 *cb_data->id = part; 70 *cb_data->id = part;
60 *cb_data->count = cnt; 71 *cb_data->count = cnt;
61 cb_data->timespec->tv_sec = time; 72 cb_data->timespec->tv_sec = time;
62 cb_data->timespec->tv_nsec = 0; 73 cb_data->timespec->tv_nsec = 0;
74 *cb_data->compressed = false;
63 } else if (sscanf(name, "dump-type%u-%u-%lu", 75 } else if (sscanf(name, "dump-type%u-%u-%lu",
64 cb_data->type, &part, &time) == 3) { 76 cb_data->type, &part, &time) == 3) {
65 /* 77 /*
@@ -71,6 +83,7 @@ static int efi_pstore_read_func(struct efivar_entry *entry, void *data)
71 *cb_data->count = 0; 83 *cb_data->count = 0;
72 cb_data->timespec->tv_sec = time; 84 cb_data->timespec->tv_sec = time;
73 cb_data->timespec->tv_nsec = 0; 85 cb_data->timespec->tv_nsec = 0;
86 *cb_data->compressed = false;
74 } else 87 } else
75 return 0; 88 return 0;
76 89
@@ -96,6 +109,7 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
96 data.type = type; 109 data.type = type;
97 data.count = count; 110 data.count = count;
98 data.timespec = timespec; 111 data.timespec = timespec;
112 data.compressed = compressed;
99 data.buf = buf; 113 data.buf = buf;
100 114
101 return __efivar_entry_iter(efi_pstore_read_func, &efivar_sysfs_list, &data, 115 return __efivar_entry_iter(efi_pstore_read_func, &efivar_sysfs_list, &data,
@@ -112,8 +126,8 @@ static int efi_pstore_write(enum pstore_type_id type,
112 efi_guid_t vendor = LINUX_EFI_CRASH_GUID; 126 efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
113 int i, ret = 0; 127 int i, ret = 0;
114 128
115 sprintf(name, "dump-type%u-%u-%d-%lu", type, part, count, 129 sprintf(name, "dump-type%u-%u-%d-%lu-%c", type, part, count,
116 get_seconds()); 130 get_seconds(), compressed ? 'C' : 'D');
117 131
118 for (i = 0; i < DUMP_NAME_LEN; i++) 132 for (i = 0; i < DUMP_NAME_LEN; i++)
119 efi_name[i] = name[i]; 133 efi_name[i] = name[i];