diff options
author | Shmulik Ladkani <shmulik.ladkani@gmail.com> | 2012-07-04 04:06:04 -0400 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com> | 2012-07-18 07:30:34 -0400 |
commit | 87e773c95eb0b363f2efcc7aff8a347dc18925d0 (patch) | |
tree | 76e802802a29567559f4d12d9c4d0ac8cdd63cfb /drivers/mtd | |
parent | 5c669a5bd8c0f0567127128990d01f9ae320a9ef (diff) |
UBI: harmonize the update of ubi->beb_rsvd_pebs
Currently, there are several locations where an attempt to reserve more
PEBs for bad PEB handling is made, with the same code being duplicated.
Harmonize it by introducing 'ubi_update_reserved()'.
Also, improve the debug message issued, making it more descriptive.
Artem: amended the patch a little.
Signed-off-by: Shmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Diffstat (limited to 'drivers/mtd')
-rw-r--r-- | drivers/mtd/ubi/misc.c | 23 | ||||
-rw-r--r-- | drivers/mtd/ubi/ubi.h | 1 | ||||
-rw-r--r-- | drivers/mtd/ubi/vmt.c | 20 |
3 files changed, 26 insertions, 18 deletions
diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c index b57134d1bde..8bbfb444b89 100644 --- a/drivers/mtd/ubi/misc.c +++ b/drivers/mtd/ubi/misc.c | |||
@@ -92,6 +92,29 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id) | |||
92 | } | 92 | } |
93 | 93 | ||
94 | /** | 94 | /** |
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 | /** | ||
95 | * ubi_calculate_reserved - calculate how many PEBs must be reserved for bad | 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 |
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h index a1a81c9ea8c..84f66e3fa05 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 0669cff8ac3..9169e58c262 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); |