aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-16 13:00:38 -0500
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-26 12:15:15 -0500
commit89b96b69290668351a33b09372ec1c94cb5748e5 (patch)
treecdbb79da1c821f2155815119ded20d181c23c7c2 /drivers/mtd/ubi
parent77c722dde9975361051c5530475f8f92ed67a506 (diff)
UBI: improve internal interfaces
Pass volume description object to the EBA function which makes more sense, and EBA function do not have to find the volume description object by volume ID. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd/ubi')
-rw-r--r--drivers/mtd/ubi/build.c4
-rw-r--r--drivers/mtd/ubi/cdev.c6
-rw-r--r--drivers/mtd/ubi/eba.c51
-rw-r--r--drivers/mtd/ubi/gluebi.c9
-rw-r--r--drivers/mtd/ubi/kapi.c12
-rw-r--r--drivers/mtd/ubi/misc.c2
-rw-r--r--drivers/mtd/ubi/ubi.h21
-rw-r--r--drivers/mtd/ubi/upd.c7
-rw-r--r--drivers/mtd/ubi/vmt.c22
-rw-r--r--drivers/mtd/ubi/vtbl.c6
10 files changed, 68 insertions, 72 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c
index b85ca186afc6..5d00364d4a4a 100644
--- a/drivers/mtd/ubi/build.c
+++ b/drivers/mtd/ubi/build.c
@@ -249,7 +249,7 @@ static void kill_volumes(struct ubi_device *ubi)
249 249
250 for (i = 0; i < ubi->vtbl_slots; i++) 250 for (i = 0; i < ubi->vtbl_slots; i++)
251 if (ubi->volumes[i]) 251 if (ubi->volumes[i])
252 ubi_free_volume(ubi, i); 252 ubi_free_volume(ubi, ubi->volumes[i]);
253} 253}
254 254
255/** 255/**
@@ -300,7 +300,7 @@ static int uif_init(struct ubi_device *ubi)
300 300
301 for (i = 0; i < ubi->vtbl_slots; i++) 301 for (i = 0; i < ubi->vtbl_slots; i++)
302 if (ubi->volumes[i]) { 302 if (ubi->volumes[i]) {
303 err = ubi_add_volume(ubi, i); 303 err = ubi_add_volume(ubi, ubi->volumes[i]);
304 if (err) { 304 if (err) {
305 ubi_err("cannot add volume %d", i); 305 ubi_err("cannot add volume %d", i);
306 goto out_volumes; 306 goto out_volumes;
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
index 7697eda2d58c..24344ba3cfed 100644
--- a/drivers/mtd/ubi/cdev.c
+++ b/drivers/mtd/ubi/cdev.c
@@ -249,7 +249,7 @@ static ssize_t vol_cdev_read(struct file *file, __user char *buf, size_t count,
249 if (off + len >= vol->usable_leb_size) 249 if (off + len >= vol->usable_leb_size)
250 len = vol->usable_leb_size - off; 250 len = vol->usable_leb_size - off;
251 251
252 err = ubi_eba_read_leb(ubi, vol_id, lnum, tbuf, off, len, 0); 252 err = ubi_eba_read_leb(ubi, vol, lnum, tbuf, off, len, 0);
253 if (err) 253 if (err)
254 break; 254 break;
255 255
@@ -339,7 +339,7 @@ static ssize_t vol_cdev_direct_write(struct file *file, const char __user *buf,
339 break; 339 break;
340 } 340 }
341 341
342 err = ubi_eba_write_leb(ubi, vol_id, lnum, tbuf, off, len, 342 err = ubi_eba_write_leb(ubi, vol, lnum, tbuf, off, len,
343 UBI_UNKNOWN); 343 UBI_UNKNOWN);
344 if (err) 344 if (err)
345 break; 345 break;
@@ -484,7 +484,7 @@ static int vol_cdev_ioctl(struct inode *inode, struct file *file,
484 } 484 }
485 485
486 dbg_msg("erase LEB %d:%d", vol->vol_id, lnum); 486 dbg_msg("erase LEB %d:%d", vol->vol_id, lnum);
487 err = ubi_eba_unmap_leb(ubi, vol->vol_id, lnum); 487 err = ubi_eba_unmap_leb(ubi, vol, lnum);
488 if (err) 488 if (err)
489 break; 489 break;
490 490
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
index 5fdb31bc5636..b2b0f29bdc53 100644
--- a/drivers/mtd/ubi/eba.c
+++ b/drivers/mtd/ubi/eba.c
@@ -289,17 +289,17 @@ static void leb_write_unlock(struct ubi_device *ubi, int vol_id, int lnum)
289/** 289/**
290 * ubi_eba_unmap_leb - un-map logical eraseblock. 290 * ubi_eba_unmap_leb - un-map logical eraseblock.
291 * @ubi: UBI device description object 291 * @ubi: UBI device description object
292 * @vol_id: volume ID 292 * @vol: volume description object
293 * @lnum: logical eraseblock number 293 * @lnum: logical eraseblock number
294 * 294 *
295 * This function un-maps logical eraseblock @lnum and schedules corresponding 295 * This function un-maps logical eraseblock @lnum and schedules corresponding
296 * physical eraseblock for erasure. Returns zero in case of success and a 296 * physical eraseblock for erasure. Returns zero in case of success and a
297 * negative error code in case of failure. 297 * negative error code in case of failure.
298 */ 298 */
299int ubi_eba_unmap_leb(struct ubi_device *ubi, int vol_id, int lnum) 299int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
300 int lnum)
300{ 301{
301 int idx = vol_id2idx(ubi, vol_id), err, pnum; 302 int err, pnum, vol_id = vol->vol_id;
302 struct ubi_volume *vol = ubi->volumes[idx];
303 303
304 if (ubi->ro_mode) 304 if (ubi->ro_mode)
305 return -EROFS; 305 return -EROFS;
@@ -326,7 +326,7 @@ out_unlock:
326/** 326/**
327 * ubi_eba_read_leb - read data. 327 * ubi_eba_read_leb - read data.
328 * @ubi: UBI device description object 328 * @ubi: UBI device description object
329 * @vol_id: volume ID 329 * @vol: volume description object
330 * @lnum: logical eraseblock number 330 * @lnum: logical eraseblock number
331 * @buf: buffer to store the read data 331 * @buf: buffer to store the read data
332 * @offset: offset from where to read 332 * @offset: offset from where to read
@@ -342,12 +342,11 @@ out_unlock:
342 * returned for any volume type if an ECC error was detected by the MTD device 342 * returned for any volume type if an ECC error was detected by the MTD device
343 * driver. Other negative error cored may be returned in case of other errors. 343 * driver. Other negative error cored may be returned in case of other errors.
344 */ 344 */
345int ubi_eba_read_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf, 345int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
346 int offset, int len, int check) 346 void *buf, int offset, int len, int check)
347{ 347{
348 int err, pnum, scrub = 0, idx = vol_id2idx(ubi, vol_id); 348 int err, pnum, scrub = 0, vol_id = vol->vol_id;
349 struct ubi_vid_hdr *vid_hdr; 349 struct ubi_vid_hdr *vid_hdr;
350 struct ubi_volume *vol = ubi->volumes[idx];
351 uint32_t uninitialized_var(crc); 350 uint32_t uninitialized_var(crc);
352 351
353 err = leb_read_lock(ubi, vol_id, lnum); 352 err = leb_read_lock(ubi, vol_id, lnum);
@@ -555,7 +554,7 @@ write_error:
555/** 554/**
556 * ubi_eba_write_leb - write data to dynamic volume. 555 * ubi_eba_write_leb - write data to dynamic volume.
557 * @ubi: UBI device description object 556 * @ubi: UBI device description object
558 * @vol_id: volume ID 557 * @vol: volume description object
559 * @lnum: logical eraseblock number 558 * @lnum: logical eraseblock number
560 * @buf: the data to write 559 * @buf: the data to write
561 * @offset: offset within the logical eraseblock where to write 560 * @offset: offset within the logical eraseblock where to write
@@ -563,15 +562,14 @@ write_error:
563 * @dtype: data type 562 * @dtype: data type
564 * 563 *
565 * This function writes data to logical eraseblock @lnum of a dynamic volume 564 * This function writes data to logical eraseblock @lnum of a dynamic volume
566 * @vol_id. Returns zero in case of success and a negative error code in case 565 * @vol. Returns zero in case of success and a negative error code in case
567 * of failure. In case of error, it is possible that something was still 566 * of failure. In case of error, it is possible that something was still
568 * written to the flash media, but may be some garbage. 567 * written to the flash media, but may be some garbage.
569 */ 568 */
570int ubi_eba_write_leb(struct ubi_device *ubi, int vol_id, int lnum, 569int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
571 const void *buf, int offset, int len, int dtype) 570 const void *buf, int offset, int len, int dtype)
572{ 571{
573 int idx = vol_id2idx(ubi, vol_id), err, pnum, tries = 0; 572 int err, pnum, tries = 0, vol_id = vol->vol_id;
574 struct ubi_volume *vol = ubi->volumes[idx];
575 struct ubi_vid_hdr *vid_hdr; 573 struct ubi_vid_hdr *vid_hdr;
576 574
577 if (ubi->ro_mode) 575 if (ubi->ro_mode)
@@ -590,7 +588,8 @@ int ubi_eba_write_leb(struct ubi_device *ubi, int vol_id, int lnum,
590 if (err) { 588 if (err) {
591 ubi_warn("failed to write data to PEB %d", pnum); 589 ubi_warn("failed to write data to PEB %d", pnum);
592 if (err == -EIO && ubi->bad_allowed) 590 if (err == -EIO && ubi->bad_allowed)
593 err = recover_peb(ubi, pnum, vol_id, lnum, buf, offset, len); 591 err = recover_peb(ubi, pnum, vol_id, lnum, buf,
592 offset, len);
594 if (err) 593 if (err)
595 ubi_ro_mode(ubi); 594 ubi_ro_mode(ubi);
596 } 595 }
@@ -678,7 +677,7 @@ write_error:
678/** 677/**
679 * ubi_eba_write_leb_st - write data to static volume. 678 * ubi_eba_write_leb_st - write data to static volume.
680 * @ubi: UBI device description object 679 * @ubi: UBI device description object
681 * @vol_id: volume ID 680 * @vol: volume description object
682 * @lnum: logical eraseblock number 681 * @lnum: logical eraseblock number
683 * @buf: data to write 682 * @buf: data to write
684 * @len: how many bytes to write 683 * @len: how many bytes to write
@@ -686,7 +685,7 @@ write_error:
686 * @used_ebs: how many logical eraseblocks will this volume contain 685 * @used_ebs: how many logical eraseblocks will this volume contain
687 * 686 *
688 * This function writes data to logical eraseblock @lnum of static volume 687 * This function writes data to logical eraseblock @lnum of static volume
689 * @vol_id. The @used_ebs argument should contain total number of logical 688 * @vol. The @used_ebs argument should contain total number of logical
690 * eraseblock in this static volume. 689 * eraseblock in this static volume.
691 * 690 *
692 * When writing to the last logical eraseblock, the @len argument doesn't have 691 * When writing to the last logical eraseblock, the @len argument doesn't have
@@ -698,12 +697,11 @@ write_error:
698 * volumes. This function returns zero in case of success and a negative error 697 * volumes. This function returns zero in case of success and a negative error
699 * code in case of failure. 698 * code in case of failure.
700 */ 699 */
701int ubi_eba_write_leb_st(struct ubi_device *ubi, int vol_id, int lnum, 700int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,
702 const void *buf, int len, int dtype, int used_ebs) 701 int lnum, const void *buf, int len, int dtype,
702 int used_ebs)
703{ 703{
704 int err, pnum, tries = 0, data_size = len; 704 int err, pnum, tries = 0, data_size = len, vol_id = vol->vol_id;
705 int idx = vol_id2idx(ubi, vol_id);
706 struct ubi_volume *vol = ubi->volumes[idx];
707 struct ubi_vid_hdr *vid_hdr; 705 struct ubi_vid_hdr *vid_hdr;
708 uint32_t crc; 706 uint32_t crc;
709 707
@@ -799,7 +797,7 @@ write_error:
799/* 797/*
800 * ubi_eba_atomic_leb_change - change logical eraseblock atomically. 798 * ubi_eba_atomic_leb_change - change logical eraseblock atomically.
801 * @ubi: UBI device description object 799 * @ubi: UBI device description object
802 * @vol_id: volume ID 800 * @vol: volume escription object
803 * @lnum: logical eraseblock number 801 * @lnum: logical eraseblock number
804 * @buf: data to write 802 * @buf: data to write
805 * @len: how many bytes to write 803 * @len: how many bytes to write
@@ -814,11 +812,10 @@ write_error:
814 * UBI reserves one LEB for the "atomic LEB change" operation, so only one 812 * UBI reserves one LEB for the "atomic LEB change" operation, so only one
815 * LEB change may be done at a time. This is ensured by @ubi->alc_mutex. 813 * LEB change may be done at a time. This is ensured by @ubi->alc_mutex.
816 */ 814 */
817int ubi_eba_atomic_leb_change(struct ubi_device *ubi, int vol_id, int lnum, 815int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
818 const void *buf, int len, int dtype) 816 int lnum, const void *buf, int len, int dtype)
819{ 817{
820 int err, pnum, tries = 0, idx = vol_id2idx(ubi, vol_id); 818 int err, pnum, tries = 0, vol_id = vol->vol_id;
821 struct ubi_volume *vol = ubi->volumes[idx];
822 struct ubi_vid_hdr *vid_hdr; 819 struct ubi_vid_hdr *vid_hdr;
823 uint32_t crc; 820 uint32_t crc;
824 821
diff --git a/drivers/mtd/ubi/gluebi.c b/drivers/mtd/ubi/gluebi.c
index 41ff74c60e14..d397219238d3 100644
--- a/drivers/mtd/ubi/gluebi.c
+++ b/drivers/mtd/ubi/gluebi.c
@@ -129,8 +129,7 @@ static int gluebi_read(struct mtd_info *mtd, loff_t from, size_t len,
129 if (to_read > total_read) 129 if (to_read > total_read)
130 to_read = total_read; 130 to_read = total_read;
131 131
132 err = ubi_eba_read_leb(ubi, vol->vol_id, lnum, buf, offs, 132 err = ubi_eba_read_leb(ubi, vol, lnum, buf, offs, to_read, 0);
133 to_read, 0);
134 if (err) 133 if (err)
135 break; 134 break;
136 135
@@ -187,8 +186,8 @@ static int gluebi_write(struct mtd_info *mtd, loff_t to, size_t len,
187 if (to_write > total_written) 186 if (to_write > total_written)
188 to_write = total_written; 187 to_write = total_written;
189 188
190 err = ubi_eba_write_leb(ubi, vol->vol_id, lnum, buf, offs, 189 err = ubi_eba_write_leb(ubi, vol, lnum, buf, offs, to_write,
191 to_write, UBI_UNKNOWN); 190 UBI_UNKNOWN);
192 if (err) 191 if (err)
193 break; 192 break;
194 193
@@ -237,7 +236,7 @@ static int gluebi_erase(struct mtd_info *mtd, struct erase_info *instr)
237 return -EROFS; 236 return -EROFS;
238 237
239 for (i = 0; i < count; i++) { 238 for (i = 0; i < count; i++) {
240 err = ubi_eba_unmap_leb(ubi, vol->vol_id, lnum + i); 239 err = ubi_eba_unmap_leb(ubi, vol, lnum + i);
241 if (err) 240 if (err)
242 goto out_err; 241 goto out_err;
243 } 242 }
diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
index 3bf2c951c2e5..c2fafe6fb2da 100644
--- a/drivers/mtd/ubi/kapi.c
+++ b/drivers/mtd/ubi/kapi.c
@@ -332,7 +332,7 @@ int ubi_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,
332 if (len == 0) 332 if (len == 0)
333 return 0; 333 return 0;
334 334
335 err = ubi_eba_read_leb(ubi, vol_id, lnum, buf, offset, len, check); 335 err = ubi_eba_read_leb(ubi, vol, lnum, buf, offset, len, check);
336 if (err && err == -EBADMSG && vol->vol_type == UBI_STATIC_VOLUME) { 336 if (err && err == -EBADMSG && vol->vol_type == UBI_STATIC_VOLUME) {
337 ubi_warn("mark volume %d as corrupted", vol_id); 337 ubi_warn("mark volume %d as corrupted", vol_id);
338 vol->corrupted = 1; 338 vol->corrupted = 1;
@@ -399,7 +399,7 @@ int ubi_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf,
399 if (len == 0) 399 if (len == 0)
400 return 0; 400 return 0;
401 401
402 return ubi_eba_write_leb(ubi, vol_id, lnum, buf, offset, len, dtype); 402 return ubi_eba_write_leb(ubi, vol, lnum, buf, offset, len, dtype);
403} 403}
404EXPORT_SYMBOL_GPL(ubi_leb_write); 404EXPORT_SYMBOL_GPL(ubi_leb_write);
405 405
@@ -448,7 +448,7 @@ int ubi_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf,
448 if (len == 0) 448 if (len == 0)
449 return 0; 449 return 0;
450 450
451 return ubi_eba_atomic_leb_change(ubi, vol_id, lnum, buf, len, dtype); 451 return ubi_eba_atomic_leb_change(ubi, vol, lnum, buf, len, dtype);
452} 452}
453EXPORT_SYMBOL_GPL(ubi_leb_change); 453EXPORT_SYMBOL_GPL(ubi_leb_change);
454 454
@@ -481,7 +481,7 @@ int ubi_leb_erase(struct ubi_volume_desc *desc, int lnum)
481 if (vol->upd_marker) 481 if (vol->upd_marker)
482 return -EBADF; 482 return -EBADF;
483 483
484 err = ubi_eba_unmap_leb(ubi, vol_id, lnum); 484 err = ubi_eba_unmap_leb(ubi, vol, lnum);
485 if (err) 485 if (err)
486 return err; 486 return err;
487 487
@@ -542,7 +542,7 @@ int ubi_leb_unmap(struct ubi_volume_desc *desc, int lnum)
542 if (vol->upd_marker) 542 if (vol->upd_marker)
543 return -EBADF; 543 return -EBADF;
544 544
545 return ubi_eba_unmap_leb(ubi, vol_id, lnum); 545 return ubi_eba_unmap_leb(ubi, vol, lnum);
546} 546}
547EXPORT_SYMBOL_GPL(ubi_leb_unmap); 547EXPORT_SYMBOL_GPL(ubi_leb_unmap);
548 548
@@ -587,7 +587,7 @@ int ubi_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype)
587 if (vol->eba_tbl[lnum] >= 0) 587 if (vol->eba_tbl[lnum] >= 0)
588 return -EBADMSG; 588 return -EBADMSG;
589 589
590 return ubi_eba_write_leb(ubi, vol_id, lnum, NULL, 0, 0, dtype); 590 return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0, dtype);
591} 591}
592EXPORT_SYMBOL_GPL(ubi_leb_map); 592EXPORT_SYMBOL_GPL(ubi_leb_map);
593 593
diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c
index 9e2338c8e2cf..93e052812012 100644
--- a/drivers/mtd/ubi/misc.c
+++ b/drivers/mtd/ubi/misc.c
@@ -79,7 +79,7 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)
79 else 79 else
80 size = vol->usable_leb_size; 80 size = vol->usable_leb_size;
81 81
82 err = ubi_eba_read_leb(ubi, vol_id, i, buf, 0, size, 1); 82 err = ubi_eba_read_leb(ubi, vol, i, buf, 0, size, 1);
83 if (err) { 83 if (err) {
84 if (err == -EBADMSG) 84 if (err == -EBADMSG)
85 err = 1; 85 err = 1;
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 23875bf6aa3b..0a3a803dd22f 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -410,8 +410,8 @@ int ubi_read_volume_table(struct ubi_device *ubi, struct ubi_scan_info *si);
410int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req); 410int ubi_create_volume(struct ubi_device *ubi, struct ubi_mkvol_req *req);
411int ubi_remove_volume(struct ubi_volume_desc *desc); 411int ubi_remove_volume(struct ubi_volume_desc *desc);
412int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs); 412int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs);
413int ubi_add_volume(struct ubi_device *ubi, int vol_id); 413int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol);
414void ubi_free_volume(struct ubi_device *ubi, int vol_id); 414void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol);
415 415
416/* upd.c */ 416/* upd.c */
417int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes); 417int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes);
@@ -435,16 +435,17 @@ void ubi_gluebi_updated(struct ubi_volume *vol);
435#endif 435#endif
436 436
437/* eba.c */ 437/* eba.c */
438int ubi_eba_unmap_leb(struct ubi_device *ubi, int vol_id, int lnum); 438int ubi_eba_unmap_leb(struct ubi_device *ubi, struct ubi_volume *vol,
439int ubi_eba_read_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf, 439 int lnum);
440 int offset, int len, int check); 440int ubi_eba_read_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
441int ubi_eba_write_leb(struct ubi_device *ubi, int vol_id, int lnum, 441 void *buf, int offset, int len, int check);
442int ubi_eba_write_leb(struct ubi_device *ubi, struct ubi_volume *vol, int lnum,
442 const void *buf, int offset, int len, int dtype); 443 const void *buf, int offset, int len, int dtype);
443int ubi_eba_write_leb_st(struct ubi_device *ubi, int vol_id, int lnum, 444int ubi_eba_write_leb_st(struct ubi_device *ubi, struct ubi_volume *vol,
444 const void *buf, int len, int dtype, 445 int lnum, const void *buf, int len, int dtype,
445 int used_ebs); 446 int used_ebs);
446int ubi_eba_atomic_leb_change(struct ubi_device *ubi, int vol_id, int lnum, 447int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
447 const void *buf, int len, int dtype); 448 int lnum, const void *buf, int len, int dtype);
448int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, 449int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
449 struct ubi_vid_hdr *vid_hdr); 450 struct ubi_vid_hdr *vid_hdr);
450int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si); 451int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si);
diff --git a/drivers/mtd/ubi/upd.c b/drivers/mtd/ubi/upd.c
index 0efc586a8328..a95dcaa4a0c2 100644
--- a/drivers/mtd/ubi/upd.c
+++ b/drivers/mtd/ubi/upd.c
@@ -136,7 +136,7 @@ int ubi_start_update(struct ubi_device *ubi, int vol_id, long long bytes)
136 136
137 /* Before updating - wipe out the volume */ 137 /* Before updating - wipe out the volume */
138 for (i = 0; i < vol->reserved_pebs; i++) { 138 for (i = 0; i < vol->reserved_pebs; i++) {
139 err = ubi_eba_unmap_leb(ubi, vol_id, i); 139 err = ubi_eba_unmap_leb(ubi, vol, i);
140 if (err) 140 if (err)
141 return err; 141 return err;
142 } 142 }
@@ -209,8 +209,7 @@ static int write_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf,
209 if (len != l) 209 if (len != l)
210 dbg_msg("skip last %d bytes (0xFF)", len - l); 210 dbg_msg("skip last %d bytes (0xFF)", len - l);
211 211
212 err = ubi_eba_write_leb(ubi, vol_id, lnum, buf, 0, l, 212 err = ubi_eba_write_leb(ubi, vol, lnum, buf, 0, l, UBI_UNKNOWN);
213 UBI_UNKNOWN);
214 } else { 213 } else {
215 /* 214 /*
216 * When writing static volume, and this is the last logical 215 * When writing static volume, and this is the last logical
@@ -222,7 +221,7 @@ static int write_leb(struct ubi_device *ubi, int vol_id, int lnum, void *buf,
222 * contain zeros, not random trash. 221 * contain zeros, not random trash.
223 */ 222 */
224 memset(buf + len, 0, vol->usable_leb_size - len); 223 memset(buf + len, 0, vol->usable_leb_size - len);
225 err = ubi_eba_write_leb_st(ubi, vol_id, lnum, buf, len, 224 err = ubi_eba_write_leb_st(ubi, vol, lnum, buf, len,
226 UBI_UNKNOWN, used_ebs); 225 UBI_UNKNOWN, used_ebs);
227 } 226 }
228 227
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
index 787ce9ec17ae..d2d12deead5c 100644
--- a/drivers/mtd/ubi/vmt.c
+++ b/drivers/mtd/ubi/vmt.c
@@ -417,7 +417,7 @@ int ubi_remove_volume(struct ubi_volume_desc *desc)
417 return err; 417 return err;
418 418
419 for (i = 0; i < vol->reserved_pebs; i++) { 419 for (i = 0; i < vol->reserved_pebs; i++) {
420 err = ubi_eba_unmap_leb(ubi, vol_id, i); 420 err = ubi_eba_unmap_leb(ubi, vol, i);
421 if (err) 421 if (err)
422 return err; 422 return err;
423 } 423 }
@@ -524,7 +524,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
524 524
525 if (pebs < 0) { 525 if (pebs < 0) {
526 for (i = 0; i < -pebs; i++) { 526 for (i = 0; i < -pebs; i++) {
527 err = ubi_eba_unmap_leb(ubi, vol_id, reserved_pebs + i); 527 err = ubi_eba_unmap_leb(ubi, vol, reserved_pebs + i);
528 if (err) 528 if (err)
529 goto out_acc; 529 goto out_acc;
530 } 530 }
@@ -573,17 +573,16 @@ out_free:
573/** 573/**
574 * ubi_add_volume - add volume. 574 * ubi_add_volume - add volume.
575 * @ubi: UBI device description object 575 * @ubi: UBI device description object
576 * @vol_id: volume ID 576 * @vol: volume description object
577 * 577 *
578 * This function adds an existin volume and initializes all its data 578 * This function adds an existin volume and initializes all its data
579 * structures. Returnes zero in case of success and a negative error code in 579 * structures. Returnes zero in case of success and a negative error code in
580 * case of failure. 580 * case of failure.
581 */ 581 */
582int ubi_add_volume(struct ubi_device *ubi, int vol_id) 582int ubi_add_volume(struct ubi_device *ubi, struct ubi_volume *vol)
583{ 583{
584 int err; 584 int err, vol_id = vol->vol_id;
585 dev_t dev; 585 dev_t dev;
586 struct ubi_volume *vol = ubi->volumes[vol_id];
587 586
588 dbg_msg("add volume %d", vol_id); 587 dbg_msg("add volume %d", vol_id);
589 ubi_dbg_dump_vol_info(vol); 588 ubi_dbg_dump_vol_info(vol);
@@ -634,22 +633,21 @@ out_cdev:
634/** 633/**
635 * ubi_free_volume - free volume. 634 * ubi_free_volume - free volume.
636 * @ubi: UBI device description object 635 * @ubi: UBI device description object
637 * @vol_id: volume ID 636 * @vol: volume description object
638 * 637 *
639 * This function frees all resources for volume @vol_id but does not remove it. 638 * This function frees all resources for volume @vol but does not remove it.
640 * Used only when the UBI device is detached. 639 * Used only when the UBI device is detached.
641 */ 640 */
642void ubi_free_volume(struct ubi_device *ubi, int vol_id) 641void ubi_free_volume(struct ubi_device *ubi, struct ubi_volume *vol)
643{ 642{
644 int err; 643 int err;
645 struct ubi_volume *vol = ubi->volumes[vol_id];
646 644
647 dbg_msg("free volume %d", vol_id); 645 dbg_msg("free volume %d", vol->vol_id);
648 ubi_assert(vol); 646 ubi_assert(vol);
649 647
650 vol->removed = 1; 648 vol->removed = 1;
651 err = ubi_destroy_gluebi(vol); 649 err = ubi_destroy_gluebi(vol);
652 ubi->volumes[vol_id] = NULL; 650 ubi->volumes[vol->vol_id] = NULL;
653 cdev_del(&vol->cdev); 651 cdev_del(&vol->cdev);
654 volume_sysfs_close(vol); 652 volume_sysfs_close(vol);
655} 653}
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c
index 25b3bd61c7ec..3349c281bf9e 100644
--- a/drivers/mtd/ubi/vtbl.c
+++ b/drivers/mtd/ubi/vtbl.c
@@ -86,8 +86,10 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
86{ 86{
87 int i, err; 87 int i, err;
88 uint32_t crc; 88 uint32_t crc;
89 struct ubi_volume *layout_vol;
89 90
90 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots); 91 ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
92 layout_vol = ubi->volumes[vol_id2idx(UBI_LAYOUT_VOL_ID)];
91 93
92 if (!vtbl_rec) 94 if (!vtbl_rec)
93 vtbl_rec = &empty_vtbl_record; 95 vtbl_rec = &empty_vtbl_record;
@@ -99,12 +101,12 @@ int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
99 mutex_lock(&ubi->vtbl_mutex); 101 mutex_lock(&ubi->vtbl_mutex);
100 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record)); 102 memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
101 for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) { 103 for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
102 err = ubi_eba_unmap_leb(ubi, UBI_LAYOUT_VOL_ID, i); 104 err = ubi_eba_unmap_leb(ubi, layout_vol, i);
103 if (err) { 105 if (err) {
104 mutex_unlock(&ubi->vtbl_mutex); 106 mutex_unlock(&ubi->vtbl_mutex);
105 return err; 107 return err;
106 } 108 }
107 err = ubi_eba_write_leb(ubi, UBI_LAYOUT_VOL_ID, i, ubi->vtbl, 0, 109 err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
108 ubi->vtbl_size, UBI_LONGTERM); 110 ubi->vtbl_size, UBI_LONGTERM);
109 if (err) { 111 if (err) {
110 mutex_unlock(&ubi->vtbl_mutex); 112 mutex_unlock(&ubi->vtbl_mutex);