UBI: do not allocate the memory unnecessarily
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Fri, 26 Oct 2012 13:11:26 +0000 (16:11 +0300)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Fri, 26 Oct 2012 13:29:46 +0000 (16:29 +0300)
UBI reserves an LEB sized buffer for various needs. We can use this buffer
while scanning, instead of allocating another one. This patch was originally
created by Jan Luebbe <jlu@pengutronix.de>, but then he dropped it and I picked
up and tweaked a little bit.

Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
drivers/mtd/ubi/attach.c

index fec406b..72fed30 100644 (file)
@@ -322,7 +322,6 @@ static struct ubi_ainf_volume *add_volume(struct ubi_attach_info *ai,
 int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
                        int pnum, const struct ubi_vid_hdr *vid_hdr)
 {
-       void *buf;
        int len, err, second_is_newer, bitflips = 0, corrupted = 0;
        uint32_t data_crc, crc;
        struct ubi_vid_hdr *vh = NULL;
@@ -393,18 +392,14 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
        /* Read the data of the copy and check the CRC */
 
        len = be32_to_cpu(vid_hdr->data_size);
-       buf = vmalloc(len);
-       if (!buf) {
-               err = -ENOMEM;
-               goto out_free_vidh;
-       }
 
-       err = ubi_io_read_data(ubi, buf, pnum, 0, len);
+       mutex_lock(&ubi->buf_mutex);
+       err = ubi_io_read_data(ubi, ubi->peb_buf, pnum, 0, len);
        if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
-               goto out_free_buf;
+               goto out_unlock;
 
        data_crc = be32_to_cpu(vid_hdr->data_crc);
-       crc = crc32(UBI_CRC32_INIT, buf, len);
+       crc = crc32(UBI_CRC32_INIT, ubi->peb_buf, len);
        if (crc != data_crc) {
                dbg_bld("PEB %d CRC error: calculated %#08x, must be %#08x",
                        pnum, crc, data_crc);
@@ -415,8 +410,8 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
                dbg_bld("PEB %d CRC is OK", pnum);
                bitflips = !!err;
        }
+       mutex_unlock(&ubi->buf_mutex);
 
-       vfree(buf);
        ubi_free_vid_hdr(ubi, vh);
 
        if (second_is_newer)
@@ -426,8 +421,8 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb,
 
        return second_is_newer | (bitflips << 1) | (corrupted << 2);
 
-out_free_buf:
-       vfree(buf);
+out_unlock:
+       mutex_unlock(&ubi->buf_mutex);
 out_free_vidh:
        ubi_free_vid_hdr(ubi, vh);
        return err;