UBI: use vmalloc for large buffers

UBI allocates temporary buffers of PEB size, which may be 256KiB.
Use vmalloc instead of kmalloc for such big temporary buffers.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
Artem Bityutskiy
2007-05-06 16:12:54 +03:00
parent 79b510c0f2
commit 92ad8f3750
9 changed files with 41 additions and 37 deletions

View File

@@ -524,7 +524,7 @@ retry:
goto write_error;
data_size = offset + len;
new_buf = kmalloc(data_size, GFP_KERNEL);
new_buf = vmalloc(data_size);
if (!new_buf) {
err = -ENOMEM;
goto out_put;
@@ -535,7 +535,7 @@ retry:
if (offset > 0) {
err = ubi_io_read_data(ubi, new_buf, pnum, 0, offset);
if (err && err != UBI_IO_BITFLIPS) {
kfree(new_buf);
vfree(new_buf);
goto out_put;
}
}
@@ -544,11 +544,11 @@ retry:
err = ubi_io_write_data(ubi, new_buf, new_pnum, 0, data_size);
if (err) {
kfree(new_buf);
vfree(new_buf);
goto write_error;
}
kfree(new_buf);
vfree(new_buf);
ubi_free_vid_hdr(ubi, vid_hdr);
vol->eba_tbl[lnum] = new_pnum;
@@ -977,7 +977,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
data_size = aldata_size =
ubi->leb_size - ubi32_to_cpu(vid_hdr->data_pad);
buf = kmalloc(aldata_size, GFP_KERNEL);
buf = vmalloc(aldata_size);
if (!buf)
return -ENOMEM;
@@ -987,7 +987,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
*/
err = leb_write_lock(ubi, vol_id, lnum);
if (err) {
kfree(buf);
vfree(buf);
return err;
}
@@ -1082,7 +1082,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
* We've written the data and are going to read it back to make
* sure it was written correctly.
*/
buf1 = kmalloc(aldata_size, GFP_KERNEL);
buf1 = vmalloc(aldata_size);
if (!buf1) {
err = -ENOMEM;
goto out_unlock;
@@ -1111,15 +1111,15 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
vol->eba_tbl[lnum] = to;
leb_write_unlock(ubi, vol_id, lnum);
kfree(buf);
kfree(buf1);
vfree(buf);
vfree(buf1);
return 0;
out_unlock:
leb_write_unlock(ubi, vol_id, lnum);
kfree(buf);
kfree(buf1);
vfree(buf);
vfree(buf1);
return err;
}