diff options
author | Kees Cook <keescook@chromium.org> | 2011-11-17 16:13:29 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2011-11-17 16:13:29 -0500 |
commit | 3d6d8d20ec4fd3b256632edb373a9c504724b8a9 (patch) | |
tree | 6bb1a530bb50fcdb24a2db48d095480e741ae371 | |
parent | f6f8285132907757ef84ef8dae0a1244b8cde6ac (diff) |
pstore: pass reason to backend write callback
This allows a backend to filter on the dmesg reason as well as the pstore
reason. When ramoops is switched to pstore, this is needed since it has
no interest in storing non-crash dmesg details.
Drop pstore_write() as it has no users, and handling the "reason" here
has no obviously correct value.
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | drivers/acpi/apei/erst.c | 6 | ||||
-rw-r--r-- | drivers/firmware/efivars.c | 8 | ||||
-rw-r--r-- | fs/pstore/platform.c | 30 | ||||
-rw-r--r-- | include/linux/pstore.h | 12 |
4 files changed, 15 insertions, 41 deletions
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c index 631b9477b99c..6a9e3bad13f4 100644 --- a/drivers/acpi/apei/erst.c +++ b/drivers/acpi/apei/erst.c | |||
@@ -934,7 +934,8 @@ static int erst_close_pstore(struct pstore_info *psi); | |||
934 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, | 934 | static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, |
935 | struct timespec *time, char **buf, | 935 | struct timespec *time, char **buf, |
936 | struct pstore_info *psi); | 936 | struct pstore_info *psi); |
937 | static int erst_writer(enum pstore_type_id type, u64 *id, unsigned int part, | 937 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, |
938 | u64 *id, unsigned int part, | ||
938 | size_t size, struct pstore_info *psi); | 939 | size_t size, struct pstore_info *psi); |
939 | static int erst_clearer(enum pstore_type_id type, u64 id, | 940 | static int erst_clearer(enum pstore_type_id type, u64 id, |
940 | struct pstore_info *psi); | 941 | struct pstore_info *psi); |
@@ -1053,7 +1054,8 @@ out: | |||
1053 | return (rc < 0) ? rc : (len - sizeof(*rcd)); | 1054 | return (rc < 0) ? rc : (len - sizeof(*rcd)); |
1054 | } | 1055 | } |
1055 | 1056 | ||
1056 | static int erst_writer(enum pstore_type_id type, u64 *id, unsigned int part, | 1057 | static int erst_writer(enum pstore_type_id type, enum kmsg_dump_reason reason, |
1058 | u64 *id, unsigned int part, | ||
1057 | size_t size, struct pstore_info *psi) | 1059 | size_t size, struct pstore_info *psi) |
1058 | { | 1060 | { |
1059 | struct cper_pstore_record *rcd = (struct cper_pstore_record *) | 1061 | struct cper_pstore_record *rcd = (struct cper_pstore_record *) |
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c index a54a6b972ced..0a53a05a850d 100644 --- a/drivers/firmware/efivars.c +++ b/drivers/firmware/efivars.c | |||
@@ -495,7 +495,8 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, | |||
495 | return 0; | 495 | return 0; |
496 | } | 496 | } |
497 | 497 | ||
498 | static int efi_pstore_write(enum pstore_type_id type, u64 *id, | 498 | static int efi_pstore_write(enum pstore_type_id type, |
499 | enum kmsg_dump_reason reason, u64 *id, | ||
499 | unsigned int part, size_t size, struct pstore_info *psi) | 500 | unsigned int part, size_t size, struct pstore_info *psi) |
500 | { | 501 | { |
501 | char name[DUMP_NAME_LEN]; | 502 | char name[DUMP_NAME_LEN]; |
@@ -565,7 +566,7 @@ static int efi_pstore_write(enum pstore_type_id type, u64 *id, | |||
565 | static int efi_pstore_erase(enum pstore_type_id type, u64 id, | 566 | static int efi_pstore_erase(enum pstore_type_id type, u64 id, |
566 | struct pstore_info *psi) | 567 | struct pstore_info *psi) |
567 | { | 568 | { |
568 | efi_pstore_write(type, &id, (unsigned int)id, 0, psi); | 569 | efi_pstore_write(type, 0, &id, (unsigned int)id, 0, psi); |
569 | 570 | ||
570 | return 0; | 571 | return 0; |
571 | } | 572 | } |
@@ -586,7 +587,8 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type, | |||
586 | return -1; | 587 | return -1; |
587 | } | 588 | } |
588 | 589 | ||
589 | static int efi_pstore_write(enum pstore_type_id type, u64 *id, | 590 | static int efi_pstore_write(enum pstore_type_id type, |
591 | enum kmsg_dump_reason reason, u64 *id, | ||
590 | unsigned int part, size_t size, struct pstore_info *psi) | 592 | unsigned int part, size_t size, struct pstore_info *psi) |
591 | { | 593 | { |
592 | return 0; | 594 | return 0; |
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 57bbf9078ac8..f146d89179bf 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c | |||
@@ -122,7 +122,7 @@ static void pstore_dump(struct kmsg_dumper *dumper, | |||
122 | memcpy(dst, s1 + s1_start, l1_cpy); | 122 | memcpy(dst, s1 + s1_start, l1_cpy); |
123 | memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); | 123 | memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); |
124 | 124 | ||
125 | ret = psinfo->write(PSTORE_TYPE_DMESG, &id, part, | 125 | ret = psinfo->write(PSTORE_TYPE_DMESG, reason, &id, part, |
126 | hsize + l1_cpy + l2_cpy, psinfo); | 126 | hsize + l1_cpy + l2_cpy, psinfo); |
127 | if (ret == 0 && reason == KMSG_DUMP_OOPS && pstore_is_mounted()) | 127 | if (ret == 0 && reason == KMSG_DUMP_OOPS && pstore_is_mounted()) |
128 | pstore_new_entry = 1; | 128 | pstore_new_entry = 1; |
@@ -243,33 +243,5 @@ static void pstore_timefunc(unsigned long dummy) | |||
243 | mod_timer(&pstore_timer, jiffies + PSTORE_INTERVAL); | 243 | mod_timer(&pstore_timer, jiffies + PSTORE_INTERVAL); |
244 | } | 244 | } |
245 | 245 | ||
246 | /* | ||
247 | * Call platform driver to write a record to the | ||
248 | * persistent store. | ||
249 | */ | ||
250 | int pstore_write(enum pstore_type_id type, char *buf, size_t size) | ||
251 | { | ||
252 | u64 id; | ||
253 | int ret; | ||
254 | unsigned long flags; | ||
255 | |||
256 | if (!psinfo) | ||
257 | return -ENODEV; | ||
258 | |||
259 | if (size > psinfo->bufsize) | ||
260 | return -EFBIG; | ||
261 | |||
262 | spin_lock_irqsave(&psinfo->buf_lock, flags); | ||
263 | memcpy(psinfo->buf, buf, size); | ||
264 | ret = psinfo->write(type, &id, 0, size, psinfo); | ||
265 | if (ret == 0 && pstore_is_mounted()) | ||
266 | pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf, | ||
267 | size, CURRENT_TIME, psinfo); | ||
268 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); | ||
269 | |||
270 | return 0; | ||
271 | } | ||
272 | EXPORT_SYMBOL_GPL(pstore_write); | ||
273 | |||
274 | module_param(backend, charp, 0444); | 246 | module_param(backend, charp, 0444); |
275 | MODULE_PARM_DESC(backend, "Pstore backend to use"); | 247 | MODULE_PARM_DESC(backend, "Pstore backend to use"); |
diff --git a/include/linux/pstore.h b/include/linux/pstore.h index 2ca8cde5459d..e1461e143be2 100644 --- a/include/linux/pstore.h +++ b/include/linux/pstore.h | |||
@@ -22,6 +22,9 @@ | |||
22 | #ifndef _LINUX_PSTORE_H | 22 | #ifndef _LINUX_PSTORE_H |
23 | #define _LINUX_PSTORE_H | 23 | #define _LINUX_PSTORE_H |
24 | 24 | ||
25 | #include <linux/time.h> | ||
26 | #include <linux/kmsg_dump.h> | ||
27 | |||
25 | /* types */ | 28 | /* types */ |
26 | enum pstore_type_id { | 29 | enum pstore_type_id { |
27 | PSTORE_TYPE_DMESG = 0, | 30 | PSTORE_TYPE_DMESG = 0, |
@@ -41,7 +44,8 @@ struct pstore_info { | |||
41 | ssize_t (*read)(u64 *id, enum pstore_type_id *type, | 44 | ssize_t (*read)(u64 *id, enum pstore_type_id *type, |
42 | struct timespec *time, char **buf, | 45 | struct timespec *time, char **buf, |
43 | struct pstore_info *psi); | 46 | struct pstore_info *psi); |
44 | int (*write)(enum pstore_type_id type, u64 *id, | 47 | int (*write)(enum pstore_type_id type, |
48 | enum kmsg_dump_reason reason, u64 *id, | ||
45 | unsigned int part, size_t size, struct pstore_info *psi); | 49 | unsigned int part, size_t size, struct pstore_info *psi); |
46 | int (*erase)(enum pstore_type_id type, u64 id, | 50 | int (*erase)(enum pstore_type_id type, u64 id, |
47 | struct pstore_info *psi); | 51 | struct pstore_info *psi); |
@@ -50,18 +54,12 @@ struct pstore_info { | |||
50 | 54 | ||
51 | #ifdef CONFIG_PSTORE | 55 | #ifdef CONFIG_PSTORE |
52 | extern int pstore_register(struct pstore_info *); | 56 | extern int pstore_register(struct pstore_info *); |
53 | extern int pstore_write(enum pstore_type_id type, char *buf, size_t size); | ||
54 | #else | 57 | #else |
55 | static inline int | 58 | static inline int |
56 | pstore_register(struct pstore_info *psi) | 59 | pstore_register(struct pstore_info *psi) |
57 | { | 60 | { |
58 | return -ENODEV; | 61 | return -ENODEV; |
59 | } | 62 | } |
60 | static inline int | ||
61 | pstore_write(enum pstore_type_id type, char *buf, size_t size) | ||
62 | { | ||
63 | return -ENODEV; | ||
64 | } | ||
65 | #endif | 63 | #endif |
66 | 64 | ||
67 | #endif /*_LINUX_PSTORE_H*/ | 65 | #endif /*_LINUX_PSTORE_H*/ |