From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756462Ab0IYEVl (ORCPT ); Sat, 25 Sep 2010 00:21:41 -0400 Received: from crca.org.au ([74.207.252.120]:51648 "EHLO crca.org.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750786Ab0IYERM (ORCPT ); Sat, 25 Sep 2010 00:17:12 -0400 X-Bogosity: Ham, spamicity=0.000000 From: Nigel Cunningham To: "Rafael J. Wysocki" , Linux PM , LKML , TuxOnIce-devel Subject: [PATCH 02/22] Hibernation: Swap iteration functions. Date: Sat, 25 Sep 2010 14:16:44 +1000 Message-Id: <1285388224-10012-3-git-send-email-nigel@tuxonice.net> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1285388224-10012-1-git-send-email-nigel@tuxonice.net> References: <1285388224-10012-1-git-send-email-nigel@tuxonice.net> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 728f85b..d53417b 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c @@ -87,6 +87,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