aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Garrett <mjg@redhat.com>2011-07-21 16:57:52 -0400
committerTony Luck <tony.luck@intel.com>2011-07-22 19:14:06 -0400
commit638c1fd3033c76778e6d9975ad8a4a9cdd5b96d9 (patch)
treede8b772157162b8a7a0901f4df5fb25faef6b21d
parent02f8c6aee8df3cdc935e9bdd4f2d020306035dbe (diff)
pstore: Extend API for more flexibility in new backends
Some pstore implementations may not have a static context, so extend the API to pass the pstore_info struct to all calls and allow for a context pointer. Signed-off-by: Matthew Garrett <mjg@redhat.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r--drivers/acpi/apei/erst.c18
-rw-r--r--fs/pstore/inode.c10
-rw-r--r--fs/pstore/internal.h2
-rw-r--r--fs/pstore/platform.c13
-rw-r--r--include/linux/pstore.h8
5 files changed, 31 insertions, 20 deletions
diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
index e6cef8e1b534..de3ae92adaa5 100644
--- a/drivers/acpi/apei/erst.c
+++ b/drivers/acpi/apei/erst.c
@@ -932,8 +932,10 @@ static int erst_check_table(struct acpi_table_erst *erst_tab)
932static int erst_open_pstore(struct pstore_info *psi); 932static 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); 935 struct timespec *time, struct pstore_info *psi);
936static u64 erst_writer(enum pstore_type_id type, size_t size); 936static u64 erst_writer(enum pstore_type_id type, size_t size,
937 struct pstore_info *psi);
938static int erst_clearer(u64 id, struct pstore_info *psi);
937 939
938static struct pstore_info erst_info = { 940static struct pstore_info erst_info = {
939 .owner = THIS_MODULE, 941 .owner = THIS_MODULE,
@@ -942,7 +944,7 @@ static struct pstore_info erst_info = {
942 .close = erst_close_pstore, 944 .close = erst_close_pstore,
943 .read = erst_reader, 945 .read = erst_reader,
944 .write = erst_writer, 946 .write = erst_writer,
945 .erase = erst_clear 947 .erase = erst_clearer
946}; 948};
947 949
948#define CPER_CREATOR_PSTORE \ 950#define CPER_CREATOR_PSTORE \
@@ -983,7 +985,7 @@ static int erst_close_pstore(struct pstore_info *psi)
983} 985}
984 986
985static ssize_t erst_reader(u64 *id, enum pstore_type_id *type, 987static ssize_t erst_reader(u64 *id, enum pstore_type_id *type,
986 struct timespec *time) 988 struct timespec *time, struct pstore_info *psi)
987{ 989{
988 int rc; 990 int rc;
989 ssize_t len = 0; 991 ssize_t len = 0;
@@ -1037,7 +1039,8 @@ out:
1037 return (rc < 0) ? rc : (len - sizeof(*rcd)); 1039 return (rc < 0) ? rc : (len - sizeof(*rcd));
1038} 1040}
1039 1041
1040static u64 erst_writer(enum pstore_type_id type, size_t size) 1042static u64 erst_writer(enum pstore_type_id type, size_t size,
1043 struct pstore_info *psi)
1041{ 1044{
1042 struct cper_pstore_record *rcd = (struct cper_pstore_record *) 1045 struct cper_pstore_record *rcd = (struct cper_pstore_record *)
1043 (erst_info.buf - sizeof(*rcd)); 1046 (erst_info.buf - sizeof(*rcd));
@@ -1080,6 +1083,11 @@ static u64 erst_writer(enum pstore_type_id type, size_t size)
1080 return rcd->hdr.record_id; 1083 return rcd->hdr.record_id;
1081} 1084}
1082 1085
1086static int erst_clearer(u64 id, struct pstore_info *psi)
1087{
1088 return erst_clear(id);
1089}
1090
1083static int __init erst_init(void) 1091static int __init erst_init(void)
1084{ 1092{
1085 int rc = 0; 1093 int rc = 0;
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index 977ed2723845..b19884a1ba77 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -40,7 +40,7 @@
40 40
41struct pstore_private { 41struct pstore_private {
42 u64 id; 42 u64 id;
43 int (*erase)(u64); 43 struct pstore_info *psi;
44 ssize_t size; 44 ssize_t size;
45 char data[]; 45 char data[];
46}; 46};
@@ -73,7 +73,7 @@ static int pstore_unlink(struct inode *dir, struct dentry *dentry)
73{ 73{
74 struct pstore_private *p = dentry->d_inode->i_private; 74 struct pstore_private *p = dentry->d_inode->i_private;
75 75
76 p->erase(p->id); 76 p->psi->erase(p->id, p->psi);
77 77
78 return simple_unlink(dir, dentry); 78 return simple_unlink(dir, dentry);
79} 79}
@@ -175,8 +175,8 @@ int pstore_is_mounted(void)
175 * Set the mtime & ctime to the date that this record was originally stored. 175 * Set the mtime & ctime to the date that this record was originally stored.
176 */ 176 */
177int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, 177int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id,
178 char *data, size_t size, 178 char *data, size_t size, struct timespec time,
179 struct timespec time, int (*erase)(u64)) 179 struct pstore_info *psi)
180{ 180{
181 struct dentry *root = pstore_sb->s_root; 181 struct dentry *root = pstore_sb->s_root;
182 struct dentry *dentry; 182 struct dentry *dentry;
@@ -193,7 +193,7 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id,
193 if (!private) 193 if (!private)
194 goto fail_alloc; 194 goto fail_alloc;
195 private->id = id; 195 private->id = id;
196 private->erase = erase; 196 private->psi = psi;
197 197
198 switch (type) { 198 switch (type) {
199 case PSTORE_TYPE_DMESG: 199 case PSTORE_TYPE_DMESG:
diff --git a/fs/pstore/internal.h b/fs/pstore/internal.h
index 8c9f23eb1645..611c1b3c46fa 100644
--- a/fs/pstore/internal.h
+++ b/fs/pstore/internal.h
@@ -2,5 +2,5 @@ extern void pstore_set_kmsg_bytes(int);
2extern void pstore_get_records(void); 2extern void pstore_get_records(void);
3extern int pstore_mkfile(enum pstore_type_id, char *psname, u64 id, 3extern int pstore_mkfile(enum pstore_type_id, char *psname, u64 id,
4 char *data, size_t size, 4 char *data, size_t size,
5 struct timespec time, int (*erase)(u64)); 5 struct timespec time, struct pstore_info *psi);
6extern int pstore_is_mounted(void); 6extern int pstore_is_mounted(void);
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c
index f2c3ff20ea68..221c04e5e333 100644
--- a/fs/pstore/platform.c
+++ b/fs/pstore/platform.c
@@ -94,11 +94,12 @@ static void pstore_dump(struct kmsg_dumper *dumper,
94 memcpy(dst, s1 + s1_start, l1_cpy); 94 memcpy(dst, s1 + s1_start, l1_cpy);
95 memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy); 95 memcpy(dst + l1_cpy, s2 + s2_start, l2_cpy);
96 96
97 id = psinfo->write(PSTORE_TYPE_DMESG, hsize + l1_cpy + l2_cpy); 97 id = psinfo->write(PSTORE_TYPE_DMESG, hsize + l1_cpy + l2_cpy,
98 psinfo);
98 if (reason == KMSG_DUMP_OOPS && pstore_is_mounted()) 99 if (reason == KMSG_DUMP_OOPS && pstore_is_mounted())
99 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, 100 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id,
100 psinfo->buf, hsize + l1_cpy + l2_cpy, 101 psinfo->buf, hsize + l1_cpy + l2_cpy,
101 CURRENT_TIME, psinfo->erase); 102 CURRENT_TIME, psinfo);
102 l1 -= l1_cpy; 103 l1 -= l1_cpy;
103 l2 -= l2_cpy; 104 l2 -= l2_cpy;
104 total += l1_cpy + l2_cpy; 105 total += l1_cpy + l2_cpy;
@@ -166,9 +167,9 @@ void pstore_get_records(void)
166 if (rc) 167 if (rc)
167 goto out; 168 goto out;
168 169
169 while ((size = psi->read(&id, &type, &time)) > 0) { 170 while ((size = psi->read(&id, &type, &time, psi)) > 0) {
170 if (pstore_mkfile(type, psi->name, id, psi->buf, (size_t)size, 171 if (pstore_mkfile(type, psi->name, id, psi->buf, (size_t)size,
171 time, psi->erase)) 172 time, psi))
172 failed++; 173 failed++;
173 } 174 }
174 psi->close(psi); 175 psi->close(psi);
@@ -196,10 +197,10 @@ int pstore_write(enum pstore_type_id type, char *buf, size_t size)
196 197
197 mutex_lock(&psinfo->buf_mutex); 198 mutex_lock(&psinfo->buf_mutex);
198 memcpy(psinfo->buf, buf, size); 199 memcpy(psinfo->buf, buf, size);
199 id = psinfo->write(type, size); 200 id = psinfo->write(type, size, psinfo);
200 if (pstore_is_mounted()) 201 if (pstore_is_mounted())
201 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf, 202 pstore_mkfile(PSTORE_TYPE_DMESG, psinfo->name, id, psinfo->buf,
202 size, CURRENT_TIME, psinfo->erase); 203 size, CURRENT_TIME, psinfo);
203 mutex_unlock(&psinfo->buf_mutex); 204 mutex_unlock(&psinfo->buf_mutex);
204 205
205 return 0; 206 return 0;
diff --git a/include/linux/pstore.h b/include/linux/pstore.h
index 2455ef2683f0..b2f1d97f6909 100644
--- a/include/linux/pstore.h
+++ b/include/linux/pstore.h
@@ -38,9 +38,11 @@ struct pstore_info {
38 int (*open)(struct pstore_info *psi); 38 int (*open)(struct pstore_info *psi);
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); 41 struct timespec *time, struct pstore_info *psi);
42 u64 (*write)(enum pstore_type_id type, size_t size); 42 u64 (*write)(enum pstore_type_id type, size_t size,
43 int (*erase)(u64 id); 43 struct pstore_info *psi);
44 int (*erase)(u64 id, struct pstore_info *psi);
45 void *data;
44}; 46};
45 47
46#ifdef CONFIG_PSTORE 48#ifdef CONFIG_PSTORE