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 is of the CDDL is also available via the Internet
12# at http://www.illumos.org/license/CDDL.
13#
14# CDDL HEADER END
15#
16
17#
18# Copyright(c) 2018 Datto Inc.
19#
20
21. $STF_SUITE/include/libtest.shlib
22
23#
24# DESCRIPTION:
25# Verify multi mount functionality
26#
27# STRATEGY:
28# 1. Create fs
29# 2. Create and hold open file in filesystem
30# 3. Lazy unmount
31# 4. Verify remounting fs that was lazily unmounted is possible
32# 5. Verify multiple mounts of the same dataset are possible
33# 6. Verify bind mount doesn't prevent rename
34#
35
36verify_runnable "both"
37
38function cleanup
39{
40	ismounted $MNTPFS && log_must umount $MNTPFS
41	ismounted $MNTPFS2 && log_must umount $MNTPFS2
42	ismounted $MNTPFS3 && log_must umount $MNTPFS3
43	ismounted $MNTPFS4 && log_must umount $MNTPFS4
44	ismounted $RENAMEMNT && log_must umount $RENAMEMNT
45	datasetexists $TESTDS && log_must destroy_dataset "$TESTDS" "-f"
46}
47log_onexit cleanup
48
49log_assert "Verify multiple mounts into one namespace are possible"
50
51# 1. Create fs
52TESTDS="$TESTPOOL/multi-mount-test"
53log_must zfs create $TESTDS
54
55# 2. Create and hold open file in filesystem
56MNTPFS="$(get_prop mountpoint $TESTDS)"
57FILENAME="$MNTPFS/file"
58log_must mkfile 128k $FILENAME
59log_must exec 9<> $FILENAME # open file
60
61# 3. Lazy umount
62if is_freebsd; then
63	# FreeBSD does not support lazy unmount
64	log_must umount $MNTPFS
65else
66	log_must umount -l $MNTPFS
67fi
68if [ -f $FILENAME ]; then
69	log_fail "Lazy unmount failed"
70fi
71
72# 4. Verify remounting fs that was lazily unmounted is possible
73log_must zfs mount $TESTDS
74if [ ! -f $FILENAME ]; then
75	log_fail "Lazy remount failed"
76fi
77log_must exec 9>&- # close fd
78
79# 5. Verify multiple mounts of the same dataset are possible
80MNTPFS2="$MNTPFS-second"
81FILENAME="$MNTPFS2/file"
82log_must mkdir $MNTPFS2
83log_must mount -t zfs -o zfsutil $TESTDS $MNTPFS2
84if [ ! -f $FILENAME ]; then
85	log_fail "First multi mount failed"
86fi
87
88MNTPFS3="$MNTPFS-third"
89FILENAME="$MNTPFS3/file"
90log_must mkdir $MNTPFS3
91log_must mount -t zfs -o zfsutil $TESTDS $MNTPFS3
92if [ ! -f $FILENAME ]; then
93	log_fail "Second multi mount failed"
94fi
95
96# 6. Verify bind mount doesn't prevent rename
97RENAMEFS="$TESTDS-newname"
98MNTPFS4="$MNTPFS-fourth"
99log_must mkdir $MNTPFS4
100log_must mount --bind $MNTPFS $MNTPFS4
101log_must zfs rename $TESTDS $RENAMEFS
102RENAMEMNT="$(get_prop mountpoint $RENAMEFS)"
103FILENAME="$RENAMEMNT/file"
104if [ ! -f $FILENAME ]; then
105	log_fail "Rename failed"
106fi
107log_must zfs rename $RENAMEFS $TESTDS
108
109log_pass "Multiple mounts are possible"
110