diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-23 18:53:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-23 18:53:06 -0400 |
commit | ce447f34a7696268d1c7a7c44a0d5ef7a8176491 (patch) | |
tree | 25443ab1d0283fbf588f6a9a27fe8ebd67c6bddd /drivers/mtd | |
parent | 93912fe69d67597ee4c0b451d24539ead550bdc3 (diff) | |
parent | 87e773c95eb0b363f2efcc7aff8a347dc18925d0 (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/Kconfig | 2 | ||||
-rw-r--r-- | drivers/mtd/ubi/cdev.c | 2 | ||||
-rw-r--r-- | drivers/mtd/ubi/misc.c | 25 | ||||
-rw-r--r-- | drivers/mtd/ubi/ubi.h | 1 | ||||
-rw-r--r-- | drivers/mtd/ubi/vmt.c | 20 |
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 | ||
30 | config MTD_UBI_BEB_RESERVE | 30 | config 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 | */ | ||
103 | void 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, | |||
647 | int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf, | 647 | int ubi_calc_data_len(const struct ubi_device *ubi, const void *buf, |
648 | int length); | 648 | int length); |
649 | int ubi_check_volume(struct ubi_device *ubi, int vol_id); | 649 | int ubi_check_volume(struct ubi_device *ubi, int vol_id); |
650 | void ubi_update_reserved(struct ubi_device *ubi); | ||
650 | void ubi_calculate_reserved(struct ubi_device *ubi); | 651 | void ubi_calculate_reserved(struct ubi_device *ubi); |
651 | int ubi_check_pattern(const void *buf, uint8_t patt, int size); | 652 | int 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); |