|
@@ -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;
|