]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dm btree: add dm_btree_find_lowest_key
authorJoe Thornber <ejt@redhat.com>
Fri, 20 Dec 2013 15:41:11 +0000 (15:41 +0000)
committerMike Snitzer <snitzer@redhat.com>
Thu, 9 Jan 2014 21:29:17 +0000 (16:29 -0500)
dm_btree_find_lowest_key is the reciprocal of dm_btree_find_highest_key.
Factor out common code for dm_btree_find_{highest,lowest}_key.

dm_btree_find_lowest_key is needed for an upcoming DM target, as such it
is best to get this interface in place.

Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/persistent-data/dm-btree.c
drivers/md/persistent-data/dm-btree.h

index 468e371ee9b22d036fc6e5cca36ca0f46acb4f6a..416060c2570981d5035376fc02b100f3b6430e5b 100644 (file)
@@ -770,8 +770,8 @@ EXPORT_SYMBOL_GPL(dm_btree_insert_notify);
 
 /*----------------------------------------------------------------*/
 
-static int find_highest_key(struct ro_spine *s, dm_block_t block,
-                           uint64_t *result_key, dm_block_t *next_block)
+static int find_key(struct ro_spine *s, dm_block_t block, bool find_highest,
+                   uint64_t *result_key, dm_block_t *next_block)
 {
        int i, r;
        uint32_t flags;
@@ -788,7 +788,11 @@ static int find_highest_key(struct ro_spine *s, dm_block_t block,
                else
                        i--;
 
-               *result_key = le64_to_cpu(ro_node(s)->keys[i]);
+               if (find_highest)
+                       *result_key = le64_to_cpu(ro_node(s)->keys[i]);
+               else
+                       *result_key = le64_to_cpu(ro_node(s)->keys[0]);
+
                if (next_block || flags & INTERNAL_NODE)
                        block = value64(ro_node(s), i);
 
@@ -799,16 +803,16 @@ static int find_highest_key(struct ro_spine *s, dm_block_t block,
        return 0;
 }
 
-int dm_btree_find_highest_key(struct dm_btree_info *info, dm_block_t root,
-                             uint64_t *result_keys)
+static int dm_btree_find_key(struct dm_btree_info *info, dm_block_t root,
+                            bool find_highest, uint64_t *result_keys)
 {
        int r = 0, count = 0, level;
        struct ro_spine spine;
 
        init_ro_spine(&spine, info);
        for (level = 0; level < info->levels; level++) {
-               r = find_highest_key(&spine, root, result_keys + level,
-                                    level == info->levels - 1 ? NULL : &root);
+               r = find_key(&spine, root, find_highest, result_keys + level,
+                            level == info->levels - 1 ? NULL : &root);
                if (r == -ENODATA) {
                        r = 0;
                        break;
@@ -822,8 +826,23 @@ int dm_btree_find_highest_key(struct dm_btree_info *info, dm_block_t root,
 
        return r ? r : count;
 }
+
+int dm_btree_find_highest_key(struct dm_btree_info *info, dm_block_t root,
+                             uint64_t *result_keys)
+{
+       return dm_btree_find_key(info, root, true, result_keys);
+}
 EXPORT_SYMBOL_GPL(dm_btree_find_highest_key);
 
+int dm_btree_find_lowest_key(struct dm_btree_info *info, dm_block_t root,
+                            uint64_t *result_keys)
+{
+       return dm_btree_find_key(info, root, false, result_keys);
+}
+EXPORT_SYMBOL_GPL(dm_btree_find_lowest_key);
+
+/*----------------------------------------------------------------*/
+
 /*
  * FIXME: We shouldn't use a recursive algorithm when we have limited stack
  * space.  Also this only works for single level trees.
index 8672d159e0b5e3fc01641f7524ae3c61df04ed1c..dacfc34180b4373ce1abbe8fd5f97cc91391a2d1 100644 (file)
@@ -134,6 +134,14 @@ int dm_btree_insert_notify(struct dm_btree_info *info, dm_block_t root,
 int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,
                    uint64_t *keys, dm_block_t *new_root);
 
+/*
+ * Returns < 0 on failure.  Otherwise the number of key entries that have
+ * been filled out.  Remember trees can have zero entries, and as such have
+ * no lowest key.
+ */
+int dm_btree_find_lowest_key(struct dm_btree_info *info, dm_block_t root,
+                            uint64_t *result_keys);
+
 /*
  * Returns < 0 on failure.  Otherwise the number of key entries that have
  * been filled out.  Remember trees can have zero entries, and as such have