UBI: do not allocate the memory unnecessarily
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>
This commit is contained in:
parent
6a059abdba
commit
d125a75342
1 changed files with 7 additions and 12 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue