aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/mtdoops.c
diff options
context:
space:
mode:
authorSimon Kagstrom <simon.kagstrom@netinsight.net>2009-11-03 01:08:41 -0500
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-11-30 07:02:02 -0500
commit1114e3d00f539ecb7a8415663f2a47a80e00a537 (patch)
tree34f384aa267d9e31eee029bf9061cf148907ea7d /drivers/mtd/mtdoops.c
parentbe95745f01677245a061a8f51473ef5ec8ad008e (diff)
mtd: mtdoops: limit the maximum mtd partition size
Make the maximum mtdoops partition size to be 8MiB. Indeed, it does not make sense to use anything larger than that anyway. This limit makes it possible to catch stupid mistakes where the user gives e.g., a rootfs partition to mtdoops (which will happily erase it). Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/mtdoops.c')
-rw-r--r--drivers/mtd/mtdoops.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c
index 06c538249455..b016eee18657 100644
--- a/drivers/mtd/mtdoops.c
+++ b/drivers/mtd/mtdoops.c
@@ -33,6 +33,9 @@
33#include <linux/interrupt.h> 33#include <linux/interrupt.h>
34#include <linux/mtd/mtd.h> 34#include <linux/mtd/mtd.h>
35 35
36/* Maximum MTD partition size */
37#define MTDOOPS_MAX_MTD_SIZE (8 * 1024 * 1024)
38
36#define MTDOOPS_KERNMSG_MAGIC 0x5d005d00 39#define MTDOOPS_KERNMSG_MAGIC 0x5d005d00
37#define OOPS_PAGE_SIZE 4096 40#define OOPS_PAGE_SIZE 4096
38 41
@@ -310,6 +313,12 @@ static void mtdoops_notify_add(struct mtd_info *mtd)
310 return; 313 return;
311 } 314 }
312 315
316 if (mtd->size > MTDOOPS_MAX_MTD_SIZE) {
317 printk(KERN_ERR "mtdoops: mtd%d is too large (limit is %d MiB)\n",
318 mtd->index, MTDOOPS_MAX_MTD_SIZE / 1024 / 1024);
319 return;
320 }
321
313 /* oops_page_used is a bit field */ 322 /* oops_page_used is a bit field */
314 cxt->oops_page_used = vmalloc(DIV_ROUND_UP(mtdoops_pages, 323 cxt->oops_page_used = vmalloc(DIV_ROUND_UP(mtdoops_pages,
315 BITS_PER_LONG)); 324 BITS_PER_LONG));
@@ -317,14 +326,10 @@ static void mtdoops_notify_add(struct mtd_info *mtd)
317 printk(KERN_ERR "Could not allocate page array\n"); 326 printk(KERN_ERR "Could not allocate page array\n");
318 return; 327 return;
319 } 328 }
320 cxt->mtd = mtd;
321 if (mtd->size > INT_MAX)
322 cxt->oops_pages = INT_MAX / OOPS_PAGE_SIZE;
323 else
324 cxt->oops_pages = (int)mtd->size / OOPS_PAGE_SIZE;
325 329
330 cxt->mtd = mtd;
331 cxt->oops_pages = (int)mtd->size / OOPS_PAGE_SIZE;
326 find_next_position(cxt); 332 find_next_position(cxt);
327
328 printk(KERN_INFO "mtdoops: Attached to MTD device %d\n", mtd->index); 333 printk(KERN_INFO "mtdoops: Attached to MTD device %d\n", mtd->index);
329} 334}
330 335