aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-04 14:36:12 -0500
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-26 12:15:14 -0500
commit94780d4de2e9339ab93df63420db70f11882634d (patch)
tree39c83f8c66ca2529d5e30560818ef85e97992c76 /drivers/mtd/ubi
parent2362a53ec59f286495307e0e0d8ef2401e8c5c49 (diff)
UBI: bugfix: allocate mandatory EBs first
First allocate the necessary eraseblocks, then the optional ones. Otherwise it allocates all PEBs for bad EB handling, and fails on then following EBA LEB allocation. Reported-by: Adrian Hunter <ext-adrian.hunter@nokia.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd/ubi')
-rw-r--r--drivers/mtd/ubi/eba.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
index 880fa3690352..85f50c83cf42 100644
--- a/drivers/mtd/ubi/eba.c
+++ b/drivers/mtd/ubi/eba.c
@@ -1168,6 +1168,15 @@ int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si)
1168 } 1168 }
1169 } 1169 }
1170 1170
1171 if (ubi->avail_pebs < EBA_RESERVED_PEBS) {
1172 ubi_err("no enough physical eraseblocks (%d, need %d)",
1173 ubi->avail_pebs, EBA_RESERVED_PEBS);
1174 err = -ENOSPC;
1175 goto out_free;
1176 }
1177 ubi->avail_pebs -= EBA_RESERVED_PEBS;
1178 ubi->rsvd_pebs += EBA_RESERVED_PEBS;
1179
1171 if (ubi->bad_allowed) { 1180 if (ubi->bad_allowed) {
1172 ubi_calculate_reserved(ubi); 1181 ubi_calculate_reserved(ubi);
1173 1182
@@ -1184,15 +1193,6 @@ int ubi_eba_init_scan(struct ubi_device *ubi, struct ubi_scan_info *si)
1184 ubi->rsvd_pebs += ubi->beb_rsvd_pebs; 1193 ubi->rsvd_pebs += ubi->beb_rsvd_pebs;
1185 } 1194 }
1186 1195
1187 if (ubi->avail_pebs < EBA_RESERVED_PEBS) {
1188 ubi_err("no enough physical eraseblocks (%d, need %d)",
1189 ubi->avail_pebs, EBA_RESERVED_PEBS);
1190 err = -ENOSPC;
1191 goto out_free;
1192 }
1193 ubi->avail_pebs -= EBA_RESERVED_PEBS;
1194 ubi->rsvd_pebs += EBA_RESERVED_PEBS;
1195
1196 dbg_eba("EBA unit is initialized"); 1196 dbg_eba("EBA unit is initialized");
1197 return 0; 1197 return 0;
1198 1198