zfs.c revision 9966ca11f4a1481acce85f690fa59e4084050627
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER START
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The contents of this file are subject to the terms of the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Common Development and Distribution License (the "License").
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You may not use this file except in compliance with the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * See the License for the specific language governing permissions
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * and limitations under the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * When distributing Covered Code, include this CDDL HEADER in each
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If applicable, add the following below this CDDL HEADER, with the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * fields enclosed by brackets "[]" replaced with your own identifying
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * information: Portions Copyright [yyyy] [name of copyright owner]
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER END
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../genunix/list.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemlocal_strdup(const char *s)
18c2aff776a775d34a4c9893a4c72e0434d68e36artemgetmember(uintptr_t addr, const char *type, mdb_ctf_id_t *idp,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mdb_warn("couldn't find member %s of type %s\n", member, type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mdb_warn("member %s of type %s is unsupported bitfield",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* mdb_warn("read %s from %s at %p+%llx\n", member, type, addr, off); */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem getmember(addr, #type, NULL, #member, sizeof (dest), &(dest))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem getmember(addr, NULL, ctfid, #member, sizeof (dest), &(dest))
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static int gotid;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mdb_ctf_lookup_by_name("struct refcount", &rc_id) == -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mdb_warn("couldn't find member %s of type %s\n", member, name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (GETMEMBID(addr + off, &rc_id, rc_count, *rc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mdb_lookup_by_obj(MDB_TGT_OBJ_EVERY, sym_name, &sym)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mdb_vread(*bufp, sym.st_size, sym.st_value) == -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mdb_vread(&entry, sizeof (entry), wsp->walk_addr) == -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mdb_warn("failed to read freelist entry %p", wsp->walk_addr);
if (verbose)
return (WALK_NEXT);
static int gotid;
if (!gotid) {
return (DCMD_ERR);
return (DCMD_ERR);
if (dd_parent) {
return (DCMD_ERR);
if (dd_myname[0])
static int gotid;
if (!gotid) {
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_ERR);
if (os_dsl_dataset == 0) {
return (DCMD_ERR);
return (DCMD_ERR);
if (ds_snapname[0]) {
const char *prefix)
const char *cp;
return (DCMD_ERR);
return (DCMD_OK);
static const char *params[] = {
int sz;
return (DCMD_OK);
return (DCMD_ERR);
return (DCMD_ERR);
for (i = 0; i < DMU_OT_NUMTYPES; i++) {
return (DCMD_ERR);
for (i = 0; i < ZIO_CHECKSUM_FUNCTIONS; i++) {
return (DCMD_ERR);
for (i = 0; i < ZIO_COMPRESS_FUNCTIONS; i++) {
return (DCMD_OK);
return (DCMD_ERR);
return (WALK_ERR);
return (WALK_ERR);
return (WALK_ERR);
return (DCMD_OK);
int i, maxidx;
return (DCMD_ERR);
for (i = 0; i < HISTOSZ; i++) {
histo[i] = 0;
histo2[i] = 0;
ndbufs = 0;
int len;
return (DCMD_ERR);
len = 0;
while (dbp != 0) {
return (DCMD_ERR);
histo2[i]++;
len++;
ndbufs++;
maxidx = 0;
for (i = 0; i < HISTOSZ; i++)
if (histo[i] > 0)
maxidx = i;
for (i = 0; i <= maxidx; i++)
maxidx = 0;
for (i = 0; i < HISTOSZ; i++)
if (histo2[i] > 0)
maxidx = i;
for (i = 0; i <= maxidx; i++)
return (DCMD_OK);
typedef struct dbufs_data {
char *osname;
} dbufs_data_t;
return (WALK_ERR);
return (WALK_NEXT);
return (DCMD_USAGE);
if (object) {
if (blkid) {
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_OK);
typedef struct abuf_find_data {
return (WALK_ERR);
return (WALK_NEXT);
const char *syms[] = {
return (DCMD_USAGE);
case MDB_TYPE_STRING:
case MDB_TYPE_IMMEDIATE:
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_OK);
int nstats, i;
const char *suffix;
static const char *bytestats[] = {
static const char *extras[] = {
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_USAGE);
switch (shift) {
for (i = 0; i < nstats; i++) {
for (j = 0; bytestats[j]; j++) {
if (bytes) {
for (i = 0; extras[i]; i++) {
return (DCMD_ERR);
extras[i]);
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_OK);
const char *state;
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_OK);
return (DCMD_OK);
return (DCMD_ERR);
if (config) {
return (DCMD_ERR);
mdb_arg_t v;
&v) != DCMD_OK)
return (DCMD_ERR);
return (DCMD_OK);
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_OK);
0, NULL));
int recursive)
int c, children;
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_ERR);
case VDEV_STATE_CLOSED:
case VDEV_STATE_OFFLINE:
case VDEV_STATE_CANT_OPEN:
case VDEV_STATE_DEGRADED:
case VDEV_STATE_HEALTHY:
case VDEV_STATE_REMOVED:
case VDEV_STATE_FAULTED:
case VDEV_AUX_NONE:
case VDEV_AUX_OPEN_FAILED:
case VDEV_AUX_CORRUPT_DATA:
case VDEV_AUX_NO_REPLICAS:
case VDEV_AUX_BAD_GUID_SUM:
case VDEV_AUX_TOO_SMALL:
case VDEV_AUX_BAD_LABEL:
case VDEV_AUX_VERSION_NEWER:
case VDEV_AUX_VERSION_OLDER:
case VDEV_AUX_SPARED:
case VDEV_AUX_ERR_EXCEEDED:
case VDEV_AUX_IO_FAILURE:
case VDEV_AUX_BAD_LOG:
if (stats) {
if (stats)
return (DCMD_OK);
return (DCMD_ERR);
for (c = 0; c < children; c++) {
return (DCMD_ERR);
return (DCMD_OK);
return (DCMD_USAGE);
return (DCMD_ERR);
typedef struct metaslab_walk_data {
int mw_curvdev;
int mw_curms;
return (WALK_DONE);
return (WALK_ERR);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_ERR);
return (DCMD_ERR);
return (DCMD_ERR);
return (WALK_NEXT);
typedef struct mdb_spa {
} mdb_spa_t;
typedef struct mdb_dsl_dir {
typedef struct mdb_dsl_dir_phys {
typedef struct mdb_vdev {
} mdb_vdev_t;
typedef struct mdb_metaslab {
typedef struct space_data {
} space_data_t;
return (WALK_ERR);
return (WALK_NEXT);
argc)
return (DCMD_USAGE);
return (DCMD_USAGE);
if (bits) {
shift = 0;
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_OK);
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_OK);
return (DCMD_OK);
const char *name)
int ret, i;
return (DCMD_ERR);
return (ret);
int ret;
return (DCMD_USAGE);
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_OK);
return (ret);
return (DCMD_ERR);
return (DCMD_OK);
#define ZIO_WALK_SELF 0
typedef struct zio_print_args {
int zpa_current_depth;
int zpa_min_depth;
int zpa_max_depth;
int zpa_type;
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_ERR);
return (DCMD_USAGE);
return (DCMD_USAGE);
return (DCMD_ERR);
return (DCMD_ERR);
return (DCMD_OK);
addr = 0;
typedef struct txg_list_walk_data {
int lw_txgoff;
int lw_maxoff;
void *lw_obj;
return (WALK_ERR);
for (i = 0; i < TXG_SIZE; i++)
return (WALK_NEXT);
int status;
return (WALK_DONE);
return (WALK_ERR);
return (status);
return (WALK_ERR);
return (WALK_ERR);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_ERR);
return (WALK_NEXT);
return (WALK_NEXT);
for (i = frac_digits; i; i--)
int index = 0;
index++;
if (index == 0) {
(u_longlong_t)n);
(u_longlong_t)n, u);
return (DCMD_ERR);
return (DCMD_USAGE);
return (DCMD_USAGE);
return (DCMD_ERR);
if (ditto != 0) {
for (t = 0; t <= DMU_OT_NUMTYPES; t++) {
if (t == DMU_OT_DEFERRED)
else if (t == DMU_OT_TOTAL)
return (DCMD_ERR);
return (DCMD_OK);
static int gotid;
if (!gotid) {
return (WALK_ERR);
return (WALK_ERR);
char *cp;
if (removed)
if (holder_is_str)
if (removed) {
return (WALK_NEXT);
static int gotid;
return (DCMD_USAGE);
if (!gotid) {
return (DCMD_ERR);
return (DCMD_ERR);
if (rc_count > 0)
return (DCMD_ERR);
if (rc_removed_count > 0)
return (DCMD_ERR);
return (DCMD_OK);
abuf_find },
zfs_blkstats },
{ NULL }
#ifndef _KERNEL
{ NULL }
const mdb_modinfo_t *
_mdb_init(void)
return (&modinfo);