1#!/bin/ksh -p 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License (the "License"). 7# You may not use this file except in compliance with the License. 8# 9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10# or http://www.opensolaris.org/os/licensing. 11# See the License for the specific language governing permissions 12# and limitations under the License. 13# 14# When distributing Covered Code, include this CDDL HEADER in each 15# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16# If applicable, add the following below this CDDL HEADER, with the 17# fields enclosed by brackets "[]" replaced with your own identifying 18# information: Portions Copyright [yyyy] [name of copyright owner] 19# 20# CDDL HEADER END 21# 22 23# 24# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25# Use is subject to license terms. 26# 27 28# 29# Copyright (c) 2013 by Delphix. All rights reserved. 30# 31 32. $STF_SUITE/include/libtest.shlib 33 34# 35# DESCRIPTION: 36# Verify that the ZFS mdb dcmds and walkers are working as expected. 37# 38# STRATEGY: 39# 1) Given a list of dcmds and walkers 40# 2) Step through each element of the list 41# 3) Verify the output by checking for "mdb:" in the output string 42# 43 44function cleanup 45{ 46 $RM -f $OUTFILE 47} 48 49verify_runnable "global" 50log_onexit cleanup 51 52OUTFILE='/var/tmp/mdb-outfile' 53set -A dcmds "::walk spa" \ 54 "::walk spa | ::spa " \ 55 "::walk spa | ::spa -c" \ 56 "::walk spa | ::spa -v" \ 57 "::walk spa | ::spa_config" \ 58 "::walk spa | ::spa_space" \ 59 "::walk spa | ::spa_space -b" \ 60 "::walk spa | ::spa_vdevs" \ 61 "::walk spa | ::walk metaslab" \ 62 "::walk spa | ::print struct spa spa_root_vdev | ::vdev" \ 63 "::walk spa | ::print struct spa spa_root_vdev | ::vdev -re" \ 64 "::dbufs" \ 65 "::dbufs -n mos -o mdn -l 0 -b 0" \ 66 "::dbufs | ::dbuf" \ 67 "::dbuf_stats" \ 68 "::abuf_find 1 2" \ 69 "::walk spa | ::print -a struct spa spa_uberblock.ub_rootbp | ::blkptr" \ 70 "::walk spa | ::print -a struct spa spa_dsl_pool->dp_dirty_datasets | ::walk txg_list" \ 71 "::walk spa | ::walk zms_freelist" 72# 73# The commands above were supplied by the ZFS development team. The idea is to 74# do as much checking as possible without the need to hardcode addresses. 75# 76 77log_assert "Verify that the ZFS mdb dcmds and walkers are working as expected." 78 79typeset -i RET=0 80 81i=0 82while (( $i < ${#dcmds[*]} )); do 83 log_note "Verifying: '${dcmds[i]}'" 84 $ECHO "${dcmds[i]}" | $MDB -k > $OUTFILE 2>&1 85 RET=$? 86 if (( $RET != 0 )); then 87 log_fail "mdb '${dcmds[i]}' returned error $RET" 88 fi 89 90 # 91 # mdb prefixes all errors with "mdb: " so we check the output. 92 # 93 $GREP "mdb:" $OUTFILE > /dev/null 2>&1 94 RET=$? 95 if (( $RET == 0 )); then 96 $ECHO "mdb '${dcmds[i]}' contained 'mdb:'" 97 # Using $TAIL limits the number of lines in the log 98 $TAIL -100 $OUTFILE 99 log_fail "mdb walker or dcmd failed" 100 fi 101 102 ((i = i + 1)) 103done 104 105log_pass "The ZFS mdb dcmds and walkers are working as expected." 106