aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorShmulik Ladkani <shmulik.ladkani@gmail.com>2012-07-04 04:06:04 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@linux.intel.com>2012-07-18 07:30:34 -0400
commit87e773c95eb0b363f2efcc7aff8a347dc18925d0 (patch)
tree76e802802a29567559f4d12d9c4d0ac8cdd63cfb /drivers/mtd
parent5c669a5bd8c0f0567127128990d01f9ae320a9ef (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.c23
-rw-r--r--drivers/mtd/ubi/ubi.h1
-rw-r--r--drivers/mtd/ubi/vmt.c20
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 */
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/**
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,
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 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);