ubi: Introduce in_pq()
authorRichard Weinberger <richard@nod.at>
Wed, 7 Nov 2018 22:16:18 +0000 (23:16 +0100)
committerRichard Weinberger <richard@nod.at>
Sun, 24 Feb 2019 10:13:44 +0000 (11:13 +0100)
This function works like in_wl_tree() but checks whether an ubi_wl_entry
is currently in the protection queue.
We need this function to query the current state of an ubi_wl_entry.

Signed-off-by: Richard Weinberger <richard@nod.at>
drivers/mtd/ubi/wl.c

index 6f2ac86..ca1b313 100644 (file)
@@ -277,6 +277,27 @@ static int in_wl_tree(struct ubi_wl_entry *e, struct rb_root *root)
        return 0;
 }
 
+/**
+ * in_pq - check if a wear-leveling entry is present in the protection queue.
+ * @ubi: UBI device description object
+ * @e: the wear-leveling entry to check
+ *
+ * This function returns non-zero if @e is in the protection queue and zero
+ * if it is not.
+ */
+static inline int in_pq(const struct ubi_device *ubi, struct ubi_wl_entry *e)
+{
+       struct ubi_wl_entry *p;
+       int i;
+
+       for (i = 0; i < UBI_PROT_QUEUE_LEN; ++i)
+               list_for_each_entry(p, &ubi->pq[i], u.list)
+                       if (p == e)
+                               return 1;
+
+       return 0;
+}
+
 /**
  * prot_queue_add - add physical eraseblock to the protection queue.
  * @ubi: UBI device description object
@@ -1848,16 +1869,11 @@ static int self_check_in_wl_tree(const struct ubi_device *ubi,
 static int self_check_in_pq(const struct ubi_device *ubi,
                            struct ubi_wl_entry *e)
 {
-       struct ubi_wl_entry *p;
-       int i;
-
        if (!ubi_dbg_chk_gen(ubi))
                return 0;
 
-       for (i = 0; i < UBI_PROT_QUEUE_LEN; ++i)
-               list_for_each_entry(p, &ubi->pq[i], u.list)
-                       if (p == e)
-                               return 0;
+       if (in_pq(ubi, e))
+               return 0;
 
        ubi_err(ubi, "self-check failed for PEB %d, EC %d, Protect queue",
                e->pnum, e->ec);