lkml.org 
[lkml]   [2009]   [Oct]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v6 1/5]: mtdoops: avoid erasing already empty areas
    After having scanned the entire mtdoops area, mtdoops will erase it if
    there are no mtdoops headers in it. However, empty and already erased
    areas (i.e., without mtdoops headers) will therefore also be erased at
    each startup.

    This patch counts the number of unclean pages (neither empty nor with
    the mtdoops header) and only erases if no headers are found and the area
    is still unclean.

    Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
    ---
    drivers/mtd/mtdoops.c | 18 ++++++++++++++----
    1 files changed, 14 insertions(+), 4 deletions(-)
    diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c
    index 18c6c96..c785e1a 100644
    --- a/drivers/mtd/mtdoops.c
    +++ b/drivers/mtd/mtdoops.c
    @@ -225,7 +225,7 @@ static void mtdoops_workfunc_write(struct work_struct *work)
    static void find_next_position(struct mtdoops_context *cxt)
    {
    struct mtd_info *mtd = cxt->mtd;
    - int ret, page, maxpos = 0;
    + int ret, page, maxpos = 0, unclean_pages = 0;
    u32 count[2], maxcount = 0xffffffff;
    size_t retlen;

    @@ -237,10 +237,13 @@ static void find_next_position(struct mtdoops_context *cxt)
    continue;
    }

    - if (count[1] != MTDOOPS_KERNMSG_MAGIC)
    - continue;
    if (count[0] == 0xffffffff)
    continue;
    + if (count[1] != MTDOOPS_KERNMSG_MAGIC) {
    + /* Page is neither clean nor empty */
    + unclean_pages++;
    + continue;
    + }
    if (maxcount == 0xffffffff) {
    maxcount = count[0];
    maxpos = page;
    @@ -259,7 +262,14 @@ static void find_next_position(struct mtdoops_context *cxt)
    if (maxcount == 0xffffffff) {
    cxt->nextpage = 0;
    cxt->nextcount = 1;
    - schedule_work(&cxt->work_erase);
    + if (unclean_pages != 0) {
    + printk(KERN_INFO "mtdoops: cleaning area\n");
    + schedule_work(&cxt->work_erase);
    + } else {
    + printk(KERN_DEBUG "mtdoops: ready %d, %d (clean)\n",
    + cxt->nextpage, cxt->nextcount);
    + cxt->ready = 1;
    + }
    return;
    }

    --
    1.6.0.4


    \
     
     \ /
      Last update: 2009-10-14 15:53    [from the cache]
    ©2003-2011 Jasper Spaans