diff options
author | Aruna Balakrishnaiah <aruna@linux.vnet.ibm.com> | 2013-08-16 16:57:51 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2013-08-19 14:53:45 -0400 |
commit | f8c62f34fe868f5bcca88a32e4a5c52b67de661d (patch) | |
tree | 450799c8e36e38739004d263babc2b69514b82c6 | |
parent | 901037ba31c09132b820f2a21b66444fca735749 (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.c | 22 |
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]; |