aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-23 18:53:06 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-23 18:53:06 -0400
commitce447f34a7696268d1c7a7c44a0d5ef7a8176491 (patch)
tree25443ab1d0283fbf588f6a9a27fe8ebd67c6bddd /drivers/mtd
parent93912fe69d67597ee4c0b451d24539ead550bdc3 (diff)
parent87e773c95eb0b363f2efcc7aff8a347dc18925d0 (diff)
Merge tag 'upstream-3.6-rc1' of git://git.infradead.org/linux-ubi
Pull UBI changes from Artem Bityutskiy: "Change the default amount of eraseblocks which UBI reserves for bad block handling from 1% to 2%, because 1% does not meet most modern flash requirements. 1% was good enough in the past for old high-quality SLCs, but nowadays 2% is much more appropriate.: Other changes are clean-ups. * tag 'upstream-3.6-rc1' of git://git.infradead.org/linux-ubi: UBI: harmonize the update of ubi->beb_rsvd_pebs UBI: trivial: fix comment of ubi_calculate_reserved function UBI: fix spelling of detach in debug output UBI: Change the default percentage of reserved PEB
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/ubi/Kconfig2
-rw-r--r--drivers/mtd/ubi/cdev.c2
-rw-r--r--drivers/mtd/ubi/misc.c25
-rw-r--r--drivers/mtd/ubi/ubi.h1
-rw-r--r--drivers/mtd/ubi/vmt.c20
5 files changed, 29 insertions, 21 deletions
diff --git a/drivers/mtd/ubi/Kconfig b/drivers/mtd/ubi/Kconfig
index 738ee8dc16cd..ea4b95b5451c 100644
--- a/drivers/mtd/ubi/Kconfig
+++ b/drivers/mtd/ubi/Kconfig
@@ -29,7 +29,7 @@ config MTD_UBI_WL_THRESHOLD
29 29
30config MTD_UBI_BEB_RESERVE 30config MTD_UBI_BEB_RESERVE
31 int "Percentage of reserved eraseblocks for bad eraseblocks handling" 31 int "Percentage of reserved eraseblocks for bad eraseblocks handling"
32 default 1 32 default 2
33 range 0 25 33 range 0 25
34 help 34 help
35 If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI 35 If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI
diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
index acec85deb6af..fb5567878181 100644
--- a/drivers/mtd/ubi/cdev.c
+++ b/drivers/mtd/ubi/cdev.c
@@ -1026,7 +1026,7 @@ static long ctrl_cdev_ioctl(struct file *file, unsigned int cmd,
1026 { 1026 {
1027 int ubi_num; 1027 int ubi_num;
1028 1028
1029 dbg_gen("dettach MTD device"); 1029 dbg_gen("detach MTD device");
1030 err = get_user(ubi_num, (__user int32_t *)argp); 1030 err = get_user(ubi_num, (__user int32_t *)argp);
1031 if (err) { 1031 if (err) {
1032 err = -EFAULT; 1032 err = -EFAULT;
diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c
index f6a7d7ac4b98..8bbfb444b895 100644
--- a/drivers/mtd/ubi/misc.c
+++ b/drivers/mtd/ubi/misc.c
@@ -92,7 +92,30 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)
92} 92}
93 93
94/** 94/**
95 * ubi_calculate_rsvd_pool - calculate how many PEBs must be reserved for bad 95 * ubi_update_reserved - update bad eraseblock handling accounting data.
96 * @ubi: UBI device description object
97 *
98 * This function calculates the gap between current number of PEBs reserved for
99 * bad eraseblock handling and the required level of PEBs that must be
100 * reserved, and if necessary, reserves more PEBs to fill that gap, according
101 * to availability. Should be called with ubi->volumes_lock held.
102 */
103void ubi_update_reserved(struct ubi_device *ubi)
104{
105 int need = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs;
106
107 if (need <= 0 || ubi->avail_pebs == 0)
108 return;
109
110 need = min_t(int, need, ubi->avail_pebs);
111 ubi->avail_pebs -= need;
112 ubi->rsvd_pebs += need;
113 ubi->beb_rsvd_pebs += need;
114 ubi_msg("reserved more %d PEBs for bad PEB handling", need);
115}
116
117/**
118 * ubi_calculate_reserved - calculate how many PEBs must be reserved for bad
96 * eraseblock handling. 119 * eraseblock handling.
97 * @ubi: UBI device description object 120 * @ubi: UBI device description object
98 */ 121 */
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index a1a81c9ea8ce..84f66e3fa05d 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -647,6 +647,7 @@ int ubi_more_leb_change_data(struct ubi_device *ubi, struct ubi_volume *vol,
647int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf, 647int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf,
648 int length); 648 int length);
649int ubi_check_volume(struct ubi_device *ubi, int vol_id); 649int ubi_check_volume(struct ubi_device *ubi, int vol_id);
650void ubi_update_reserved(struct ubi_device *ubi);
650void ubi_calculate_reserved(struct ubi_device *ubi); 651void ubi_calculate_reserved(struct ubi_device *ubi);
651int ubi_check_pattern(const void *buf, uint8_t patt, int size); 652int ubi_check_pattern(const void *buf, uint8_t patt, int size);
652 653
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c
index 0669cff8ac3c..9169e58c262e 100644
--- a/drivers/mtd/ubi/vmt.c
+++ b/drivers/mtd/ubi/vmt.c
@@ -443,15 +443,7 @@ int ubi_remove_volume(struct ubi_volume_desc *desc, int no_vtbl)
443 spin_lock(&ubi->volumes_lock); 443 spin_lock(&ubi->volumes_lock);
444 ubi->rsvd_pebs -= reserved_pebs; 444 ubi->rsvd_pebs -= reserved_pebs;
445 ubi->avail_pebs += reserved_pebs; 445 ubi->avail_pebs += reserved_pebs;
446 i = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; 446 ubi_update_reserved(ubi);
447 if (i > 0) {
448 i = ubi->avail_pebs >= i ? i : ubi->avail_pebs;
449 ubi->avail_pebs -= i;
450 ubi->rsvd_pebs += i;
451 ubi->beb_rsvd_pebs += i;
452 if (i > 0)
453 ubi_msg("reserve more %d PEBs", i);
454 }
455 ubi->vol_count -= 1; 447 ubi->vol_count -= 1;
456 spin_unlock(&ubi->volumes_lock); 448 spin_unlock(&ubi->volumes_lock);
457 449
@@ -558,15 +550,7 @@ int ubi_resize_volume(struct ubi_volume_desc *desc, int reserved_pebs)
558 spin_lock(&ubi->volumes_lock); 550 spin_lock(&ubi->volumes_lock);
559 ubi->rsvd_pebs += pebs; 551 ubi->rsvd_pebs += pebs;
560 ubi->avail_pebs -= pebs; 552 ubi->avail_pebs -= pebs;
561 pebs = ubi->beb_rsvd_level - ubi->beb_rsvd_pebs; 553 ubi_update_reserved(ubi);
562 if (pebs > 0) {
563 pebs = ubi->avail_pebs >= pebs ? pebs : ubi->avail_pebs;
564 ubi->avail_pebs -= pebs;
565 ubi->rsvd_pebs += pebs;
566 ubi->beb_rsvd_pebs += pebs;
567 if (pebs > 0)
568 ubi_msg("reserve more %d PEBs", pebs);
569 }
570 for (i = 0; i < reserved_pebs; i++) 554 for (i = 0; i < reserved_pebs; i++)
571 new_mapping[i] = vol->eba_tbl[i]; 555 new_mapping[i] = vol->eba_tbl[i];
572 kfree(vol->eba_tbl); 556 kfree(vol->eba_tbl);