Add a --dry-run option to run all operations without writing the
dump to the output file.

Signed-off-by: Julien Thierry <[email protected]>
---
 makedumpfile.8 |  5 +++++
 makedumpfile.c | 33 +++++++++++++++++++++++++++++++--
 makedumpfile.h |  2 ++
 print_info.c   |  3 +++
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/makedumpfile.8 b/makedumpfile.8
index 2fe2cd0..39a63ba 100644
--- a/makedumpfile.8
+++ b/makedumpfile.8
@@ -637,6 +637,11 @@ Show the version of makedumpfile.
 Only check whether the command-line parameters are valid or not, and exit.
 Preferable to be given as the first parameter.
 
+.TP
+\fB\-\-dry-run\fR
+Do not write the output dump file while still performing operations specified
+by other options.
+
 .SH ENVIRONMENT VARIABLES
 
 .TP 8
diff --git a/makedumpfile.c b/makedumpfile.c
index cdde040..90258f3 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1366,7 +1366,9 @@ open_dump_file(void)
        if (!info->flag_force)
                open_flags |= O_EXCL;
 
-       if (info->flag_flatten) {
+       if (info->flag_dry_run) {
+               fd = -1;
+       } else if (info->flag_flatten) {
                fd = STDOUT_FILENO;
                info->name_dumpfile = filename_stdout;
        } else if ((fd = open(info->name_dumpfile, open_flags,
@@ -1384,6 +1386,9 @@ check_dump_file(const char *path)
 {
        char *err_str;
 
+       if (info->flag_dry_run)
+               return TRUE;
+
        if (access(path, F_OK) != 0)
                return TRUE; /* File does not exist */
        if (info->flag_force) {
@@ -4643,6 +4648,8 @@ write_buffer(int fd, off_t offset, void *buf, size_t 
buf_size, char *file_name)
                }
                if (!write_and_check_space(fd, &fdh, sizeof(fdh), file_name))
                        return FALSE;
+       } else if (info->flag_dry_run && fd == info->fd_dumpfile) {
+               return TRUE;
        } else {
                if (lseek(fd, offset, SEEK_SET) == failed) {
                        ERRMSG("Can't seek the dump file(%s). %s\n",
@@ -9007,6 +9014,9 @@ close_dump_file(void)
        if (info->flag_flatten)
                return;
 
+       if (info->flag_dry_run)
+               return;
+
        if (close(info->fd_dumpfile) < 0)
                ERRMSG("Can't close the dump file(%s). %s\n",
                    info->name_dumpfile, strerror(errno));
@@ -11032,7 +11042,8 @@ check_param_for_creating_dumpfile(int argc, char 
*argv[])
                 */
                info->name_memory   = argv[optind];
 
-       } else if ((argc == optind + 1) && info->flag_mem_usage) {
+       } else if ((argc == optind + 1) && (info->flag_mem_usage ||
+                                           info->flag_dry_run)) {
                /*
                * Parameter for showing the page number of memory
                * in different use from.
@@ -11412,6 +11423,7 @@ static struct option longopts[] = {
        {"work-dir", required_argument, NULL, OPT_WORKING_DIR},
        {"num-threads", required_argument, NULL, OPT_NUM_THREADS},
        {"check-params", no_argument, NULL, OPT_CHECK_PARAMS},
+       {"dry-run", no_argument, NULL, OPT_DRY_RUN},
        {0, 0, 0, 0}
 };
 
@@ -11578,6 +11590,9 @@ main(int argc, char *argv[])
                        info->flag_check_params = TRUE;
                        message_level = DEFAULT_MSG_LEVEL;
                        break;
+               case OPT_DRY_RUN:
+                       info->flag_dry_run = TRUE;
+                       break;
                case '?':
                        MSG("Commandline parameter is invalid.\n");
                        MSG("Try `makedumpfile --help' for more 
information.\n");
@@ -11591,6 +11606,10 @@ main(int argc, char *argv[])
                /* suppress debugging messages */
                message_level = DEFAULT_MSG_LEVEL;
 
+       if (info->flag_dry_run)
+               /* Suppress progress indicator as dumpfile won't get written */
+               message_level &= ~ML_PRINT_PROGRESS;
+
        if (info->flag_show_usage) {
                print_usage();
                return COMPLETED;
@@ -11661,6 +11680,9 @@ main(int argc, char *argv[])
                if (!close_files_for_rearranging_dumpdata())
                        goto out;
 
+               if (info->flag_dry_run)
+                       goto check_ok;
+
                MSG("\n");
                MSG("The dumpfile is saved to %s.\n", info->name_dumpfile);
        } else if (info->flag_reassemble) {
@@ -11677,6 +11699,10 @@ main(int argc, char *argv[])
 
                if (!reassemble_dumpfile())
                        goto out;
+
+               if (info->flag_dry_run)
+                       goto check_ok;
+
                MSG("\n");
                MSG("The dumpfile is saved to %s.\n", info->name_dumpfile);
        } else if (info->flag_dmesg) {
@@ -11739,6 +11765,9 @@ main(int argc, char *argv[])
                if (!create_dumpfile())
                        goto out;
 
+               if (info->flag_dry_run)
+                       goto check_ok;
+
                MSG("\n");
                if (info->flag_split) {
                        MSG("The dumpfiles are saved to ");
diff --git a/makedumpfile.h b/makedumpfile.h
index 698c054..58126cb 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1321,6 +1321,7 @@ struct DumpInfo {
        int             flag_vmemmap;        /* kernel supports vmemmap address 
space */
        int             flag_excludevm;      /* -e - excluding unused vmemmap 
pages */
        int             flag_use_count;      /* _refcount is named _count in 
struct page */
+       int             flag_dry_run;        /* do not create a vmcore file */
        unsigned long   vaddr_for_vtop;      /* virtual address for debugging */
        long            page_size;           /* size of page */
        long            page_shift;
@@ -2364,6 +2365,7 @@ struct elf_prstatus {
 #define OPT_NUM_THREADS         OPT_START+16
 #define OPT_PARTIAL_DMESG       OPT_START+17
 #define OPT_CHECK_PARAMS        OPT_START+18
+#define OPT_DRY_RUN             OPT_START+19
 
 /*
  * Function Prototype.
diff --git a/print_info.c b/print_info.c
index e0c38b4..d2b0cb7 100644
--- a/print_info.c
+++ b/print_info.c
@@ -308,6 +308,9 @@ print_usage(void)
        MSG("      the crashkernel range, then calculates the page number of 
different kind per\n");
        MSG("      vmcoreinfo. So currently /proc/kcore need be specified 
explicitly.\n");
        MSG("\n");
+       MSG("  [--dry-run]:\n");
+       MSG("      This option runs makedumpfile without writting output dump 
file.\n");
+       MSG("\n");
        MSG("  [-D]:\n");
        MSG("      Print debugging message.\n");
        MSG("\n");
-- 
2.25.4


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to