]> git.proxmox.com Git - mirror_zfs.git/blame - tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_remount.ksh
Update ZTS to work on FreeBSD
[mirror_zfs.git] / tests / zfs-tests / tests / functional / cli_root / zfs_mount / zfs_mount_remount.ksh
CommitLineData
08de8c16 1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
25#
26
27. $STF_SUITE/include/libtest.shlib
28. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib
29
30#
31# DESCRIPTION:
cb14aa4c 32# Verify remount functionality, especially on readonly objects.
08de8c16 33#
34# STRATEGY:
35# 1. Prepare a filesystem and a snapshot
36# 2. Verify we can (re)mount the dataset readonly/read-write
37# 3. Verify we can mount the snapshot and it's mounted readonly
38# 4. Verify we can't remount it read-write
47ab01a1
TC
39# 5. Verify we can remount a dataset readonly and unmount it with
40# encryption=on and sync=disabled (issue #7753)
41# 6. Re-import the pool readonly
42# 7. Verify we can't remount its filesystem read-write
08de8c16 43#
44
45verify_runnable "both"
46
47function cleanup
48{
3fd3e56c 49 log_must_busy zpool export $TESTPOOL
08de8c16 50 log_must zpool import $TESTPOOL
51 snapexists $TESTSNAP && log_must zfs destroy $TESTSNAP
52 [[ -d $MNTPSNAP ]] && log_must rmdir $MNTPSNAP
53 return 0
54}
55
7839c4b5
MM
56if is_freebsd; then
57 typeset RO="-t zfs -ur"
58 typeset RW="-t zfs -uw"
59else
60 typeset RO="-o remount,ro"
61 typeset RW="-o remount,rw"
62fi
63
08de8c16 64#
65# Verify the $filesystem is mounted readonly
66# This is preferred over "log_mustnot touch $fs" because we actually want to
67# verify the error returned is EROFS
68#
69function readonlyfs # filesystem
70{
71 typeset filesystem="$1"
72
73 file_write -o create -f $filesystem/file.dat
74 ret=$?
75 if [[ $ret != 30 ]]; then
76 log_fail "Writing to $filesystem did not return EROFS ($ret)."
77 fi
78}
79
80#
81# Verify $dataset is mounted with $option
82#
83function checkmount # dataset option
84{
85 typeset dataset="$1"
86 typeset option="$2"
7839c4b5 87 typeset options=""
08de8c16 88
7839c4b5
MM
89 if is_freebsd; then
90 options=$(mount -p | awk -v ds="$dataset" '$1 == ds { print $4 }')
91 else
92 options=$(awk -v ds="$dataset" '$1 == ds { print $4 }' /proc/mounts)
93 fi
08de8c16 94 if [[ "$options" == '' ]]; then
95 log_fail "Dataset $dataset is not mounted"
96 elif [[ ! -z "${options##*$option*}" ]]; then
97 log_fail "Dataset $dataset is not mounted with expected "\
98 "option $option ($options)"
99 else
100 log_note "Dataset $dataset is mounted with option $option"
101 fi
102}
103
104log_assert "Verify remount functionality on both filesystem and snapshots"
105
106log_onexit cleanup
107
108# 1. Prepare a filesystem and a snapshot
109TESTFS=$TESTPOOL/$TESTFS
110TESTSNAP="$TESTFS@snap"
111datasetexists $TESTFS || log_must zfs create $TESTFS
112snapexists $TESTSNAP || log_must zfs snapshot $TESTSNAP
113log_must zfs set readonly=off $TESTFS
114MNTPFS="$(get_prop mountpoint $TESTFS)"
115MNTPSNAP="$TESTDIR/zfs_snap_mount"
116log_must mkdir -p $MNTPSNAP
117
118# 2. Verify we can (re)mount the dataset readonly/read-write
119log_must touch $MNTPFS/file.dat
120checkmount $TESTFS 'rw'
7839c4b5 121log_must mount $RO $TESTFS $MNTPFS
08de8c16 122readonlyfs $MNTPFS
123checkmount $TESTFS 'ro'
7839c4b5 124log_must mount $RW $TESTFS $MNTPFS
08de8c16 125log_must touch $MNTPFS/file.dat
126checkmount $TESTFS 'rw'
127
7839c4b5
MM
128if is_linux; then
129 # 3. Verify we can (re)mount the snapshot readonly
130 log_must mount -t zfs $TESTSNAP $MNTPSNAP
131 readonlyfs $MNTPSNAP
132 checkmount $TESTSNAP 'ro'
133 log_must mount $RO $TESTSNAP $MNTPSNAP
134 readonlyfs $MNTPSNAP
135 checkmount $TESTSNAP 'ro'
136 log_must umount $MNTPSNAP
137fi
08de8c16 138
139# 4. Verify we can't remount a snapshot read-write
140# The "mount -o rw" command will succeed but the snapshot is mounted readonly.
141# The "mount -o remount,rw" command must fail with an explicit error.
142log_must mount -t zfs -o rw $TESTSNAP $MNTPSNAP
143readonlyfs $MNTPSNAP
144checkmount $TESTSNAP 'ro'
7839c4b5 145log_mustnot mount $RW $TESTSNAP $MNTPSNAP
08de8c16 146readonlyfs $MNTPSNAP
147checkmount $TESTSNAP 'ro'
148log_must umount $MNTPSNAP
149
47ab01a1
TC
150# 5. Verify we can remount a dataset readonly and unmount it with
151# encryption=on and sync=disabled (issue #7753)
152log_must eval "echo 'password' | zfs create -o sync=disabled \
153 -o encryption=on -o keyformat=passphrase $TESTFS/crypt"
154CRYPT_MNTPFS="$(get_prop mountpoint $TESTFS/crypt)"
155log_must touch $CRYPT_MNTPFS/file.dat
7839c4b5 156log_must mount $RO $TESTFS/crypt $CRYPT_MNTPFS
47ab01a1
TC
157log_must umount -f $CRYPT_MNTPFS
158zpool sync $TESTPOOL
159
160# 6. Re-import the pool readonly
08de8c16 161log_must zpool export $TESTPOOL
162log_must zpool import -o readonly=on $TESTPOOL
163
47ab01a1 164# 7. Verify we can't remount its filesystem read-write
08de8c16 165readonlyfs $MNTPFS
166checkmount $TESTFS 'ro'
7839c4b5 167log_mustnot mount $RW $MNTPFS
08de8c16 168readonlyfs $MNTPFS
169checkmount $TESTFS 'ro'
170
171log_pass "Both filesystem and snapshots can be remounted correctly."