aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Gong <gong.chen@linux.intel.com>2011-10-12 12:17:24 -0400
committerTony Luck <tony.luck@intel.com>2011-10-12 12:17:24 -0400
commitb238b8fa93353ab50c9a2b1e2fa47a0ab01c37cd (patch)
treea46a6ce7567d9826ae48c2f3dc5aa0167de1f26c
parentabd4d5587be911f63592537284dad78766d97d62 (diff)
pstore: make pstore write function return normal success/fail value
Currently pstore write interface employs record id as return value, but it is not enough because it can't tell caller if the write operation is successful. Pass the record id back via an argument pointer and return zero for success, non-zero for failure. Signed-off-by: Chen Gong <gong.chen@linux.intel.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
-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;