Add the data structure 'storage_position' and routines that allow a caller to iterate over swap in sector order. Note that calling reset_storage_pos only resets the position. next_swapdev_block must also be called to get the address of the first (and subsequent sectors). Signed-off-by: Nigel Cunningham <nigel@xxxxxxxxxxxx> --- kernel/power/swap.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) diff --git a/kernel/power/swap.c b/kernel/power/swap.c index caf4db8..4e5f6e3 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -68,6 +68,45 @@ struct swsusp_extent { static struct rb_root swsusp_extents = RB_ROOT; +struct storage_position { + struct rb_node *node; + struct swsusp_extent *cur_ext; + unsigned long offset; +}; + +static struct storage_position pos; + +static void reset_storage_pos(void) +{ + pos.node = rb_first(&swsusp_extents); + + if (!pos.node) { + pos.cur_ext = NULL; + pos.offset = 0; + return; + } + + pos.cur_ext = container_of(pos.node, struct swsusp_extent, node); + pos.offset = pos.cur_ext->start; +} + +static sector_t next_swapdev_block(void) +{ + if (!pos.node) + return 0; + + if (pos.cur_ext->end >= pos.offset) + return pos.offset++; + + pos.node = rb_next(pos.node); + if (!pos.node) + return 0; + + pos.cur_ext = container_of(pos.node, struct swsusp_extent, node); + pos.offset = pos.cur_ext->start; + return pos.offset; +} + static int swsusp_extents_insert(unsigned long swap_offset) { struct rb_node **new = &(swsusp_extents.rb_node); -- 1.7.0.4 _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm