UBI: allocate write checking buffer on demand
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Mon, 14 Mar 2011 15:06:52 +0000 (17:06 +0200)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Wed, 16 Mar 2011 11:50:16 +0000 (13:50 +0200)
Instead of using pre-allocated 'ubi->dbg_peb_buf' buffer in
'ubi_dbg_check_write()', dynamically allocate it when needed. The
intend is to get rid of the pre-allocated 'ubi->dbg_peb_buf' buffer
completely. And the need for this arises because we want to change
to dynamic debugging control instead of compile-time control, i.e.,
we are going to kill the CONFIG_MTD_UBI_DEBUG_PARANOID Kconfig
option, which would mean that 'ubi->dbg_peb_buf' is always allocated,
which would be wasteful.

Thus, we are getting rid of 'ubi->dbg_peb_buf', and this is a
preparation for that.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
drivers/mtd/ubi/io.c
drivers/mtd/ubi/ubi.h

index 889e25c4932352cfcd25ab165d5a59592416e92f..b4d34ba6060886b5eeacc29cfc280057a8d5f002 100644 (file)
@@ -1326,16 +1326,22 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
 {
        int err, i;
        size_t read;
+       void *buf1;
        loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
 
-       mutex_lock(&ubi->dbg_buf_mutex);
-       err = ubi->mtd->read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf);
+       buf1 = __vmalloc(len, GFP_KERNEL | GFP_NOFS, PAGE_KERNEL);
+       if (!buf1) {
+               ubi_err("cannot allocate memory to check writes");
+               return 0;
+       }
+
+       err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf1);
        if (err && err != -EUCLEAN)
-               goto out_unlock;
+               goto out_free;
 
        for (i = 0; i < len; i++) {
                uint8_t c = ((uint8_t *)buf)[i];
-               uint8_t c1 = ((uint8_t *)ubi->dbg_peb_buf)[i];
+               uint8_t c1 = ((uint8_t *)buf1)[i];
                int dump_len;
 
                if (c == c1)
@@ -1352,17 +1358,17 @@ int ubi_dbg_check_write(struct ubi_device *ubi, const void *buf, int pnum,
                ubi_msg("hex dump of the read buffer from %d to %d",
                        i, i + dump_len);
                print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
-                              ubi->dbg_peb_buf + i, dump_len, 1);
+                              buf1 + i, dump_len, 1);
                ubi_dbg_dump_stack();
                err = -EINVAL;
-               goto out_unlock;
+               goto out_free;
        }
-       mutex_unlock(&ubi->dbg_buf_mutex);
 
+       vfree(buf1);
        return 0;
 
-out_unlock:
-       mutex_unlock(&ubi->dbg_buf_mutex);
+out_free:
+       vfree(buf1);
        return err;
 }
 
index 0b0149c41fe3c7da9fd0b393b9a76c3cb90996c3..9af362c2a137061fc80bed7f66be74f0d0b0495f 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/notifier.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/ubi.h>
+#include <asm/pgtable.h>
 
 #include "ubi-media.h"
 #include "scan.h"