@@ -899,3 +899,89 @@ int dm_array_walk(struct dm_array_info *info, dm_block_t root,
899899EXPORT_SYMBOL_GPL (dm_array_walk );
900900
901901/*----------------------------------------------------------------*/
902+
903+ static int load_ablock (struct dm_array_cursor * c )
904+ {
905+ int r ;
906+ __le64 value_le ;
907+ uint64_t key ;
908+
909+ if (c -> block )
910+ unlock_ablock (c -> info , c -> block );
911+
912+ c -> block = NULL ;
913+ c -> ab = NULL ;
914+ c -> index = 0 ;
915+
916+ r = dm_btree_cursor_get_value (& c -> cursor , & key , & value_le );
917+ if (r ) {
918+ DMERR ("dm_btree_cursor_get_value failed" );
919+ dm_btree_cursor_end (& c -> cursor );
920+
921+ } else {
922+ r = get_ablock (c -> info , le64_to_cpu (value_le ), & c -> block , & c -> ab );
923+ if (r ) {
924+ DMERR ("get_ablock failed" );
925+ dm_btree_cursor_end (& c -> cursor );
926+ }
927+ }
928+
929+ return r ;
930+ }
931+
932+ int dm_array_cursor_begin (struct dm_array_info * info , dm_block_t root ,
933+ struct dm_array_cursor * c )
934+ {
935+ int r ;
936+
937+ memset (c , 0 , sizeof (* c ));
938+ c -> info = info ;
939+ r = dm_btree_cursor_begin (& info -> btree_info , root , true, & c -> cursor );
940+ if (r ) {
941+ DMERR ("couldn't create btree cursor" );
942+ return r ;
943+ }
944+
945+ return load_ablock (c );
946+ }
947+ EXPORT_SYMBOL_GPL (dm_array_cursor_begin );
948+
949+ void dm_array_cursor_end (struct dm_array_cursor * c )
950+ {
951+ if (c -> block ) {
952+ unlock_ablock (c -> info , c -> block );
953+ dm_btree_cursor_end (& c -> cursor );
954+ }
955+ }
956+ EXPORT_SYMBOL_GPL (dm_array_cursor_end );
957+
958+ int dm_array_cursor_next (struct dm_array_cursor * c )
959+ {
960+ int r ;
961+
962+ if (!c -> block )
963+ return - ENODATA ;
964+
965+ c -> index ++ ;
966+
967+ if (c -> index >= le32_to_cpu (c -> ab -> nr_entries )) {
968+ r = dm_btree_cursor_next (& c -> cursor );
969+ if (r )
970+ return r ;
971+
972+ r = load_ablock (c );
973+ if (r )
974+ return r ;
975+ }
976+
977+ return 0 ;
978+ }
979+ EXPORT_SYMBOL_GPL (dm_array_cursor_next );
980+
981+ void dm_array_cursor_get_value (struct dm_array_cursor * c , void * * value_le )
982+ {
983+ * value_le = element_at (c -> info , c -> ab , c -> index );
984+ }
985+ EXPORT_SYMBOL_GPL (dm_array_cursor_get_value );
986+
987+ /*----------------------------------------------------------------*/
0 commit comments