aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/apei/erst.c10
-rw-r--r--drivers/firmware/efivars.c17
-rw-r--r--fs/pstore/platform.c11
-rw-r--r--include/linux/pstore.h4
4 files changed, 23 insertions, 19 deletions
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index 5e820ea35570..127408069ca7 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -933,7 +933,7 @@ static int erst_open_pstore(struct pstore_info *psi);
933static int erst_close_pstore(struct pstore_info *psi); 933static int erst_close_pstore(struct pstore_info *psi);
934static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, 934static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
935 struct timespec *time, struct pstore_info *psi); 935 struct timespec *time, struct pstore_info *psi);
936static u64 erst_writer(enum pstore_type_id type, unsigned int part, 936static int erst_writer(enum pstore_type_id type, u64 *id, unsigned int part,
937 size_t size, struct pstore_info *psi); 937 size_t size, struct pstore_info *psi);
938static int erst_clearer(enum pstore_type_id type, u64 id, 938static int erst_clearer(enum pstore_type_id type, u64 id,
939 struct pstore_info *psi); 939 struct pstore_info *psi);
@@ -1040,11 +1040,12 @@ out:
1040 return (rc < 0) ? rc : (len - sizeof(*rcd)); 1040 return (rc < 0) ? rc : (len - sizeof(*rcd));
1041} 1041}
1042 1042
1043static u64 erst_writer(enum pstore_type_id type, unsigned int part, 1043static int erst_writer(enum pstore_type_id type, u64 *id, unsigned int part,
1044 size_t size, struct pstore_info *psi) 1044 size_t size, struct pstore_info *psi)
1045{ 1045{
1046 struct cper_pstore_record *rcd = (struct cper_pstore_record *) 1046 struct cper_pstore_record *rcd = (struct cper_pstore_record *)
1047 (erst_info.buf - sizeof(*rcd)); 1047 (erst_info.buf - sizeof(*rcd));
1048 int ret;
1048 1049
1049 memset(rcd, 0, sizeof(*rcd)); 1050 memset(rcd, 0, sizeof(*rcd));
1050 memcpy(rcd->hdr.signature, CPER_SIG_RECORD, CPER_SIG_SIZE); 1051 memcpy(rcd->hdr.signature, CPER_SIG_RECORD, CPER_SIG_SIZE);
@@ -1079,9 +1080,10 @@ static u64 erst_writer(enum pstore_type_id type, unsigned int part,
1079 } 1080 }
1080 rcd->sec_hdr.section_severity = CPER_SEV_FATAL; 1081 rcd->sec_hdr.section_severity = CPER_SEV_FATAL;
1081 1082
1082 erst_write(&rcd->hdr); 1083 ret = erst_write(&rcd->hdr);
1084 *id = rcd->hdr.record_id;
1083 1085
1084 return rcd->hdr.record_id; 1086 return ret;
1085} 1087}
1086 1088
1087static int erst_clearer(enum pstore_type_id type, u64 id, 1089static int erst_clearer(enum pstore_type_id type, u64 id,
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index be8bcb035e2a..8370f72d87ff 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -490,8 +490,8 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
490 return 0; 490 return 0;
491} 491}
492 492
493static u64 efi_pstore_write(enum pstore_type_id type, unsigned int part, 493static int efi_pstore_write(enum pstore_type_id type, u64 *id,
494 size_t size, struct pstore_info *psi) 494 unsigned int part, size_t size, struct pstore_info *psi)
495{ 495{
496 char name[DUMP_NAME_LEN]; 496 char name[DUMP_NAME_LEN];
497 char stub_name[DUMP_NAME_LEN]; 497 char stub_name[DUMP_NAME_LEN];
@@ -499,7 +499,7 @@ static u64 efi_pstore_write(enum pstore_type_id type, unsigned int part,
499 efi_guid_t vendor = LINUX_EFI_CRASH_GUID; 499 efi_guid_t vendor = LINUX_EFI_CRASH_GUID;
500 struct efivars *efivars = psi->data; 500 struct efivars *efivars = psi->data;
501 struct efivar_entry *entry, *found = NULL; 501 struct efivar_entry *entry, *found = NULL;
502 int i; 502 int i, ret = 0;
503 503
504 sprintf(stub_name, "dump-type%u-%u-", type, part); 504 sprintf(stub_name, "dump-type%u-%u-", type, part);
505 sprintf(name, "%s%lu", stub_name, get_seconds()); 505 sprintf(name, "%s%lu", stub_name, get_seconds());
@@ -548,18 +548,19 @@ static u64 efi_pstore_write(enum pstore_type_id type, unsigned int part,
548 efivar_unregister(found); 548 efivar_unregister(found);
549 549
550 if (size) 550 if (size)
551 efivar_create_sysfs_entry(efivars, 551 ret = efivar_create_sysfs_entry(efivars,
552 utf16_strsize(efi_name, 552 utf16_strsize(efi_name,
553 DUMP_NAME_LEN * 2), 553 DUMP_NAME_LEN * 2),
554 efi_name, &vendor); 554 efi_name, &vendor);
555 555
556 return part; 556 *id = part;
557 return ret;
557}; 558};
558 559
559static int efi_pstore_erase(enum pstore_type_id type, u64 id, 560static int efi_pstore_erase(enum pstore_type_id type, u64 id,
560 struct pstore_info *psi) 561 struct pstore_info *psi)
561{ 562{
562 efi_pstore_write(type, id, 0, psi); 563 efi_pstore_write(type, &id, (unsigned int)id, 0, psi);
563 564
564 return 0; 565 return 0;
565} 566}
@@ -580,8 +581,8 @@ static ssize_t efi_pstore_read(u64 *id, enum pstore_type_id *type,
580 return -1; 581 return -1;
581} 582}
582 583
583static u64 efi_pstore_write(enum pstore_type_id type, unsigned int part, 584static int efi_pstore_write(enum pstore_type_id type, u64 *id,
584 size_t size, struct pstore_info *psi) 585 unsigned int part, size_t size, struct pstore_info *psi)
585{ 586{
586 return 0; 587 return 0;
587} 588}
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index 0472924024cc..2bd620f0d796 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -87,7 +87,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
87 unsigned long size, total = 0; 87 unsigned long size, total = 0;
88 char *dst, *why; 88 char *dst, *why;
89 u64 id; 89 u64 id;
90 int hsize; 90 int hsize, ret;
91 unsigned int part = 1; 91 unsigned int part = 1;
92 unsigned long flags = 0; 92 unsigned long flags = 0;
93 int is_locked = 0; 93 int is_locked = 0;
@@ -122,9 +122,9 @@ 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 id = psinfo->write(PSTORE_TYPE_DMESG, part, 125 ret = psinfo->write(PSTORE_TYPE_DMESG, &id, part,
126 hsize + l1_cpy + l2_cpy, psinfo); 126 hsize + l1_cpy + l2_cpy, psinfo);
127 if (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;
129 l1 -= l1_cpy; 129 l1 -= l1_cpy;
130 l2 -= l2_cpy; 130 l2 -= l2_cpy;
@@ -247,6 +247,7 @@ static void pstore_timefunc(unsigned long dummy)
247int pstore_write(enum pstore_type_id type, char *buf, size_t size) 247int pstore_write(enum pstore_type_id type, char *buf, size_t size)
248{ 248{
249 u64 id; 249 u64 id;
250 int ret;
250 unsigned long flags; 251 unsigned long flags;
251 252
252 if (!psinfo) 253 if (!psinfo)
@@ -257,8 +258,8 @@ int pstore_write(enum pstore_type_id type, char *buf, size_t size)
257 258
258 spin_lock_irqsave(&psinfo->buf_lock, flags); 259 spin_lock_irqsave(&psinfo->buf_lock, flags);
259 memcpy(psinfo->buf, buf, size); 260 memcpy(psinfo->buf, buf, size);
260 id = psinfo->write(type, 0, size, psinfo); 261 ret = psinfo->write(type, &id, 0, size, psinfo);
261 if (pstore_is_mounted()) 262 if (ret == 0 && pstore_is_mounted())
262 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf, 263 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf,
263 size, CURRENT_TIME, psinfo); 264 size, CURRENT_TIME, psinfo);
264 spin_unlock_irqrestore(&psinfo->buf_lock, flags); 265 spin_unlock_irqrestore(&psinfo->buf_lock, flags);
diff --git a/include/linux/pstore.h b/include/linux/pstore.h
index b91440e64d6e..ea567321ae3c 100644
--- a/include/linux/pstore.h
+++ b/include/linux/pstore.h
@@ -39,8 +39,8 @@ struct pstore_info {
39 int (*close)(struct pstore_info *psi); 39 int (*close)(struct pstore_info *psi);
40 ssize_t (*read)(u64 *id, enum pstore_type_id *type, 40 ssize_t (*read)(u64 *id, enum pstore_type_id *type,
41 struct timespec *time, struct pstore_info *psi); 41 struct timespec *time, struct pstore_info *psi);
42 u64 (*write)(enum pstore_type_id type, unsigned int part, 42 int (*write)(enum pstore_type_id type, u64 *id,
43 size_t size, struct pstore_info *psi); 43 unsigned int part, size_t size, struct pstore_info *psi);
44 int (*erase)(enum pstore_type_id type, u64 id, 44 int (*erase)(enum pstore_type_id type, u64 id,
45 struct pstore_info *psi); 45 struct pstore_info *psi);
46 void *data; 46 void *data;