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 44 function cleanup 45 { 46 $RM -f $OUTFILE 47 } 48 49 verify_runnable "global" 50 log_onexit cleanup 51 52 OUTFILE='/var/tmp/mdb-outfile' 53 set -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 77 log_assert "Verify that the ZFS mdb dcmds and walkers are working as expected." 78 79 typeset -i RET=0 80 81 i=0 82 while (( $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)) 103 done 104 105 log_pass "The ZFS mdb dcmds and walkers are working as expected."