[MAKEDUMPFILE PATCH 1/2] Add option to prevent writing the dumpfile
Julien Thierry
jthierry at redhat.com
Tue Nov 24 05:45:24 EST 2020
Add a --dry-run option to run all operations without writing the
dump to the output file.
Signed-off-by: Julien Thierry <jthierry at redhat.com>
---
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
More information about the kexec
mailing list