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