aboutsummaryrefslogtreecommitdiffstats
path: root/fs/pstore/ram.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/pstore/ram.c')
-rw-r--r--fs/pstore/ram.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c
index 1a4f6da58eab..7003e5266f25 100644
--- a/fs/pstore/ram.c
+++ b/fs/pstore/ram.c
@@ -132,9 +132,8 @@ ramoops_get_next_prz(struct persistent_ram_zone *przs[], uint *c, uint max,
132} 132}
133 133
134static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type, 134static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
135 struct timespec *time, 135 int *count, struct timespec *time,
136 char **buf, 136 char **buf, struct pstore_info *psi)
137 struct pstore_info *psi)
138{ 137{
139 ssize_t size; 138 ssize_t size;
140 struct ramoops_context *cxt = psi->data; 139 struct ramoops_context *cxt = psi->data;
@@ -189,7 +188,7 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,
189 struct pstore_info *psi) 188 struct pstore_info *psi)
190{ 189{
191 struct ramoops_context *cxt = psi->data; 190 struct ramoops_context *cxt = psi->data;
192 struct persistent_ram_zone *prz = cxt->przs[cxt->dump_write_cnt]; 191 struct persistent_ram_zone *prz;
193 size_t hlen; 192 size_t hlen;
194 193
195 if (type == PSTORE_TYPE_CONSOLE) { 194 if (type == PSTORE_TYPE_CONSOLE) {
@@ -226,6 +225,11 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,
226 if (part != 1) 225 if (part != 1)
227 return -ENOSPC; 226 return -ENOSPC;
228 227
228 if (!cxt->przs)
229 return -ENOSPC;
230
231 prz = cxt->przs[cxt->dump_write_cnt];
232
229 hlen = ramoops_write_kmsg_hdr(prz); 233 hlen = ramoops_write_kmsg_hdr(prz);
230 if (size + hlen > prz->buffer_size) 234 if (size + hlen > prz->buffer_size)
231 size = prz->buffer_size - hlen; 235 size = prz->buffer_size - hlen;
@@ -236,8 +240,8 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,
236 return 0; 240 return 0;
237} 241}
238 242
239static int ramoops_pstore_erase(enum pstore_type_id type, u64 id, 243static int ramoops_pstore_erase(enum pstore_type_id type, u64 id, int count,
240 struct pstore_info *psi) 244 struct timespec time, struct pstore_info *psi)
241{ 245{
242 struct ramoops_context *cxt = psi->data; 246 struct ramoops_context *cxt = psi->data;
243 struct persistent_ram_zone *prz; 247 struct persistent_ram_zone *prz;
@@ -288,7 +292,7 @@ static void ramoops_free_przs(struct ramoops_context *cxt)
288} 292}
289 293
290static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, 294static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
291 phys_addr_t *paddr, size_t dump_mem_sz) 295 phys_addr_t *paddr, size_t dump_mem_sz)
292{ 296{
293 int err = -ENOMEM; 297 int err = -ENOMEM;
294 int i; 298 int i;
@@ -296,6 +300,11 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
296 if (!cxt->record_size) 300 if (!cxt->record_size)
297 return 0; 301 return 0;
298 302
303 if (*paddr + dump_mem_sz - cxt->phys_addr > cxt->size) {
304 dev_err(dev, "no room for dumps\n");
305 return -ENOMEM;
306 }
307
299 cxt->max_dump_cnt = dump_mem_sz / cxt->record_size; 308 cxt->max_dump_cnt = dump_mem_sz / cxt->record_size;
300 if (!cxt->max_dump_cnt) 309 if (!cxt->max_dump_cnt)
301 return -ENOMEM; 310 return -ENOMEM;
@@ -333,8 +342,12 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,
333 if (!sz) 342 if (!sz)
334 return 0; 343 return 0;
335 344
336 if (*paddr + sz > *paddr + cxt->size) 345 if (*paddr + sz - cxt->phys_addr > cxt->size) {
346 dev_err(dev, "no room for mem region (0x%zx@0x%llx) in (0x%lx@0x%llx)\n",
347 sz, (unsigned long long)*paddr,
348 cxt->size, (unsigned long long)cxt->phys_addr);
337 return -ENOMEM; 349 return -ENOMEM;
350 }
338 351
339 *prz = persistent_ram_new(*paddr, sz, sig, cxt->ecc_size); 352 *prz = persistent_ram_new(*paddr, sz, sig, cxt->ecc_size);
340 if (IS_ERR(*prz)) { 353 if (IS_ERR(*prz)) {
@@ -352,7 +365,7 @@ static int ramoops_init_prz(struct device *dev, struct ramoops_context *cxt,
352 return 0; 365 return 0;
353} 366}
354 367
355static int __devinit ramoops_probe(struct platform_device *pdev) 368static int ramoops_probe(struct platform_device *pdev)
356{ 369{
357 struct device *dev = &pdev->dev; 370 struct device *dev = &pdev->dev;
358 struct ramoops_platform_data *pdata = pdev->dev.platform_data; 371 struct ramoops_platform_data *pdata = pdev->dev.platform_data;
@@ -374,10 +387,14 @@ static int __devinit ramoops_probe(struct platform_device *pdev)
374 goto fail_out; 387 goto fail_out;
375 } 388 }
376 389
377 pdata->mem_size = rounddown_pow_of_two(pdata->mem_size); 390 if (!is_power_of_2(pdata->mem_size))
378 pdata->record_size = rounddown_pow_of_two(pdata->record_size); 391 pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
379 pdata->console_size = rounddown_pow_of_two(pdata->console_size); 392 if (!is_power_of_2(pdata->record_size))
380 pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size); 393 pdata->record_size = rounddown_pow_of_two(pdata->record_size);
394 if (!is_power_of_2(pdata->console_size))
395 pdata->console_size = rounddown_pow_of_two(pdata->console_size);
396 if (!is_power_of_2(pdata->ftrace_size))
397 pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size);
381 398
382 cxt->dump_read_cnt = 0; 399 cxt->dump_read_cnt = 0;
383 cxt->size = pdata->mem_size; 400 cxt->size = pdata->mem_size;