diff options
author | Joe Thornber <ejt@redhat.com> | 2016-10-05 10:40:39 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-02-16 13:12:50 -0500 |
commit | 9b696229aa7de356675a938c6c8a70b46085ed66 (patch) | |
tree | 19ab9da696f91ed4987a091854d8a8cd8dd6a5bb /drivers/md | |
parent | 683bb1a3742bb0c8768711aa5ff1034d92e447f2 (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.c | 21 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-array.h | 1 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-bitset.c | 35 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-bitset.h | 1 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree.c | 11 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree.h | 1 |
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 | } |
977 | EXPORT_SYMBOL_GPL(dm_array_cursor_next); | 977 | EXPORT_SYMBOL_GPL(dm_array_cursor_next); |
978 | 978 | ||
979 | int 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 | } | ||
998 | EXPORT_SYMBOL_GPL(dm_array_cursor_skip); | ||
999 | |||
979 | void dm_array_cursor_get_value(struct dm_array_cursor *c, void **value_le) | 1000 | void 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 | ||
208 | uint32_t dm_array_cursor_index(struct dm_array_cursor *c); | 208 | uint32_t dm_array_cursor_index(struct dm_array_cursor *c); |
209 | int dm_array_cursor_next(struct dm_array_cursor *c); | 209 | int dm_array_cursor_next(struct dm_array_cursor *c); |
210 | int 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 | } |
274 | EXPORT_SYMBOL_GPL(dm_bitset_cursor_next); | 274 | EXPORT_SYMBOL_GPL(dm_bitset_cursor_next); |
275 | 275 | ||
276 | int 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 | } | ||
309 | EXPORT_SYMBOL_GPL(dm_bitset_cursor_skip); | ||
310 | |||
276 | bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c) | 311 | bool 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, | |||
197 | void dm_bitset_cursor_end(struct dm_bitset_cursor *c); | 197 | void dm_bitset_cursor_end(struct dm_bitset_cursor *c); |
198 | 198 | ||
199 | int dm_bitset_cursor_next(struct dm_bitset_cursor *c); | 199 | int dm_bitset_cursor_next(struct dm_bitset_cursor *c); |
200 | int dm_bitset_cursor_skip(struct dm_bitset_cursor *c, uint32_t count); | ||
200 | bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c); | 201 | bool 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 | } |
1145 | EXPORT_SYMBOL_GPL(dm_btree_cursor_next); | 1145 | EXPORT_SYMBOL_GPL(dm_btree_cursor_next); |
1146 | 1146 | ||
1147 | int 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 | } | ||
1156 | EXPORT_SYMBOL_GPL(dm_btree_cursor_skip); | ||
1157 | |||
1147 | int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le) | 1158 | int 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); |
210 | void dm_btree_cursor_end(struct dm_btree_cursor *c); | 210 | void dm_btree_cursor_end(struct dm_btree_cursor *c); |
211 | int dm_btree_cursor_next(struct dm_btree_cursor *c); | 211 | int dm_btree_cursor_next(struct dm_btree_cursor *c); |
212 | int dm_btree_cursor_skip(struct dm_btree_cursor *c, uint32_t count); | ||
212 | int dm_btree_cursor_get_value(struct dm_btree_cursor *c, uint64_t *key, void *value_le); | 213 | int 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 */ |