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) 2020 by Datto, Inc. All rights reserved. 16# 17 18. $STF_SUITE/include/libtest.shlib 19 20# 21# Description: 22# zdb -d pool/<objset id> will display the dataset 23# 24# Strategy: 25# 1. Create a pool 26# 2. Write some data to a file 27# 3. Get the inode number (object number) of the file 28# 4. Run zdb -d to get the objset ID of the dataset 29# 5. Run zdb -dddddd pool/objsetID objectID (decimal) 30# 6. Confirm names 31# 7. Run zdb -dddddd pool/objsetID objectID (hex) 32# 8. Confirm names 33# 9. Repeat with zdb -NNNNNN pool/objsetID objectID 34# 10. Obtain objsetID from /proc/spl/kstat/zfs/testpool/obset-0x<ID> 35# (linux only) 36# 11. Run zdb -dddddd pool/objsetID (hex) 37# 12. Match name from zdb against proc entry 38# 13. Create dataset with hex numeric name 39# 14. Create dataset with decimal numeric name 40# 15. zdb -d for numeric datasets succeeds 41# 16. zdb -N for numeric datasets fails 42# 17. zdb -dN for numeric datasets fails 43# 44 45function cleanup 46{ 47 datasetexists $TESTPOOL && destroy_pool $TESTPOOL 48} 49 50log_assert "Verify zdb -d <pool>/<objset ID> generates the correct names." 51log_onexit cleanup 52init_data=$TESTDIR/file1 53write_count=8 54blksize=131072 55verify_runnable "global" 56verify_disk_count "$DISKS" 2 57hex_ds=$TESTPOOL/0x400000 58num_ds=$TESTPOOL/100000 59 60default_mirror_setup_noexit $DISKS 61file_write -o create -w -f $init_data -b $blksize -c $write_count 62 63# get object number of file 64listing=$(ls -i $init_data) 65set -A array $listing 66obj=${array[0]} 67log_note "file $init_data has object number $obj" 68sync_pool $TESTPOOL 69 70IFS=", " read -r _ _ _ _ objset_id _ < <(zdb -d $TESTPOOL/$TESTFS) 71objset_hex=$(printf "0x%X" $objset_id) 72log_note "objset $TESTPOOL/$TESTFS has objset ID $objset_id ($objset_hex)" 73 74for id in "$objset_id" "$objset_hex" 75do 76 log_note "zdb -dddddd $TESTPOOL/$id $obj" 77 output=$(zdb -dddddd $TESTPOOL/$id $obj) 78 echo $output | grep -q "$TESTPOOL/$TESTFS" || 79 log_fail "zdb -dddddd $TESTPOOL/$id $obj failed ($TESTPOOL/$TESTFS not in zdb output)" 80 echo $output | grep -q "file1" || 81 log_fail "zdb -dddddd $TESTPOOL/$id $obj failed (file1 not in zdb output)" 82 83 obj=$(printf "0x%X" $obj) 84 log_note "zdb -NNNNNN $TESTPOOL/$id $obj" 85 output=$(zdb -NNNNNN $TESTPOOL/$id $obj) 86 echo $output | grep -q "$TESTPOOL/$TESTFS" || 87 log_fail "zdb -NNNNNN $TESTPOOL/$id $obj failed ($TESTPOOL/$TESTFS not in zdb output)" 88 echo $output | grep -q "file1" || 89 log_fail "zdb -NNNNNN $TESTPOOL/$id $obj failed (file1 not in zdb output)" 90done 91 92if is_linux; then 93 output=$(ls -1 /proc/spl/kstat/zfs/$TESTPOOL | grep objset- | tail -1) 94 objset_hex=${output#*-} 95 name_from_proc=$(grep dataset_name /proc/spl/kstat/zfs/$TESTPOOL/$output | cut -d' ' -f3) 96 log_note "checking zdb output for $name_from_proc" 97 log_must eval "zdb -dddddd $TESTPOOL/$objset_hex | grep -q \"$name_from_proc\"" 98fi 99 100log_must zfs create $hex_ds 101log_must zfs create $num_ds 102log_must eval "zdb -d $hex_ds | grep -q \"$hex_ds\"" 103log_must eval "zdb -d $num_ds | grep -q \"$num_ds\"" 104 105# force numeric interpretation, expect fail 106log_mustnot zdb -N $hex_ds 107log_mustnot zdb -N $num_ds 108log_mustnot zdb -Nd $hex_ds 109log_mustnot zdb -Nd $num_ds 110 111log_pass "zdb -d <pool>/<objset ID> generates the correct names." 112