[Suspend2][ 5/9] [Suspend2] Serialise extent chains.

Nigel Cunningham
2006-06-26T16:56:44Z

Add routines for storing extent chains in an image header.

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

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

diff --git a/kernel/power/extent.c b/kernel/power/extent.c
index 31fcb65..f7db014 100644
--- a/kernel/power/extent.c
+++ b/kernel/power/extent.c
@@ -141,3 +141,68 @@ int suspend_add_to_extent_chain(struct e
return 0;
}

+/* suspend_serialise_extent_chain
+ *
+ * Write a chain in the image.
+ */
+int suspend_serialise_extent_chain(struct suspend_module_ops *owner,
+ struct extent_chain *chain)
+{
+ struct extent *this;
+ int ret, i = 0;
+
+ if ((ret = suspend_active_writer->rw_header_chunk(WRITE, owner,
+ (char *) chain,
+ 3 * sizeof(int))))
+ return ret;
+
+ this = chain->first;
+ while (this) {
+ if ((ret = suspend_active_writer->rw_header_chunk(WRITE, owner,
+ (char *) this,
+ 2 * sizeof(unsigned long))))
+ return ret;
+ this = this->next;
+ i++;
+ }
+
+ if (i != (chain->allocs - chain->frees)) {
+ printk(KERN_EMERG "Saved %d extents but chain metadata says there should be %d-%d.\n",
+ i, chain->allocs, chain->frees);
+ BUG();
+ }
+
+ return ret;
+}
+
+/* suspend_load_extent_chain
+ *
+ * Read back a chain saved in the image.
+ */
+int suspend_load_extent_chain(struct extent_chain *chain)
+{
+ struct extent *this, *last = NULL;
+ int i, ret;
+
+ if (!(ret = suspend_active_writer->rw_header_chunk(READ, NULL,
+ (char *) chain,
+ 3 * sizeof(int))))
+ return ret;
+
+ for (i = 0; i < (chain->allocs - chain->frees); i++) {
+ this = kmalloc(sizeof(struct extent), GFP_ATOMIC);
+ BUG_ON(!this); /* Shouldn't run out of memory trying this! */
+ this->next = NULL;
+ if (!(ret = suspend_active_writer->rw_header_chunk(READ, NULL,
+ (char *) this, 2 * sizeof(unsigned long))))
+ return ret;
+ if (last)
+ last->next = this;
+ else
+ chain->first = this;
+ last = this;
+ }
+ chain->last = last;
+ return ret;
+}
+

--
Nigel Cunningham nigel at suspend2 dot net