#!/bin/ksh -p # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # # Copyright (c) 2016 by Delphix. All rights reserved. # . $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib # # DESCRIPTION: # The following options can be set on a temporary basis using the -o option # without affecting the on-disk property. The original on-disk value will be # restored when the file system is unmounted and mounted. # # PROPERTY MOUNT OPTION # atime atime/noatime # devices devices/nodevices # exec exec/noexec # readonly ro/rw # setuid setuid/nosetuid # # STRATEGY: # 1. Create filesystem and get original property value. # 2. Using 'zfs mount -o' to set filesystem property. # 3. Verify the property was set temporarily. # 4. Verify it will not affect the property that is stored on disk. # function cleanup { if ! ismounted $TESTPOOL/$TESTFS; then log_must zfs mount $TESTPOOL/$TESTFS fi } log_assert "Verify '-o' will set filesystem property temporarily, " \ "without affecting the property that is stored on disk." log_onexit cleanup set -A properties "atime" "exec" "readonly" "setuid" if ! is_freebsd; then properties+=("devices") fi # # Get the specified filesystem property reverse mount option. # # $1 filesystem # $2 property # function get_reverse_option { typeset fs=$1 typeset prop=$2 # Define property value: "reverse if value=on" "reverse if value=off" if is_linux; then set -A values "noatime" "atime" \ "noexec" "exec" \ "rw" "ro" \ "nosuid" "suid" \ "nodev" "dev" elif is_freebsd; then set -A values "noatime" "atime" \ "noexec" "exec" \ "rw" "ro" \ "nosetuid" "setuid" else set -A values "noatime" "atime" \ "noexec" "exec" \ "rw" "ro" \ "nosetuid" "setuid" \ "nodevices" "devices" fi typeset -i i=0 while (( i < ${#properties[@]} )); do if [[ $prop == ${properties[$i]} ]]; then break fi (( i += 1 )) done if (( i >= ${#properties[@]} )); then log_fail "Incorrect option: $prop" fi typeset val typeset -i ind=0 val=$(get_prop $prop $fs) || log_fail "get_prop $prop $fs" if [[ $val == "on" ]]; then (( ind = i * 2 )) else (( ind = i * 2 + 1 )) fi echo ${values[$ind]} } fs=$TESTPOOL/$TESTFS cleanup for property in ${properties[@]}; do orig_val=$(get_prop $property $fs) (($? != 0)) && log_fail "get_prop $property $fs" # Set filesystem property temporarily reverse_opt=$(get_reverse_option $fs $property) log_must zfs unmount $fs log_must zfs mount -o $reverse_opt $fs cur_val=$(get_prop $property $fs) (($? != 0)) && log_fail "get_prop $property $fs" # In LZ, a user with all zone privileges can never with "devices" if ! is_global_zone && [[ $property == devices ]] ; then if [[ $cur_val != off || $orig_val != off ]]; then log_fail "'devices' property shouldn't " \ "be enabled in LZ" fi elif [[ $orig_val == $cur_val ]]; then log_fail "zfs mount -o $reverse_opt " \ "doesn't change property." fi # unmount & mount will revert property to the original value log_must zfs unmount $fs log_must zfs mount $fs cur_val=$(get_prop $property $fs) (($? != 0)) && log_fail "get_prop $property $fs" if [[ $orig_val != $cur_val ]]; then log_fail "zfs mount -o $reverse_opt " \ "change the property that is stored on disks" fi done log_pass "Verify '-o' set filesystem property temporarily passed."