diff options
Diffstat (limited to 'fs/pstore/ram.c')
| -rw-r--r-- | fs/pstore/ram.c | 43 |
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 | ||
| 134 | static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type, | 134 | static 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 | ||
| 239 | static int ramoops_pstore_erase(enum pstore_type_id type, u64 id, | 243 | static 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 | ||
| 290 | static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt, | 294 | static 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 | ||
| 355 | static int __devinit ramoops_probe(struct platform_device *pdev) | 368 | static 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; |
