diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/pstore/platform.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c index 2bd620f0d796..57bbf9078ac8 100644 --- a/fs/pstore/platform.c +++ b/fs/pstore/platform.c | |||
| @@ -167,6 +167,7 @@ int pstore_register(struct pstore_info *psi) | |||
| 167 | } | 167 | } |
| 168 | 168 | ||
| 169 | psinfo = psi; | 169 | psinfo = psi; |
| 170 | mutex_init(&psinfo->read_mutex); | ||
| 170 | spin_unlock(&pstore_lock); | 171 | spin_unlock(&pstore_lock); |
| 171 | 172 | ||
| 172 | if (owner && !try_module_get(owner)) { | 173 | if (owner && !try_module_get(owner)) { |
| @@ -195,30 +196,32 @@ EXPORT_SYMBOL_GPL(pstore_register); | |||
| 195 | void pstore_get_records(int quiet) | 196 | void pstore_get_records(int quiet) |
| 196 | { | 197 | { |
| 197 | struct pstore_info *psi = psinfo; | 198 | struct pstore_info *psi = psinfo; |
| 199 | char *buf = NULL; | ||
| 198 | ssize_t size; | 200 | ssize_t size; |
| 199 | u64 id; | 201 | u64 id; |
| 200 | enum pstore_type_id type; | 202 | enum pstore_type_id type; |
| 201 | struct timespec time; | 203 | struct timespec time; |
| 202 | int failed = 0, rc; | 204 | int failed = 0, rc; |
| 203 | unsigned long flags; | ||
| 204 | 205 | ||
| 205 | if (!psi) | 206 | if (!psi) |
| 206 | return; | 207 | return; |
| 207 | 208 | ||
| 208 | spin_lock_irqsave(&psinfo->buf_lock, flags); | 209 | mutex_lock(&psi->read_mutex); |
| 209 | rc = psi->open(psi); | 210 | rc = psi->open(psi); |
| 210 | if (rc) | 211 | if (rc) |
| 211 | goto out; | 212 | goto out; |
| 212 | 213 | ||
| 213 | while ((size = psi->read(&id, &type, &time, psi)) > 0) { | 214 | while ((size = psi->read(&id, &type, &time, &buf, psi)) > 0) { |
| 214 | rc = pstore_mkfile(type, psi->name, id, psi->buf, (size_t)size, | 215 | rc = pstore_mkfile(type, psi->name, id, buf, (size_t)size, |
| 215 | time, psi); | 216 | time, psi); |
| 217 | kfree(buf); | ||
| 218 | buf = NULL; | ||
| 216 | if (rc && (rc != -EEXIST || !quiet)) | 219 | if (rc && (rc != -EEXIST || !quiet)) |
| 217 | failed++; | 220 | failed++; |
| 218 | } | 221 | } |
| 219 | psi->close(psi); | 222 | psi->close(psi); |
| 220 | out: | 223 | out: |
| 221 | spin_unlock_irqrestore(&psinfo->buf_lock, flags); | 224 | mutex_unlock(&psi->read_mutex); |
| 222 | 225 | ||
| 223 | if (failed) | 226 | if (failed) |
| 224 | printk(KERN_WARNING "pstore: failed to load %d record(s) from '%s'\n", | 227 | printk(KERN_WARNING "pstore: failed to load %d record(s) from '%s'\n", |
