OpenZFS 7277 - zdb should be able to print zfs_dbgmsg's
Porting notes: - 'zfs_dbgmsg_print()' reintroduced to userspace. Authored by: Pavel Zakharov <pavel.zakharov@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com> Approved by: Dan McDonald <danmcd@omniti.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov> Ported-by: George Melikov <mail@gmelikov.ru> OpenZFS-issue: https://www.illumos.org/issues/7277 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/29bdd2f Closes #5684
This commit is contained in:
parent
a32494d22a
commit
fa603f8233
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2011, 2015 by Delphix. All rights reserved.
|
* Copyright (c) 2011, 2016 by Delphix. All rights reserved.
|
||||||
* Copyright (c) 2015, Intel Corporation.
|
* Copyright (c) 2015, Intel Corporation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -126,7 +126,7 @@ static void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr,
|
||||||
"Usage: %s [-CumMdibcsDvhLXFPA] [-t txg] [-e [-p path...]] "
|
"Usage: %s [-CumMdibcsDvhLXFPAG] [-t txg] [-e [-p path...]] "
|
||||||
"[-U config] [-I inflight I/Os] [-x dumpdir] poolname [object...]\n"
|
"[-U config] [-I inflight I/Os] [-x dumpdir] poolname [object...]\n"
|
||||||
" %s [-divPA] [-e -p path...] [-U config] dataset "
|
" %s [-divPA] [-e -p path...] [-U config] dataset "
|
||||||
"[object...]\n"
|
"[object...]\n"
|
||||||
|
@ -187,12 +187,23 @@ usage(void)
|
||||||
(void) fprintf(stderr, " -I <number of inflight I/Os> -- "
|
(void) fprintf(stderr, " -I <number of inflight I/Os> -- "
|
||||||
"specify the maximum number of "
|
"specify the maximum number of "
|
||||||
"checksumming I/Os [default is 200]\n");
|
"checksumming I/Os [default is 200]\n");
|
||||||
|
(void) fprintf(stderr, " -G dump zfs_dbgmsg buffer before "
|
||||||
|
"exiting\n");
|
||||||
(void) fprintf(stderr, "Specify an option more than once (e.g. -bb) "
|
(void) fprintf(stderr, "Specify an option more than once (e.g. -bb) "
|
||||||
"to make only that option verbose\n");
|
"to make only that option verbose\n");
|
||||||
(void) fprintf(stderr, "Default is to dump everything non-verbosely\n");
|
(void) fprintf(stderr, "Default is to dump everything non-verbosely\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dump_debug_buffer(void)
|
||||||
|
{
|
||||||
|
if (dump_opt['G']) {
|
||||||
|
(void) printf("\n");
|
||||||
|
zfs_dbgmsg_print("zdb");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called for usage errors that are discovered after a call to spa_open(),
|
* Called for usage errors that are discovered after a call to spa_open(),
|
||||||
* dmu_bonus_hold(), or pool_match(). abort() is called for other errors.
|
* dmu_bonus_hold(), or pool_match(). abort() is called for other errors.
|
||||||
|
@ -209,6 +220,8 @@ fatal(const char *fmt, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
(void) fprintf(stderr, "\n");
|
(void) fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
dump_debug_buffer();
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3197,8 +3210,10 @@ dump_zpool(spa_t *spa)
|
||||||
if (dump_opt['h'])
|
if (dump_opt['h'])
|
||||||
dump_history(spa);
|
dump_history(spa);
|
||||||
|
|
||||||
if (rc != 0)
|
if (rc != 0) {
|
||||||
|
dump_debug_buffer();
|
||||||
exit(rc);
|
exit(rc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ZDB_FLAG_CHECKSUM 0x0001
|
#define ZDB_FLAG_CHECKSUM 0x0001
|
||||||
|
@ -3692,7 +3707,7 @@ main(int argc, char **argv)
|
||||||
spa_config_path = spa_config_path_env;
|
spa_config_path = spa_config_path_env;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv,
|
while ((c = getopt(argc, argv,
|
||||||
"bcdhilmMI:suCDRSAFLXx:evp:t:U:PV")) != -1) {
|
"bcdhilmMI:suCDRSAFLXx:evp:t:U:PVG")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'b':
|
case 'b':
|
||||||
case 'c':
|
case 'c':
|
||||||
|
@ -3708,6 +3723,7 @@ main(int argc, char **argv)
|
||||||
case 'M':
|
case 'M':
|
||||||
case 'R':
|
case 'R':
|
||||||
case 'S':
|
case 'S':
|
||||||
|
case 'G':
|
||||||
dump_opt[c]++;
|
dump_opt[c]++;
|
||||||
dump_all = 0;
|
dump_all = 0;
|
||||||
break;
|
break;
|
||||||
|
@ -3939,6 +3955,8 @@ main(int argc, char **argv)
|
||||||
fuid_table_destroy();
|
fuid_table_destroy();
|
||||||
sa_loaded = B_FALSE;
|
sa_loaded = B_FALSE;
|
||||||
|
|
||||||
|
dump_debug_buffer();
|
||||||
|
|
||||||
libzfs_fini(g_zfs);
|
libzfs_fini(g_zfs);
|
||||||
kernel_fini();
|
kernel_fini();
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ extern void zfs_dbgmsg_fini(void);
|
||||||
|
|
||||||
#ifndef _KERNEL
|
#ifndef _KERNEL
|
||||||
extern int dprintf_find_string(const char *string);
|
extern int dprintf_find_string(const char *string);
|
||||||
|
extern void zfs_dbgmsg_print(const char *tag);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -11,15 +11,15 @@
|
||||||
.\"
|
.\"
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright 2012, Richard Lowe.
|
.\" Copyright 2012, Richard Lowe.
|
||||||
.\" Copyright (c) 2012, 2014 by Delphix. All rights reserved.
|
.\" Copyright (c) 2012, 2016 by Delphix. All rights reserved.
|
||||||
.\"
|
.\"
|
||||||
.TH "ZDB" "8" "February 15, 2012" "" ""
|
.TH "ZDB" "8" "Feb 4, 2016" "" ""
|
||||||
|
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
\fBzdb\fR - Display zpool debugging and consistency information
|
\fBzdb\fR - Display zpool debugging and consistency information
|
||||||
|
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
\fBzdb\fR [-CumdibcsDvhLMXFPA] [-e [-p \fIpath\fR...]] [-t \fItxg\fR]
|
\fBzdb\fR [-CumdibcsDvhLMXFPAG] [-e [-p \fIpath\fR...]] [-t \fItxg\fR]
|
||||||
[-U \fIcache\fR] [-I \fIinflight I/Os\fR] [-x \fIdumpdir\fR]
|
[-U \fIcache\fR] [-I \fIinflight I/Os\fR] [-x \fIdumpdir\fR]
|
||||||
[\fIpoolname\fR [\fIobject\fR ...]]
|
[\fIpoolname\fR [\fIobject\fR ...]]
|
||||||
|
|
||||||
|
@ -397,6 +397,17 @@ Attempt to make an unreadable pool readable by trying progressively older
|
||||||
transactions.
|
transactions.
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
|
.sp
|
||||||
|
.ne 2
|
||||||
|
.na
|
||||||
|
\fB-G\fR
|
||||||
|
.ad
|
||||||
|
.sp .6
|
||||||
|
.RS 4n
|
||||||
|
Dump the contents of the zfs_dbgmsg buffer before exiting zdb. zfs_dbgmsg is
|
||||||
|
a buffer used by ZFS to dump advanced debug information.
|
||||||
|
.RE
|
||||||
|
|
||||||
.sp
|
.sp
|
||||||
.ne 2
|
.ne 2
|
||||||
.na
|
.na
|
||||||
|
|
|
@ -228,6 +228,21 @@ __dprintf(const char *file, const char *func, int line, const char *fmt, ...)
|
||||||
|
|
||||||
kmem_free(buf, size);
|
kmem_free(buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_dbgmsg_print(const char *tag)
|
||||||
|
{
|
||||||
|
zfs_dbgmsg_t *zdm;
|
||||||
|
|
||||||
|
(void) printf("ZFS_DBGMSG(%s):\n", tag);
|
||||||
|
mutex_enter(&zfs_dbgmsgs_lock);
|
||||||
|
for (zdm = list_head(&zfs_dbgmsgs); zdm;
|
||||||
|
zdm = list_next(&zfs_dbgmsgs, zdm))
|
||||||
|
(void) printf("%s\n", zdm->zdm_msg);
|
||||||
|
mutex_exit(&zfs_dbgmsgs_lock);
|
||||||
|
}
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
|
|
Loading…
Reference in New Issue