diff options
author | Tom Caputi <[email protected]> | 2018-10-15 15:14:22 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-10-24 14:36:50 -0700 |
commit | ab4c009e3d0cf794bbe84aff3b9ac203eaed03c7 (patch) | |
tree | 1c80fc0bd955e7b5acc9d8f375559e21fd3314bd /cmd | |
parent | c04812f964a2a79ec501fb1ba995ef333ff79172 (diff) |
Fix dbgmsg printing in ztest and zdb
This patch resolves a problem where the -G option in both zdb and
ztest would cause the code to call __dprintf() to print zfs_dbgmsg
output. This function was not properly wired to add messages to the
dbgmsg log as it is in userspace and so the messages were simply
dropped. This patch also tries to add some degree of distinction to
dprintf() (which now prints directly to stdout) and zfs_dbgmsg()
(which adds messages to an internal list that can be dumped with
zfs_dbgmsg_print()).
In addition, this patch corrects an issue where ztest used a global
variable to decide whether to dump the dbgmsg buffer on a crash.
This did not work because ztest spins up more instances of itself
using execv(), which did not copy the global variable to the new
process. The option has been moved to the ztest_shared_opts_t
which already exists for interprocess communication.
This patch also changes zfs_dbgmsg_print() to use write() calls
instead of printf() so that it will not fail when used in a signal
handler.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Serapheim Dimitropoulos <[email protected]>
Reviewed-by: Matthew Ahrens <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #8010
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zdb/zdb.c | 1 | ||||
-rw-r--r-- | cmd/ztest/ztest.c | 19 |
2 files changed, 14 insertions, 6 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index 389bd7820..cdea1e584 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -225,6 +225,7 @@ dump_debug_buffer(void) { if (dump_opt['G']) { (void) printf("\n"); + (void) fflush(stdout); zfs_dbgmsg_print("zdb"); } } diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c index 47f3cdf12..44d4e9740 100644 --- a/cmd/ztest/ztest.c +++ b/cmd/ztest/ztest.c @@ -178,6 +178,7 @@ typedef struct ztest_shared_opts { uint64_t zo_metaslab_force_ganging; int zo_mmp_test; int zo_special_vdevs; + int zo_dump_dbgmsg; } ztest_shared_opts_t; static const ztest_shared_opts_t ztest_opts_defaults = { @@ -484,7 +485,6 @@ static kmutex_t ztest_checkpoint_lock; static pthread_rwlock_t ztest_name_lock; static boolean_t ztest_dump_core = B_TRUE; -static boolean_t ztest_dump_debug_buffer = B_FALSE; static boolean_t ztest_exiting; /* Global commit callback list */ @@ -533,10 +533,16 @@ _umem_logging_init(void) static void dump_debug_buffer(void) { - if (!ztest_dump_debug_buffer) + ssize_t ret __attribute__((unused)); + + if (!ztest_opts.zo_dump_dbgmsg) return; - (void) printf("\n"); + /* + * We use write() instead of printf() so that this function + * is safe to call from a signal handler. + */ + ret = write(STDOUT_FILENO, "\n", 1); zfs_dbgmsg_print("ztest"); } @@ -591,10 +597,11 @@ fatal(int do_perror, char *message, ...) (void) fprintf(stderr, "%s\n", buf); fatal_msg = buf; /* to ease debugging */ - dump_debug_buffer(); - if (ztest_dump_core) abort(); + else + dump_debug_buffer(); + exit(3); } @@ -866,7 +873,7 @@ process_options(int argc, char **argv) usage(B_FALSE); break; case 'G': - ztest_dump_debug_buffer = B_TRUE; + zo->zo_dump_dbgmsg = 1; break; case 'h': usage(B_TRUE); |