summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorJoe Thornber <ejt@redhat.com>2016-10-05 10:40:39 -0400
committerMike Snitzer <snitzer@redhat.com>2017-02-16 13:12:50 -0500
commit9b696229aa7de356675a938c6c8a70b46085ed66 (patch)
tree19ab9da696f91ed4987a091854d8a8cd8dd6a5bb /drivers/md
parent683bb1a3742bb0c8768711aa5ff1034d92e447f2 (diff)
dm persistent data: add cursor skip functions to the cursor APIs
Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/persistent-data/dm-array.c21
-rw-r--r--drivers/md/persistent-data/dm-array.h1
-rw-r--r--drivers/md/persistent-data/dm-bitset.c35
-rw-r--r--drivers/md/persistent-data/dm-bitset.h1
-rw-r--r--drivers/md/persistent-data/dm-btree.c11
-rw-r--r--drivers/md/persistent-data/dm-btree.h1
6 files changed, 70 insertions, 0 deletions
diff --git a/drivers/md/persistent-data/dm-array.c b/drivers/md/persistent-data/dm-array.c
index 7938cd21fa4c..185dc60360b5 100644
--- a/drivers/md/persistent-data/dm-array.c
+++ b/drivers/md/persistent-data/dm-array.c
@@ -976,6 +976,27 @@ int dm_array_cursor_next(struct dm_array_cursor *c)
976} 976}
977EXPORT_SYMBOL_GPL(dm_array_cursor_next); 977EXPORT_SYMBOL_GPL(dm_array_cursor_next);
978 978
979int dm_array_cursor_skip(struct dm_array_cursor *c, uint32_t count)
980{
981 int r;
982
983 do {
984 uint32_t remaining = le32_to_cpu(c->ab->nr_entries) - c->index;
985
986 if (count < remaining) {
987 c->index += count;
988 return 0;
989 }
990
991 count -= remaining;
992 r = dm_array_cursor_next(c);
993
994 } while (!r);
995
996 return r;
997}
998EXPORT_SYMBOL_GPL(dm_array_cursor_skip);
999
979void dm_array_cursor_get_value(struct dm_array_cursor *c, void **value_le) 1000void dm_array_cursor_get_value(struct dm_array_cursor *c, void **value_le)
980{ 1001{
981 *value_le = element_at(c->info, c->ab, c->index); 1002 *value_le = element_at(c->info, c->ab, c->index);
diff --git a/drivers/md/persistent-data/dm-array.h b/drivers/md/persistent-data/dm-array.h
index 27ee49a55473..d7d2d579c662 100644
--- a/drivers/md/persistent-data/dm-array.h
+++ b/drivers/md/persistent-data/dm-array.h
@@ -207,6 +207,7 @@ void dm_array_cursor_end(struct dm_array_cursor *c);
207 207
208uint32_t dm_array_cursor_index(struct dm_array_cursor *c); 208uint32_t dm_array_cursor_index(struct dm_array_cursor *c);
209int dm_array_cursor_next(struct dm_array_cursor *c); 209int dm_array_cursor_next(struct dm_array_cursor *c);
210int dm_array_cursor_skip(struct dm_array_cursor *c, uint32_t count);
210 211
211/* 212/*
212 * value_le is only valid while the cursor points at the current value. 213 * value_le is only valid while the cursor points at the current value.
diff --git a/drivers/md/persistent-data/dm-bitset.c b/drivers/md/persistent-data/dm-bitset.c
index fbf8d9bc4d15..b7208d82e748 100644
--- a/drivers/md/persistent-data/dm-bitset.c
+++ b/drivers/md/persistent-data/dm-bitset.c
@@ -273,6 +273,41 @@ int dm_bitset_cursor_next(struct dm_bitset_cursor *c)
273} 273}
274EXPORT_SYMBOL_GPL(dm_bitset_cursor_next); 274EXPORT_SYMBOL_GPL(dm_bitset_cursor_next);
275 275
276int dm_bitset_cursor_skip(struct dm_bitset_cursor *c, uint32_t count)
277{
278 int r;
279 __le64 *value;
280 uint32_t nr_array_skip;
281 uint32_t remaining_in_word = 64 - c->bit_index;
282
283 if (c->entries_remaining < count)
284 return -ENODATA;
285
286 if (count < remaining_in_word) {
287 c->bit_index += count;
288 c->entries_remaining -= count;
289 return 0;
290
291 } else {
292 c->entries_remaining -= remaining_in_word;
293 count -= remaining_in_word;
294 }
295
296 nr_array_skip = (count / 64) + 1;
297 r = dm_array_cursor_skip(&c->cursor, nr_array_skip);
298 if (r)
299 return r;
300
301 dm_array_cursor_get_value(&c->cursor, (void **) &value);
302 c->entries_remaining -= count;
303 c->array_index += nr_array_skip;
304 c->bit_index = count & 63;
305 c->current_bits = le64_to_cpu(*value);
306
307 return 0;
308}
309EXPORT_SYMBOL_GPL(dm_bitset_cursor_skip);
310
276bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c) 311bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c)
277{ 312{
278 return test_bit(c->bit_index, (unsigned long *) &c->current_bits); 313 return test_bit(c->bit_index, (unsigned long *) &c->current_bits);
diff --git a/drivers/md/persistent-data/dm-bitset.h b/drivers/md/persistent-data/dm-bitset.h
index a08636898a43..df888da04ee1 100644
--- a/drivers/md/persistent-data/dm-bitset.h
+++ b/drivers/md/persistent-data/dm-bitset.h
@@ -197,6 +197,7 @@ int dm_bitset_cursor_begin(struct dm_disk_bitset *info,
197void dm_bitset_cursor_end(struct dm_bitset_cursor *c); 197void dm_bitset_cursor_end(struct dm_bitset_cursor *c);
198 198
199int dm_bitset_cursor_next(struct dm_bitset_cursor *c); 199int dm_bitset_cursor_next(struct dm_bitset_cursor *c);
200int dm_bitset_cursor_skip(struct dm_bitset_cursor *c, uint32_t count);
200bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c); 201bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c);
201 202
202/*----------------------------------------------------------------*/ 203/*----------------------------------------------------------------*/
diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c
index 1744f3618a55..02e2ee0d8a00 100644
--- a/drivers/md/persistent-data/dm-btree.c
+++ b/drivers/md/persistent-data/dm-btree.c
@@ -1144,6 +1144,17 @@ int dm_btree_cursor_next(struct dm_btree_cursor *c)
1144} 1144}
1145EXPORT_SYMBOL_GPL(dm_btree_cursor_next); 1145EXPORT_SYMBOL_GPL(dm_btree_cursor_next);
1146 1146
1147int dm_btree_cursor_skip(struct dm_btree_cursor *c, uint32_t count)
1148{
1149 int r = 0;
1150
1151 while (count-- && !r)
1152 r = dm_btree_cursor_next(c);
1153
1154 return r;
1155}
1156EXPORT_SYMBOL_GPL(dm_btree_cursor_skip);
1157
1147int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le) 1158int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le)
1148{ 1159{
1149 if (c->depth) { 1160 if (c->depth) {
diff --git a/drivers/md/persistent-data/dm-btree.h b/drivers/md/persistent-data/dm-btree.h
index db9bd26adf31..3dc5bb1a4748 100644
--- a/drivers/md/persistent-data/dm-btree.h
+++ b/drivers/md/persistent-data/dm-btree.h
@@ -209,6 +209,7 @@ int dm_btree_cursor_begin(struct dm_btree_info *info, dm_block_t root,
209 bool prefetch_leaves, struct dm_btree_cursor *c); 209 bool prefetch_leaves, struct dm_btree_cursor *c);
210void dm_btree_cursor_end(struct dm_btree_cursor *c); 210void dm_btree_cursor_end(struct dm_btree_cursor *c);
211int dm_btree_cursor_next(struct dm_btree_cursor *c); 211int dm_btree_cursor_next(struct dm_btree_cursor *c);
212int dm_btree_cursor_skip(struct dm_btree_cursor *c, uint32_t count);
212int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le); 213int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le);
213 214
214#endif /* _LINUX_DM_BTREE_H */ 215#endif /* _LINUX_DM_BTREE_H */