xref: /illumos-gate/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_mountpoints.ksh (revision e153cda9f9660e385e8f468253f80e59f5d454d7)
1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# This file and its contents are supplied under the terms of the
6# Common Development and Distribution License ("CDDL"), version 1.0.
7# You may only use this file in accordance with the terms of version
8# 1.0 of the CDDL.
9#
10# A full copy of the text of the CDDL should have accompanied this
11# source.  A copy of the CDDL is also available via the Internet at
12# http://www.illumos.org/license/CDDL.
13#
14# CDDL HEADER END
15#
16
17#
18# Copyright (c) 2017 by Delphix. All rights reserved.
19#
20
21. $STF_SUITE/include/libtest.shlib
22. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib
23
24# DESCRIPTION:
25#       Verify that 'zfs mount -a' succeeds given a set of filesystems
26#       whose mountpoints have a parent/child relationship which is
27#       counter to the filesystem parent/child relationship.
28#
29# STRATEGY:
30#       1. Create zfs filesystems within the given pool.
31#       2. Unmount all the filesystems.
32#       3. Verify that 'zfs mount -a' command succeed,
33#	   and all available ZFS filesystems are mounted.
34#	4. Verify that 'zfs mount' is identical with 'df -F zfs'
35#
36
37verify_runnable "both"
38
39typeset -a filesystems
40
41function setup_all
42{
43	typeset path=${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL
44	typeset fscount=10
45
46	#
47	# Generate an array of filesystem names that represent a deep
48	# hierarchy as such:
49	#
50	# 0
51	# 0/1
52	# 0/1/2
53	# 0/1/2/3
54	# 0/1/2/3/4
55	# ...
56	#
57	fs=0
58	for ((i=0; i<$fscount; i++)); do
59		if [[ $i -gt 0 ]]; then
60			fs=$fs/$i
61		fi
62		filesystems+=($fs)
63	done
64
65	# Create all of the above filesystems
66	for ((i=0; i<$fscount; i++)); do
67		fs=${filesystems[$i]}
68		setup_filesystem "$DISKS" "$TESTPOOL" "$fs" "$path/$i" ctr
69	done
70
71	zfs list -r $TESTPOOL
72
73	#
74	# Unmount all of the above so that we can setup our convoluted
75	# mount paths.
76	#
77	export __ZFS_POOL_RESTRICT="$TESTPOOL"
78	log_must zfs $unmountall
79	unset __ZFS_POOL_RESTRICT
80
81	#
82	# Configure the mount paths so that each mountpoint is contained
83	# in a child filesystem. We should end up with something like the
84	# following structure (modulo the number of filesystems):
85	#
86	# NAME                       MOUNTPOINT
87	# testpool                   /testpool
88	# testpool/0                 /testroot25416/testpool/0/1/2/3/4/5/6
89	# testpool/0/1               /testroot25416/testpool/0/1/2/3/4/5
90	# testpool/0/1/2             /testroot25416/testpool/0/1/2/3/4
91	# testpool/0/1/2/3           /testroot25416/testpool/0/1/2/3
92	# testpool/0/1/2/3/4         /testroot25416/testpool/0/1/2
93	# testpool/0/1/2/3/4/5       /testroot25416/testpool/0/1
94	# testpool/0/1/2/3/4/5/6     /testroot25416/testpool/0
95	#
96	for ((i=0; i<$fscount; i++)); do
97		fs=$TESTPOOL/${filesystems[$(($fscount - $i - 1))]}
98		mnt=$path/${filesystems[$i]}
99		zfs set mountpoint=$mnt $fs
100	done
101
102	zfs list -r $TESTPOOL
103
104	return 0
105}
106
107function cleanup_all
108{
109	export __ZFS_POOL_RESTRICT="$TESTPOOL"
110	log_must zfs $unmountall
111	unset __ZFS_POOL_RESTRICT
112
113	for fs in ${filesystems[@]}; do
114		cleanup_filesystem "$TESTPOOL" "$fs"
115	done
116	[[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \
117		rm -rf ${TEST_BASE_DIR%%/}/testroot$$
118}
119
120#
121# This function takes a single true/false argument. If true it will verify that
122# all file systems are mounted. If false it will verify that they are not
123# mounted.
124#
125function verify_all
126{
127	if $1; then
128		logfunc=log_must
129	else
130		logfunc=log_mustnot
131	fi
132
133	for fs in ${filesystems[@]}; do
134		$logfunc mounted "$TESTPOOL/$fs"
135	done
136
137	return 0
138}
139
140log_onexit cleanup_all
141
142log_must setup_all
143
144export __ZFS_POOL_RESTRICT="$TESTPOOL"
145log_must zfs $unmountall
146unset __ZFS_POOL_RESTRICT
147
148verify_all false
149
150export __ZFS_POOL_RESTRICT="$TESTPOOL"
151log_must zfs $mountall
152unset __ZFS_POOL_RESTRICT
153
154verify_all true
155
156log_note "Verify that 'zfs $mountcmd' will display " \
157	"all ZFS filesystems currently mounted."
158
159verify_mount_display
160
161log_pass "'zfs $mountall' succeeds as root, " \
162	"and all available ZFS filesystems are mounted."
163