[Suspend2][ 6/9] [Suspend2] Get next extent in an extent state.

Nigel Cunningham
2006-06-26T16:54:32Z

Add a routine for getting the next device and block to which a page will be
written. We are essentially iterating through a series of one (filewriter)
or more (swapwriter) devices, each having a chain of sectors in which the
image is stored.

Signed-off-by: Nigel Cunningham <nigel@suspend2.net>

kernel/power/extent.c | 43 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/kernel/power/extent.c b/kernel/power/extent.c
index f7db014..8cbb48a 100644
--- a/kernel/power/extent.c
+++ b/kernel/power/extent.c
@@ -206,3 +206,46 @@ int suspend_load_extent_chain(struct ext
return ret;
}

+/* suspend_extent_state_next
+ *
+ * Given a state, progress to the next valid entry. We may begin in an
+ * invalid state, as we do when invoked after extent_state_goto_start below.
+ *
+ * When using compression and expected_compression > 0, we allocate fewer
+ * swap entries, so we can validly run out of data to return.
+ */
+unsigned long suspend_extent_state_next(struct extent_iterate_state *state)
+{
+ if (state->current_chain > state->num_chains)
+ return 0;
+
+ if (state->current_extent) {
+ if (state->current_offset == state->current_extent->maximum) {
+ if (state->current_extent->next) {
+ state->current_extent = state->current_extent->next;
+ state->current_offset = state->current_extent->minimum;
+ } else {
+ state->current_extent = NULL;
+ state->current_offset = 0;
+ }
+ } else
+ state->current_offset++;
+ }
+
+ while(!state->current_extent) {
+ int chain_num = ++(state->current_chain);
+
+ if (chain_num > state->num_chains)
+ return 0;
+
+ state->current_extent = (state->chains + chain_num)->first;
+
+ if (!state->current_extent)
+ continue;
+
+ state->current_offset = state->current_extent->minimum;
+ }
+
+ return state->current_offset;
+}
+

--
Nigel Cunningham nigel at suspend2 dot net