MFV r303083: 7164 zdb should be able to open the root dataset

Note: conversion of the manual page change from roff to mdoc is mine.

illumos/illumos-gate@b702644a6e
b702644a6e

https://www.illumos.org/issues/7164
  If the pool/dataset command-line argument is specified with a trailing
  slash, for example, "tank/", we should interpret it as the topmost
  dataset (rather than the whole pool)

Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Author: Tim Chase <tim@chase2k.com>
PR:		204661
MFC after:	1 week
Relnotes:	yes
This commit is contained in:
Andriy Gapon 2016-07-20 11:15:32 +00:00
commit 7ad541f1f8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=303086
2 changed files with 28 additions and 1 deletions

View File

@ -86,6 +86,17 @@ pool, and is inherently unstable.
The precise output of most invocations is not documented, a knowledge of ZFS The precise output of most invocations is not documented, a knowledge of ZFS
internals is assumed. internals is assumed.
.Pp .Pp
If the
.Ar dataset
argument does not contain any
.Sy /
or
.Sy @
characters, it is interpreted as a pool name.
The root dataset can be specified as
.Pa pool Ns Sy /
(pool name followed by a slash).
.Pp
When operating on an imported and active pool it is possible, though unlikely, When operating on an imported and active pool it is possible, though unlikely,
that zdb may interpret inconsistent pool data and behave erratically. that zdb may interpret inconsistent pool data and behave erratically.
.Sh OPTIONS .Sh OPTIONS

View File

@ -3559,6 +3559,7 @@ main(int argc, char **argv)
uint64_t max_txg = UINT64_MAX; uint64_t max_txg = UINT64_MAX;
int rewind = ZPOOL_NEVER_REWIND; int rewind = ZPOOL_NEVER_REWIND;
char *spa_config_path_env; char *spa_config_path_env;
boolean_t target_is_spa = B_TRUE;
(void) setrlimit(RLIMIT_NOFILE, &rl); (void) setrlimit(RLIMIT_NOFILE, &rl);
(void) enable_extended_FILE_stdio(-1, -1); (void) enable_extended_FILE_stdio(-1, -1);
@ -3738,8 +3739,23 @@ main(int argc, char **argv)
} }
} }
if (strpbrk(target, "/@") != NULL) {
size_t targetlen;
target_is_spa = B_FALSE;
/*
* Remove any trailing slash. Later code would get confused
* by it, but we want to allow it so that "pool/" can
* indicate that we want to dump the topmost filesystem,
* rather than the whole pool.
*/
targetlen = strlen(target);
if (targetlen != 0 && target[targetlen - 1] == '/')
target[targetlen - 1] = '\0';
}
if (error == 0) { if (error == 0) {
if (strpbrk(target, "/@") == NULL || dump_opt['R']) { if (target_is_spa || dump_opt['R']) {
error = spa_open_rewind(target, &spa, FTAG, policy, error = spa_open_rewind(target, &spa, FTAG, policy,
NULL); NULL);
if (error) { if (error) {