1#!/bin/ksh 2 3# 4# This file and its contents are supplied under the terms of the 5# Common Development and Distribution License ("CDDL"), version 1.0. 6# You may only use this file in accordance with the terms of version 7# 1.0 of the CDDL. 8# 9# A full copy of the text of the CDDL should have accompanied this 10# source. A copy of the CDDL is also available via the Internet at 11# http://www.illumos.org/license/CDDL. 12# 13 14# 15# Copyright (c) 2017 by Lawrence Livermore National Security, LLC. 16# Copyright (c) 2020 by Delphix. All rights reserved. 17# 18 19. $STF_SUITE/include/libtest.shlib 20 21# 22# Description: 23# zdb will not produce redundant dumps of uberblocks 24# 25# Strategy: 26# 1. Create a pool with two vdevs, A and B 27# 2. Offline vdev A 28# 3. Do some I/O 29# 4. Export the pool 30# 5. Copy label 1 from vdev A to vdev B 31# 6. Collect zdb -lu output for vdev B 32# 7. Verify labels 0 and 1 have unique Uberblocks, but 2 and 3 have none 33# 34 35log_assert "Verify zdb produces unique dumps of uberblocks" 36log_onexit cleanup 37 38function cleanup 39{ 40 datasetexists $TESTPOOL && destroy_pool $TESTPOOL 41 for DISK in $DISKS; do 42 zpool labelclear -f $DEV_RDSKDIR/$DISK 43 done 44 if is_freebsd; then 45 log_must sysctl kern.geom.debugflags=$saved_debugflags 46 fi 47} 48 49if is_freebsd; then 50 # FreeBSD won't allow writing to an in-use device without this set 51 saved_debugflags=$(sysctl -n kern.geom.debugflags) 52 log_must sysctl kern.geom.debugflags=16 53fi 54 55verify_runnable "global" 56verify_disk_count "$DISKS" 2 57set -A DISK $DISKS 58WHOLE_DISK=${DISK[0]} 59 60default_mirror_setup_noexit $DISKS 61DEVS=$(get_pool_devices ${TESTPOOL} ${DEV_RDSKDIR}) 62[[ -n $DEVS ]] && set -A DISK $DEVS 63 64log_must zpool offline $TESTPOOL $WHOLE_DISK 65log_must dd if=/dev/urandom of=$TESTDIR/testfile bs=1K count=2 66log_must zpool export $TESTPOOL 67 68log_must dd if=$DEV_RDSKDIR/${DISK[0]} of=$DEV_RDSKDIR/${DISK[1]} bs=1K count=256 conv=notrunc 69 70ubs=$(zdb -lu ${DISK[1]} | grep -e LABEL -e Uberblock -e 'labels = ') 71log_note "vdev 1: ubs $ubs" 72 73set -o pipefail 74ub_dump_counts=$(zdb -lu ${DISK[1]} | \ 75 awk ' /LABEL/ {label=$NF; blocks[label]=0}; 76 /Uberblock/ {blocks[label]++}; 77 END {print blocks[0],blocks[1],blocks[2],blocks[3]}') || 78 log_fail "failed to get ub_dump_counts from DISK[1]" 79log_note "vdev 1: ub_dump_counts $ub_dump_counts" 80set +o pipefail 81 82set -A dump_count $ub_dump_counts 83for label in 0 1 2 3; do 84 if [[ $label -lt 2 ]]; then 85 [[ ${dump_count[$label]} -eq 0 ]] && \ 86 log_fail "zdb incorrectly dumps duplicate uberblocks" 87 else 88 [[ ${dump_count[$label]} -ne 0 ]] && \ 89 log_fail "zdb incorrectly dumps duplicate uberblocks" 90 fi 91done 92 93cleanup 94 95log_pass "zdb produces unique dumps of uberblocks" 96