|
@@ -1,4 +1,5 @@
|
|
|
/*
|
|
|
+ * @ubi: UBI device description object
|
|
|
* Copyright (c) International Business Machines Corp., 2006
|
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -163,12 +164,14 @@ struct ubi_work {
|
|
|
|
|
|
#ifdef CONFIG_MTD_UBI_DEBUG
|
|
|
static int paranoid_check_ec(struct ubi_device *ubi, int pnum, int ec);
|
|
|
-static int paranoid_check_in_wl_tree(struct ubi_wl_entry *e,
|
|
|
+static int paranoid_check_in_wl_tree(const struct ubi_device *ubi,
|
|
|
+ struct ubi_wl_entry *e,
|
|
|
struct rb_root *root);
|
|
|
-static int paranoid_check_in_pq(struct ubi_device *ubi, struct ubi_wl_entry *e);
|
|
|
+static int paranoid_check_in_pq(const struct ubi_device *ubi,
|
|
|
+ struct ubi_wl_entry *e);
|
|
|
#else
|
|
|
#define paranoid_check_ec(ubi, pnum, ec) 0
|
|
|
-#define paranoid_check_in_wl_tree(e, root)
|
|
|
+#define paranoid_check_in_wl_tree(ubi, e, root)
|
|
|
#define paranoid_check_in_pq(ubi, e) 0
|
|
|
#endif
|
|
|
|
|
@@ -449,7 +452,7 @@ retry:
|
|
|
BUG();
|
|
|
}
|
|
|
|
|
|
- paranoid_check_in_wl_tree(e, &ubi->free);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e, &ubi->free);
|
|
|
|
|
|
/*
|
|
|
* Move the physical eraseblock to the protection queue where it will
|
|
@@ -712,7 +715,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
|
|
|
e1->ec, e2->ec);
|
|
|
goto out_cancel;
|
|
|
}
|
|
|
- paranoid_check_in_wl_tree(e1, &ubi->used);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e1, &ubi->used);
|
|
|
rb_erase(&e1->u.rb, &ubi->used);
|
|
|
dbg_wl("move PEB %d EC %d to PEB %d EC %d",
|
|
|
e1->pnum, e1->ec, e2->pnum, e2->ec);
|
|
@@ -721,12 +724,12 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
|
|
|
scrubbing = 1;
|
|
|
e1 = rb_entry(rb_first(&ubi->scrub), struct ubi_wl_entry, u.rb);
|
|
|
e2 = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF);
|
|
|
- paranoid_check_in_wl_tree(e1, &ubi->scrub);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e1, &ubi->scrub);
|
|
|
rb_erase(&e1->u.rb, &ubi->scrub);
|
|
|
dbg_wl("scrub PEB %d to PEB %d", e1->pnum, e2->pnum);
|
|
|
}
|
|
|
|
|
|
- paranoid_check_in_wl_tree(e2, &ubi->free);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e2, &ubi->free);
|
|
|
rb_erase(&e2->u.rb, &ubi->free);
|
|
|
ubi->move_from = e1;
|
|
|
ubi->move_to = e2;
|
|
@@ -1169,13 +1172,13 @@ retry:
|
|
|
return 0;
|
|
|
} else {
|
|
|
if (in_wl_tree(e, &ubi->used)) {
|
|
|
- paranoid_check_in_wl_tree(e, &ubi->used);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e, &ubi->used);
|
|
|
rb_erase(&e->u.rb, &ubi->used);
|
|
|
} else if (in_wl_tree(e, &ubi->scrub)) {
|
|
|
- paranoid_check_in_wl_tree(e, &ubi->scrub);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e, &ubi->scrub);
|
|
|
rb_erase(&e->u.rb, &ubi->scrub);
|
|
|
} else if (in_wl_tree(e, &ubi->erroneous)) {
|
|
|
- paranoid_check_in_wl_tree(e, &ubi->erroneous);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e, &ubi->erroneous);
|
|
|
rb_erase(&e->u.rb, &ubi->erroneous);
|
|
|
ubi->erroneous_peb_count -= 1;
|
|
|
ubi_assert(ubi->erroneous_peb_count >= 0);
|
|
@@ -1242,7 +1245,7 @@ retry:
|
|
|
}
|
|
|
|
|
|
if (in_wl_tree(e, &ubi->used)) {
|
|
|
- paranoid_check_in_wl_tree(e, &ubi->used);
|
|
|
+ paranoid_check_in_wl_tree(ubi, e, &ubi->used);
|
|
|
rb_erase(&e->u.rb, &ubi->used);
|
|
|
} else {
|
|
|
int err;
|
|
@@ -1609,13 +1612,15 @@ out_free:
|
|
|
|
|
|
/**
|
|
|
* paranoid_check_in_wl_tree - check that wear-leveling entry is in WL RB-tree.
|
|
|
+ * @ubi: UBI device description object
|
|
|
* @e: the wear-leveling entry to check
|
|
|
* @root: the root of the tree
|
|
|
*
|
|
|
* This function returns zero if @e is in the @root RB-tree and %-EINVAL if it
|
|
|
* is not.
|
|
|
*/
|
|
|
-static int paranoid_check_in_wl_tree(struct ubi_wl_entry *e,
|
|
|
+static int paranoid_check_in_wl_tree(const struct ubi_device *ubi,
|
|
|
+ struct ubi_wl_entry *e,
|
|
|
struct rb_root *root)
|
|
|
{
|
|
|
if (!(ubi_chk_flags & UBI_CHK_GEN))
|
|
@@ -1638,7 +1643,8 @@ static int paranoid_check_in_wl_tree(struct ubi_wl_entry *e,
|
|
|
*
|
|
|
* This function returns zero if @e is in @ubi->pq and %-EINVAL if it is not.
|
|
|
*/
|
|
|
-static int paranoid_check_in_pq(struct ubi_device *ubi, struct ubi_wl_entry *e)
|
|
|
+static int paranoid_check_in_pq(const struct ubi_device *ubi,
|
|
|
+ struct ubi_wl_entry *e)
|
|
|
{
|
|
|
struct ubi_wl_entry *p;
|
|
|
int i;
|