Messages in this thread Patch in this message | | | From | Nigel Cunningham <> | Subject | [Suspend2][ 11/19] [Suspend2] Write module configurations in an image header. | Date | Tue, 27 Jun 2006 08:36:36 +1000 |
| |
Write the configuration of each module used to the image header.
Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
kernel/power/io.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 67 insertions(+), 0 deletions(-)
diff --git a/kernel/power/io.c b/kernel/power/io.c index dade1fc..a0aabd1 100644 --- a/kernel/power/io.c +++ b/kernel/power/io.c @@ -421,3 +421,70 @@ static int read_pageset(struct pagedir * return result; } +/* write_module_configs() + * + * Description: Store the configuration for each module in the image header. + * Returns: Int: Zero on success, Error value otherwise. + */ +static int write_module_configs(void) +{ + struct suspend_module_ops *this_module; + char *buffer = (char *) get_zeroed_page(GFP_ATOMIC); + int len, index = 1; + struct suspend_module_header suspend_module_header; + + if (!buffer) { + printk("Failed to allocate a buffer for saving " + "module configuration info.\n"); + return -ENOMEM; + } + + /* + * We have to know which data goes with which module, so we at + * least write a length of zero for a module. Note that we are + * also assuming every module's config data takes <= PAGE_SIZE. + */ + + /* For each module (in registration order) */ + list_for_each_entry(this_module, &suspend_modules, module_list) { + if (this_module->disabled || !this_module->storage_needed || + (this_module->type == WRITER_MODULE && + suspend_active_writer != this_module)) + continue; + + /* Get the data from the module */ + len = 0; + if (this_module->save_config_info) + len = this_module->save_config_info(buffer); + + /* Save the details of the module */ + suspend_module_header.disabled = this_module->disabled; + suspend_module_header.type = this_module->type; + suspend_module_header.index = index++; + strncpy(suspend_module_header.name, this_module->name, + sizeof(suspend_module_header.name)); + suspend_active_writer->rw_header_chunk(WRITE, + this_module, + (char *) &suspend_module_header, + sizeof(suspend_module_header)); + + /* Save the size of the data and any data returned */ + suspend_active_writer->rw_header_chunk(WRITE, + this_module, + (char *) &len, sizeof(int)); + if (len) + suspend_active_writer->rw_header_chunk( + WRITE, this_module, buffer, len); + } + + /* Write a blank header to terminate the list */ + suspend_module_header.name[0] = '\0'; + suspend_active_writer->rw_header_chunk(WRITE, + NULL, + (char *) &suspend_module_header, + sizeof(suspend_module_header)); + + free_page((unsigned long) buffer); + return 0; +} + -- Nigel Cunningham nigel at suspend2 dot net - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |