diff options
| author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2007-05-06 09:12:54 -0400 |
|---|---|---|
| committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2007-07-18 09:53:08 -0400 |
| commit | 92ad8f37509a7d9d5dd6e0092211b092a7ca7fb1 (patch) | |
| tree | 96c0f9c524b80e8d1d247e3f462c0c0d6fb782a5 /drivers/mtd/ubi | |
| parent | 79b510c0f21174f4bd055d1aab156e548ae3a5f2 (diff) | |
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>
Diffstat (limited to 'drivers/mtd/ubi')
| -rw-r--r-- | drivers/mtd/ubi/build.c | 2 | ||||
| -rw-r--r-- | drivers/mtd/ubi/cdev.c | 10 | ||||
| -rw-r--r-- | drivers/mtd/ubi/eba.c | 22 | ||||
| -rw-r--r-- | drivers/mtd/ubi/io.c | 11 | ||||
| -rw-r--r-- | drivers/mtd/ubi/misc.c | 4 | ||||
| -rw-r--r-- | drivers/mtd/ubi/scan.c | 6 | ||||
| -rw-r--r-- | drivers/mtd/ubi/ubi.h | 1 | ||||
| -rw-r--r-- | drivers/mtd/ubi/upd.c | 4 | ||||
| -rw-r--r-- | drivers/mtd/ubi/vtbl.c | 18 |
9 files changed, 41 insertions, 37 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index 555d594d18..054a88dcc7 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c | |||
| @@ -650,7 +650,7 @@ static void detach_mtd_dev(struct ubi_device *ubi) | |||
| 650 | uif_close(ubi); | 650 | uif_close(ubi); |
| 651 | ubi_eba_close(ubi); | 651 | ubi_eba_close(ubi); |
| 652 | ubi_wl_close(ubi); | 652 | ubi_wl_close(ubi); |
| 653 | kfree(ubi->vtbl); | 653 | vfree(ubi->vtbl); |
| 654 | put_mtd_device(ubi->mtd); | 654 | put_mtd_device(ubi->mtd); |
| 655 | kfree(ubi_devices[ubi_num]); | 655 | kfree(ubi_devices[ubi_num]); |
| 656 | ubi_devices[ubi_num] = NULL; | 656 | ubi_devices[ubi_num] = NULL; |
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c index 959044a2dd..34375ee6d4 100644 --- a/drivers/mtd/ubi/cdev.c +++ b/drivers/mtd/ubi/cdev.c | |||
| @@ -153,7 +153,7 @@ static int vol_cdev_release(struct inode *inode, struct file *file) | |||
| 153 | ubi_warn("update of volume %d not finished, volume is damaged", | 153 | ubi_warn("update of volume %d not finished, volume is damaged", |
| 154 | vol->vol_id); | 154 | vol->vol_id); |
| 155 | vol->updating = 0; | 155 | vol->updating = 0; |
| 156 | kfree(vol->upd_buf); | 156 | vfree(vol->upd_buf); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | ubi_close_volume(desc); | 159 | ubi_close_volume(desc); |
| @@ -232,7 +232,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count, | |||
| 232 | tbuf_size = vol->usable_leb_size; | 232 | tbuf_size = vol->usable_leb_size; |
| 233 | if (count < tbuf_size) | 233 | if (count < tbuf_size) |
| 234 | tbuf_size = ALIGN(count, ubi->min_io_size); | 234 | tbuf_size = ALIGN(count, ubi->min_io_size); |
| 235 | tbuf = kmalloc(tbuf_size, GFP_KERNEL); | 235 | tbuf = vmalloc(tbuf_size); |
| 236 | if (!tbuf) | 236 | if (!tbuf) |
| 237 | return -ENOMEM; | 237 | return -ENOMEM; |
| 238 | 238 | ||
| @@ -271,7 +271,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count, | |||
| 271 | len = count > tbuf_size ? tbuf_size : count; | 271 | len = count > tbuf_size ? tbuf_size : count; |
| 272 | } while (count); | 272 | } while (count); |
| 273 | 273 | ||
| 274 | kfree(tbuf); | 274 | vfree(tbuf); |
| 275 | return err ? err : count_save - count; | 275 | return err ? err : count_save - count; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| @@ -320,7 +320,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf, | |||
| 320 | tbuf_size = vol->usable_leb_size; | 320 | tbuf_size = vol->usable_leb_size; |
| 321 | if (count < tbuf_size) | 321 | if (count < tbuf_size) |
| 322 | tbuf_size = ALIGN(count, ubi->min_io_size); | 322 | tbuf_size = ALIGN(count, ubi->min_io_size); |
| 323 | tbuf = kmalloc(tbuf_size, GFP_KERNEL); | 323 | tbuf = vmalloc(tbuf_size); |
| 324 | if (!tbuf) | 324 | if (!tbuf) |
| 325 | return -ENOMEM; | 325 | return -ENOMEM; |
| 326 | 326 | ||
| @@ -355,7 +355,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf, | |||
| 355 | len = count > tbuf_size ? tbuf_size : count; | 355 | len = count > tbuf_size ? tbuf_size : count; |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | kfree(tbuf); | 358 | vfree(tbuf); |
| 359 | return err ? err : count_save - count; | 359 | return err ? err : count_save - count; |
| 360 | } | 360 | } |
| 361 | 361 | ||
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index 7c6b223b3f..6964fe4ab4 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -524,7 +524,7 @@ retry: | |||
| 524 | goto write_error; | 524 | goto write_error; |
| 525 | 525 | ||
| 526 | data_size = offset + len; | 526 | data_size = offset + len; |
| 527 | new_buf = kmalloc(data_size, GFP_KERNEL); | 527 | new_buf = vmalloc(data_size); |
| 528 | if (!new_buf) { | 528 | if (!new_buf) { |
| 529 | err = -ENOMEM; | 529 | err = -ENOMEM; |
| 530 | goto out_put; | 530 | goto out_put; |
| @@ -535,7 +535,7 @@ retry: | |||
| 535 | if (offset > 0) { | 535 | if (offset > 0) { |
| 536 | err = ubi_io_read_data(ubi, new_buf, pnum, 0, offset); | 536 | err = ubi_io_read_data(ubi, new_buf, pnum, 0, offset); |
| 537 | if (err && err != UBI_IO_BITFLIPS) { | 537 | if (err && err != UBI_IO_BITFLIPS) { |
| 538 | kfree(new_buf); | 538 | vfree(new_buf); |
| 539 | goto out_put; | 539 | goto out_put; |
| 540 | } | 540 | } |
| 541 | } | 541 | } |
| @@ -544,11 +544,11 @@ retry: | |||
| 544 | 544 | ||
| 545 | err = ubi_io_write_data(ubi, new_buf, new_pnum, 0, data_size); | 545 | err = ubi_io_write_data(ubi, new_buf, new_pnum, 0, data_size); |
| 546 | if (err) { | 546 | if (err) { |
| 547 | kfree(new_buf); | 547 | vfree(new_buf); |
| 548 | goto write_error; | 548 | goto write_error; |
| 549 | } | 549 | } |
| 550 | 550 | ||
| 551 | kfree(new_buf); | 551 | vfree(new_buf); |
| 552 | ubi_free_vid_hdr(ubi, vid_hdr); | 552 | ubi_free_vid_hdr(ubi, vid_hdr); |
| 553 | 553 | ||
| 554 | vol->eba_tbl[lnum] = new_pnum; | 554 | vol->eba_tbl[lnum] = new_pnum; |
| @@ -977,7 +977,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 977 | data_size = aldata_size = | 977 | data_size = aldata_size = |
| 978 | ubi->leb_size - ubi32_to_cpu(vid_hdr->data_pad); | 978 | ubi->leb_size - ubi32_to_cpu(vid_hdr->data_pad); |
| 979 | 979 | ||
| 980 | buf = kmalloc(aldata_size, GFP_KERNEL); | 980 | buf = vmalloc(aldata_size); |
| 981 | if (!buf) | 981 | if (!buf) |
| 982 | return -ENOMEM; | 982 | return -ENOMEM; |
| 983 | 983 | ||
| @@ -987,7 +987,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 987 | */ | 987 | */ |
| 988 | err = leb_write_lock(ubi, vol_id, lnum); | 988 | err = leb_write_lock(ubi, vol_id, lnum); |
| 989 | if (err) { | 989 | if (err) { |
| 990 | kfree(buf); | 990 | vfree(buf); |
| 991 | return err; | 991 | return err; |
| 992 | } | 992 | } |
| 993 | 993 | ||
| @@ -1082,7 +1082,7 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 1082 | * We've written the data and are going to read it back to make | 1082 | * We've written the data and are going to read it back to make |
| 1083 | * sure it was written correctly. | 1083 | * sure it was written correctly. |
| 1084 | */ | 1084 | */ |
| 1085 | buf1 = kmalloc(aldata_size, GFP_KERNEL); | 1085 | buf1 = vmalloc(aldata_size); |
| 1086 | if (!buf1) { | 1086 | if (!buf1) { |
| 1087 | err = -ENOMEM; | 1087 | err = -ENOMEM; |
| 1088 | goto out_unlock; | 1088 | goto out_unlock; |
| @@ -1111,15 +1111,15 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, | |||
| 1111 | vol->eba_tbl[lnum] = to; | 1111 | vol->eba_tbl[lnum] = to; |
| 1112 | 1112 | ||
| 1113 | leb_write_unlock(ubi, vol_id, lnum); | 1113 | leb_write_unlock(ubi, vol_id, lnum); |
| 1114 | kfree(buf); | 1114 | vfree(buf); |
| 1115 | kfree(buf1); | 1115 | vfree(buf1); |
| 1116 | 1116 | ||
| 1117 | return 0; | 1117 | return 0; |
| 1118 | 1118 | ||
| 1119 | out_unlock: | 1119 | out_unlock: |
| 1120 | leb_write_unlock(ubi, vol_id, lnum); | 1120 | leb_write_unlock(ubi, vol_id, lnum); |
| 1121 | kfree(buf); | 1121 | vfree(buf); |
| 1122 | kfree(buf1); | 1122 | vfree(buf1); |
| 1123 | return err; | 1123 | return err; |
| 1124 | } | 1124 | } |
| 1125 | 1125 | ||
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c index 438914d051..7bb473e646 100644 --- a/drivers/mtd/ubi/io.c +++ b/drivers/mtd/ubi/io.c | |||
| @@ -382,7 +382,7 @@ static int torture_peb(const struct ubi_device *ubi, int pnum) | |||
| 382 | void *buf; | 382 | void *buf; |
| 383 | int err, i, patt_count; | 383 | int err, i, patt_count; |
| 384 | 384 | ||
| 385 | buf = kmalloc(ubi->peb_size, GFP_KERNEL); | 385 | buf = vmalloc(ubi->peb_size); |
| 386 | if (!buf) | 386 | if (!buf) |
| 387 | return -ENOMEM; | 387 | return -ENOMEM; |
| 388 | 388 | ||
| @@ -437,7 +437,7 @@ out: | |||
| 437 | * physical eraseblock which means something is wrong with it. | 437 | * physical eraseblock which means something is wrong with it. |
| 438 | */ | 438 | */ |
| 439 | err = -EIO; | 439 | err = -EIO; |
| 440 | kfree(buf); | 440 | vfree(buf); |
| 441 | return err; | 441 | return err; |
| 442 | } | 442 | } |
| 443 | 443 | ||
| @@ -1224,9 +1224,10 @@ static int paranoid_check_all_ff(const struct ubi_device *ubi, int pnum, | |||
| 1224 | void *buf; | 1224 | void *buf; |
| 1225 | loff_t addr = (loff_t)pnum * ubi->peb_size + offset; | 1225 | loff_t addr = (loff_t)pnum * ubi->peb_size + offset; |
| 1226 | 1226 | ||
| 1227 | buf = kzalloc(len, GFP_KERNEL); | 1227 | buf = vmalloc(len); |
| 1228 | if (!buf) | 1228 | if (!buf) |
| 1229 | return -ENOMEM; | 1229 | return -ENOMEM; |
| 1230 | memset(buf, 0, len); | ||
| 1230 | 1231 | ||
| 1231 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf); | 1232 | err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf); |
| 1232 | if (err && err != -EUCLEAN) { | 1233 | if (err && err != -EUCLEAN) { |
| @@ -1242,7 +1243,7 @@ static int paranoid_check_all_ff(const struct ubi_device *ubi, int pnum, | |||
| 1242 | goto fail; | 1243 | goto fail; |
| 1243 | } | 1244 | } |
| 1244 | 1245 | ||
| 1245 | kfree(buf); | 1246 | vfree(buf); |
| 1246 | return 0; | 1247 | return 0; |
| 1247 | 1248 | ||
| 1248 | fail: | 1249 | fail: |
| @@ -1252,7 +1253,7 @@ fail: | |||
| 1252 | err = 1; | 1253 | err = 1; |
| 1253 | error: | 1254 | error: |
| 1254 | ubi_dbg_dump_stack(); | 1255 | ubi_dbg_dump_stack(); |
| 1255 | kfree(buf); | 1256 | vfree(buf); |
| 1256 | return err; | 1257 | return err; |
| 1257 | } | 1258 | } |
| 1258 | 1259 | ||
diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c index 38d4e6757d..9e2338c8e2 100644 --- a/drivers/mtd/ubi/misc.c +++ b/drivers/mtd/ubi/misc.c | |||
| @@ -67,7 +67,7 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id) | |||
| 67 | if (vol->vol_type != UBI_STATIC_VOLUME) | 67 | if (vol->vol_type != UBI_STATIC_VOLUME) |
| 68 | return 0; | 68 | return 0; |
| 69 | 69 | ||
| 70 | buf = kmalloc(vol->usable_leb_size, GFP_KERNEL); | 70 | buf = vmalloc(vol->usable_leb_size); |
| 71 | if (!buf) | 71 | if (!buf) |
| 72 | return -ENOMEM; | 72 | return -ENOMEM; |
| 73 | 73 | ||
| @@ -87,7 +87,7 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id) | |||
| 87 | } | 87 | } |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | kfree(buf); | 90 | vfree(buf); |
| 91 | return err; | 91 | return err; |
| 92 | } | 92 | } |
| 93 | 93 | ||
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index b24af2104a..cbd588d601 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
| @@ -356,7 +356,7 @@ static int compare_lebs(const struct ubi_device *ubi, | |||
| 356 | /* Read the data of the copy and check the CRC */ | 356 | /* Read the data of the copy and check the CRC */ |
| 357 | 357 | ||
| 358 | len = ubi32_to_cpu(vid_hdr->data_size); | 358 | len = ubi32_to_cpu(vid_hdr->data_size); |
| 359 | buf = kmalloc(len, GFP_KERNEL); | 359 | buf = vmalloc(len); |
| 360 | if (!buf) { | 360 | if (!buf) { |
| 361 | err = -ENOMEM; | 361 | err = -ENOMEM; |
| 362 | goto out_free_vidh; | 362 | goto out_free_vidh; |
| @@ -379,7 +379,7 @@ static int compare_lebs(const struct ubi_device *ubi, | |||
| 379 | bitflips = !!err; | 379 | bitflips = !!err; |
| 380 | } | 380 | } |
| 381 | 381 | ||
| 382 | kfree(buf); | 382 | vfree(buf); |
| 383 | ubi_free_vid_hdr(ubi, vidh); | 383 | ubi_free_vid_hdr(ubi, vidh); |
| 384 | 384 | ||
| 385 | if (second_is_newer) | 385 | if (second_is_newer) |
| @@ -390,7 +390,7 @@ static int compare_lebs(const struct ubi_device *ubi, | |||
| 390 | return second_is_newer | (bitflips << 1) | (corrupted << 2); | 390 | return second_is_newer | (bitflips << 1) | (corrupted << 2); |
| 391 | 391 | ||
| 392 | out_free_buf: | 392 | out_free_buf: |
| 393 | kfree(buf); | 393 | vfree(buf); |
| 394 | out_free_vidh: | 394 | out_free_vidh: |
| 395 | ubi_free_vid_hdr(ubi, vidh); | 395 | ubi_free_vid_hdr(ubi, vidh); |
| 396 | ubi_assert(err < 0); | 396 | ubi_assert(err < 0); |
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h index c26edea968..5959f91be2 100644 --- a/drivers/mtd/ubi/ubi.h +++ b/drivers/mtd/ubi/ubi.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/cdev.h> | 35 | #include <linux/cdev.h> |
| 36 | #include <linux/device.h> | 36 | #include <linux/device.h> |
| 37 | #include <linux/string.h> | 37 | #include <linux/string.h> |
| 38 | #include <linux/vmalloc.h> | ||
| 38 | #include <linux/mtd/mtd.h> | 39 | #include <linux/mtd/mtd.h> |
| 39 | 40 | ||
| 40 | #include <mtd/ubi-header.h> | 41 | #include <mtd/ubi-header.h> |
diff --git a/drivers/mtd/ubi/upd.c b/drivers/mtd/ubi/upd.c index 8925b977e3..0efc586a83 100644 --- a/drivers/mtd/ubi/upd.c +++ b/drivers/mtd/ubi/upd.c | |||
| @@ -150,7 +150,7 @@ int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes) | |||
| 150 | vol->updating = 0; | 150 | vol->updating = 0; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | vol->upd_buf = kmalloc(ubi->leb_size, GFP_KERNEL); | 153 | vol->upd_buf = vmalloc(ubi->leb_size); |
| 154 | if (!vol->upd_buf) | 154 | if (!vol->upd_buf) |
| 155 | return -ENOMEM; | 155 | return -ENOMEM; |
| 156 | 156 | ||
| @@ -339,7 +339,7 @@ int ubi_more_update_data(struct ubi_device *ubi, int vol_id, | |||
| 339 | err = ubi_wl_flush(ubi); | 339 | err = ubi_wl_flush(ubi); |
| 340 | if (err == 0) { | 340 | if (err == 0) { |
| 341 | err = to_write; | 341 | err = to_write; |
| 342 | kfree(vol->upd_buf); | 342 | vfree(vol->upd_buf); |
| 343 | vol->updating = 0; | 343 | vol->updating = 0; |
| 344 | } | 344 | } |
| 345 | } | 345 | } |
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c index 9926f1f9aa..e3557b987e 100644 --- a/drivers/mtd/ubi/vtbl.c +++ b/drivers/mtd/ubi/vtbl.c | |||
| @@ -381,11 +381,12 @@ static struct ubi_vtbl_record *process_lvol(const struct ubi_device *ubi, | |||
| 381 | 381 | ||
| 382 | /* Read both LEB 0 and LEB 1 into memory */ | 382 | /* Read both LEB 0 and LEB 1 into memory */ |
| 383 | ubi_rb_for_each_entry(rb, seb, &sv->root, u.rb) { | 383 | ubi_rb_for_each_entry(rb, seb, &sv->root, u.rb) { |
| 384 | leb[seb->lnum] = kzalloc(ubi->vtbl_size, GFP_KERNEL); | 384 | leb[seb->lnum] = vmalloc(ubi->vtbl_size); |
| 385 | if (!leb[seb->lnum]) { | 385 | if (!leb[seb->lnum]) { |
| 386 | err = -ENOMEM; | 386 | err = -ENOMEM; |
| 387 | goto out_free; | 387 | goto out_free; |
| 388 | } | 388 | } |
| 389 | memset(leb[seb->lnum], 0, ubi->vtbl_size); | ||
| 389 | 390 | ||
| 390 | err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0, | 391 | err = ubi_io_read_data(ubi, leb[seb->lnum], seb->pnum, 0, |
| 391 | ubi->vtbl_size); | 392 | ubi->vtbl_size); |
| @@ -416,7 +417,7 @@ static struct ubi_vtbl_record *process_lvol(const struct ubi_device *ubi, | |||
| 416 | } | 417 | } |
| 417 | 418 | ||
| 418 | /* Both LEB 1 and LEB 2 are OK and consistent */ | 419 | /* Both LEB 1 and LEB 2 are OK and consistent */ |
| 419 | kfree(leb[1]); | 420 | vfree(leb[1]); |
| 420 | return leb[0]; | 421 | return leb[0]; |
| 421 | } else { | 422 | } else { |
| 422 | /* LEB 0 is corrupted or does not exist */ | 423 | /* LEB 0 is corrupted or does not exist */ |
| @@ -437,13 +438,13 @@ static struct ubi_vtbl_record *process_lvol(const struct ubi_device *ubi, | |||
| 437 | goto out_free; | 438 | goto out_free; |
| 438 | ubi_msg("volume table was restored"); | 439 | ubi_msg("volume table was restored"); |
| 439 | 440 | ||
| 440 | kfree(leb[0]); | 441 | vfree(leb[0]); |
| 441 | return leb[1]; | 442 | return leb[1]; |
| 442 | } | 443 | } |
| 443 | 444 | ||
| 444 | out_free: | 445 | out_free: |
| 445 | kfree(leb[0]); | 446 | vfree(leb[0]); |
| 446 | kfree(leb[1]); | 447 | vfree(leb[1]); |
| 447 | return ERR_PTR(err); | 448 | return ERR_PTR(err); |
| 448 | } | 449 | } |
| 449 | 450 | ||
| @@ -461,9 +462,10 @@ static struct ubi_vtbl_record *create_empty_lvol(const struct ubi_device *ubi, | |||
| 461 | int i; | 462 | int i; |
| 462 | struct ubi_vtbl_record *vtbl; | 463 | struct ubi_vtbl_record *vtbl; |
| 463 | 464 | ||
| 464 | vtbl = kzalloc(ubi->vtbl_size, GFP_KERNEL); | 465 | vtbl = vmalloc(ubi->vtbl_size); |
| 465 | if (!vtbl) | 466 | if (!vtbl) |
| 466 | return ERR_PTR(-ENOMEM); | 467 | return ERR_PTR(-ENOMEM); |
| 468 | memset(vtbl, 0, ubi->vtbl_size); | ||
| 467 | 469 | ||
| 468 | for (i = 0; i < ubi->vtbl_slots; i++) | 470 | for (i = 0; i < ubi->vtbl_slots; i++) |
| 469 | memcpy(&vtbl[i], &empty_vtbl_record, UBI_VTBL_RECORD_SIZE); | 471 | memcpy(&vtbl[i], &empty_vtbl_record, UBI_VTBL_RECORD_SIZE); |
| @@ -473,7 +475,7 @@ static struct ubi_vtbl_record *create_empty_lvol(const struct ubi_device *ubi, | |||
| 473 | 475 | ||
| 474 | err = create_vtbl(ubi, si, i, vtbl); | 476 | err = create_vtbl(ubi, si, i, vtbl); |
| 475 | if (err) { | 477 | if (err) { |
| 476 | kfree(vtbl); | 478 | vfree(vtbl); |
| 477 | return ERR_PTR(err); | 479 | return ERR_PTR(err); |
| 478 | } | 480 | } |
| 479 | } | 481 | } |
| @@ -784,7 +786,7 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si) | |||
| 784 | return 0; | 786 | return 0; |
| 785 | 787 | ||
| 786 | out_free: | 788 | out_free: |
| 787 | kfree(ubi->vtbl); | 789 | vfree(ubi->vtbl); |
| 788 | for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) | 790 | for (i = 0; i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) |
| 789 | if (ubi->volumes[i]) { | 791 | if (ubi->volumes[i]) { |
| 790 | kfree(ubi->volumes[i]); | 792 | kfree(ubi->volumes[i]); |
