dm bitset: introduce cursor api
Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
committed by
Mike Snitzer
parent
9f9ef0657d
commit
6fe28dbf05
@@ -168,4 +168,73 @@ int dm_bitset_test_bit(struct dm_disk_bitset *info, dm_block_t root,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dm_bitset_test_bit);
|
EXPORT_SYMBOL_GPL(dm_bitset_test_bit);
|
||||||
|
|
||||||
|
static int cursor_next_array_entry(struct dm_bitset_cursor *c)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
__le64 *value;
|
||||||
|
|
||||||
|
r = dm_array_cursor_next(&c->cursor);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
dm_array_cursor_get_value(&c->cursor, (void **) &value);
|
||||||
|
c->array_index++;
|
||||||
|
c->bit_index = 0;
|
||||||
|
c->current_bits = le64_to_cpu(*value);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dm_bitset_cursor_begin(struct dm_disk_bitset *info,
|
||||||
|
dm_block_t root, uint32_t nr_entries,
|
||||||
|
struct dm_bitset_cursor *c)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
__le64 *value;
|
||||||
|
|
||||||
|
if (!nr_entries)
|
||||||
|
return -ENODATA;
|
||||||
|
|
||||||
|
c->info = info;
|
||||||
|
c->entries_remaining = nr_entries;
|
||||||
|
|
||||||
|
r = dm_array_cursor_begin(&info->array_info, root, &c->cursor);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
dm_array_cursor_get_value(&c->cursor, (void **) &value);
|
||||||
|
c->array_index = 0;
|
||||||
|
c->bit_index = 0;
|
||||||
|
c->current_bits = le64_to_cpu(*value);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_bitset_cursor_begin);
|
||||||
|
|
||||||
|
void dm_bitset_cursor_end(struct dm_bitset_cursor *c)
|
||||||
|
{
|
||||||
|
return dm_array_cursor_end(&c->cursor);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_bitset_cursor_end);
|
||||||
|
|
||||||
|
int dm_bitset_cursor_next(struct dm_bitset_cursor *c)
|
||||||
|
{
|
||||||
|
int r = 0;
|
||||||
|
|
||||||
|
if (!c->entries_remaining)
|
||||||
|
return -ENODATA;
|
||||||
|
|
||||||
|
c->entries_remaining--;
|
||||||
|
if (++c->bit_index > 63)
|
||||||
|
r = cursor_next_array_entry(c);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_bitset_cursor_next);
|
||||||
|
|
||||||
|
bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c)
|
||||||
|
{
|
||||||
|
return test_bit(c->bit_index, (unsigned long *) &c->current_bits);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dm_bitset_cursor_get_value);
|
||||||
|
|
||||||
/*----------------------------------------------------------------*/
|
/*----------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -161,6 +161,28 @@ int dm_bitset_test_bit(struct dm_disk_bitset *info, dm_block_t root,
|
|||||||
int dm_bitset_flush(struct dm_disk_bitset *info, dm_block_t root,
|
int dm_bitset_flush(struct dm_disk_bitset *info, dm_block_t root,
|
||||||
dm_block_t *new_root);
|
dm_block_t *new_root);
|
||||||
|
|
||||||
|
struct dm_bitset_cursor {
|
||||||
|
struct dm_disk_bitset *info;
|
||||||
|
struct dm_array_cursor cursor;
|
||||||
|
|
||||||
|
uint32_t entries_remaining;
|
||||||
|
uint32_t array_index;
|
||||||
|
uint32_t bit_index;
|
||||||
|
uint64_t current_bits;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure you've flush any dm_disk_bitset and updated the root before
|
||||||
|
* using this.
|
||||||
|
*/
|
||||||
|
int dm_bitset_cursor_begin(struct dm_disk_bitset *info,
|
||||||
|
dm_block_t root, uint32_t nr_entries,
|
||||||
|
struct dm_bitset_cursor *c);
|
||||||
|
void dm_bitset_cursor_end(struct dm_bitset_cursor *c);
|
||||||
|
|
||||||
|
int dm_bitset_cursor_next(struct dm_bitset_cursor *c);
|
||||||
|
bool dm_bitset_cursor_get_value(struct dm_bitset_cursor *c);
|
||||||
|
|
||||||
/*----------------------------------------------------------------*/
|
/*----------------------------------------------------------------*/
|
||||||
|
|
||||||
#endif /* _LINUX_DM_BITSET_H */
|
#endif /* _LINUX_DM_BITSET_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user