1*6630c3a7SDag-Erling Smørgrav# 2*6630c3a7SDag-Erling Smørgrav# Copyright (c) 2026 Dag-Erling Smørgrav <des@FreeBSD.org> 3*6630c3a7SDag-Erling Smørgrav# 4*6630c3a7SDag-Erling Smørgrav# SPDX-License-Identifier: BSD-2-Clause 5*6630c3a7SDag-Erling Smørgrav# 6*6630c3a7SDag-Erling Smørgrav 7*6630c3a7SDag-Erling Smørgrav# Create a small file system to experiment on 8*6630c3a7SDag-Erling Smørgravtunefs_setup() 9*6630c3a7SDag-Erling Smørgrav{ 10*6630c3a7SDag-Erling Smørgrav atf_check -o save:dev mdconfig -t malloc -s 16M 11*6630c3a7SDag-Erling Smørgrav tunefs_dev=/dev/$(cat dev) 12*6630c3a7SDag-Erling Smørgrav atf_check -o ignore newfs "$@" $tunefs_dev 13*6630c3a7SDag-Erling Smørgrav} 14*6630c3a7SDag-Erling Smørgrav 15*6630c3a7SDag-Erling Smørgrav# Verify that the changes we ask tunefs to perform are applied to the 16*6630c3a7SDag-Erling Smørgrav# test file system 17*6630c3a7SDag-Erling Smørgravtunefs_test() 18*6630c3a7SDag-Erling Smørgrav{ 19*6630c3a7SDag-Erling Smørgrav local opt=$1 # tunefs option 20*6630c3a7SDag-Erling Smørgrav local name=$2 # what tunefs(8) calls it 21*6630c3a7SDag-Erling Smørgrav local descr=${3:-$name} # what file(1) calls it, if different 22*6630c3a7SDag-Erling Smørgrav 23*6630c3a7SDag-Erling Smørgrav # Verify that the optin is not enabled 24*6630c3a7SDag-Erling Smørgrav atf_check -o not-match:"$name" \ 25*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 26*6630c3a7SDag-Erling Smørgrav 27*6630c3a7SDag-Erling Smørgrav # Enable the option and verify that it is enabled 28*6630c3a7SDag-Erling Smørgrav atf_check -e match:"$name set" -o ignore \ 29*6630c3a7SDag-Erling Smørgrav tunefs $opt enable $tunefs_dev 30*6630c3a7SDag-Erling Smørgrav atf_check -o match:"$descr" \ 31*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 32*6630c3a7SDag-Erling Smørgrav 33*6630c3a7SDag-Erling Smørgrav # Enable it again and verify that it is still enabled 34*6630c3a7SDag-Erling Smørgrav atf_check -e match:"$name remains unchanged as enabled" \ 35*6630c3a7SDag-Erling Smørgrav tunefs $opt enable $tunefs_dev 36*6630c3a7SDag-Erling Smørgrav atf_check -o match:"$descr" \ 37*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 38*6630c3a7SDag-Erling Smørgrav 39*6630c3a7SDag-Erling Smørgrav # Disable the option and verify that it is disabled 40*6630c3a7SDag-Erling Smørgrav atf_check -e match:"$name cleared" -o ignore \ 41*6630c3a7SDag-Erling Smørgrav tunefs $opt disable $tunefs_dev 42*6630c3a7SDag-Erling Smørgrav atf_check -o not-match:"$descr" \ 43*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 44*6630c3a7SDag-Erling Smørgrav 45*6630c3a7SDag-Erling Smørgrav # Disable it again and verify that it is still disabled 46*6630c3a7SDag-Erling Smørgrav atf_check -e match:"$name remains unchanged as disabled" \ 47*6630c3a7SDag-Erling Smørgrav tunefs $opt disable $tunefs_dev 48*6630c3a7SDag-Erling Smørgrav atf_check -o not-match:"$descr" \ 49*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 50*6630c3a7SDag-Erling Smørgrav} 51*6630c3a7SDag-Erling Smørgrav 52*6630c3a7SDag-Erling Smørgrav# Clean up after ourselves 53*6630c3a7SDag-Erling Smørgravtunefs_cleanup() 54*6630c3a7SDag-Erling Smørgrav{ 55*6630c3a7SDag-Erling Smørgrav # Destroy the test file system 56*6630c3a7SDag-Erling Smørgrav if [ -f dev ]; then 57*6630c3a7SDag-Erling Smørgrav mdconfig -d -u $(cat dev) || true 58*6630c3a7SDag-Erling Smørgrav fi 59*6630c3a7SDag-Erling Smørgrav} 60*6630c3a7SDag-Erling Smørgrav 61*6630c3a7SDag-Erling Smørgrav# POSIX.1e ACLs 62*6630c3a7SDag-Erling Smørgravatf_test_case posixacl cleanup 63*6630c3a7SDag-Erling Smørgravposixacl_head() 64*6630c3a7SDag-Erling Smørgrav{ 65*6630c3a7SDag-Erling Smørgrav atf_set descr "Turn POSIX.1e ACLs on and off" 66*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 67*6630c3a7SDag-Erling Smørgrav} 68*6630c3a7SDag-Erling Smørgravposixacl_body() 69*6630c3a7SDag-Erling Smørgrav{ 70*6630c3a7SDag-Erling Smørgrav tunefs_setup 71*6630c3a7SDag-Erling Smørgrav tunefs_test -a "POSIX.1e ACLs" 72*6630c3a7SDag-Erling Smørgrav} 73*6630c3a7SDag-Erling Smørgravposixacl_cleanup() 74*6630c3a7SDag-Erling Smørgrav{ 75*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 76*6630c3a7SDag-Erling Smørgrav} 77*6630c3a7SDag-Erling Smørgrav 78*6630c3a7SDag-Erling Smørgrav# NFSv4 ACLs 79*6630c3a7SDag-Erling Smørgravatf_test_case nfs4acl cleanup 80*6630c3a7SDag-Erling Smørgravnfs4acl_head() 81*6630c3a7SDag-Erling Smørgrav{ 82*6630c3a7SDag-Erling Smørgrav atf_set descr "Turn NFSv4 ACLs on and off" 83*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 84*6630c3a7SDag-Erling Smørgrav} 85*6630c3a7SDag-Erling Smørgravnfs4acl_body() 86*6630c3a7SDag-Erling Smørgrav{ 87*6630c3a7SDag-Erling Smørgrav tunefs_setup 88*6630c3a7SDag-Erling Smørgrav tunefs_test -N "NFSv4 ACLs" 89*6630c3a7SDag-Erling Smørgrav} 90*6630c3a7SDag-Erling Smørgravnfs4acl_cleanup() 91*6630c3a7SDag-Erling Smørgrav{ 92*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 93*6630c3a7SDag-Erling Smørgrav} 94*6630c3a7SDag-Erling Smørgrav 95*6630c3a7SDag-Erling Smørgrav# Soft Updates (no journaling) 96*6630c3a7SDag-Erling Smørgravatf_test_case sunoj cleanup 97*6630c3a7SDag-Erling Smørgravsunoj_head() 98*6630c3a7SDag-Erling Smørgrav{ 99*6630c3a7SDag-Erling Smørgrav atf_set descr "Turn Soft Updates on and off" 100*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 101*6630c3a7SDag-Erling Smørgrav} 102*6630c3a7SDag-Erling Smørgravsunoj_body() 103*6630c3a7SDag-Erling Smørgrav{ 104*6630c3a7SDag-Erling Smørgrav tunefs_setup -u 105*6630c3a7SDag-Erling Smørgrav tunefs_test -n "soft updates" 106*6630c3a7SDag-Erling Smørgrav} 107*6630c3a7SDag-Erling Smørgravsunoj_cleanup() 108*6630c3a7SDag-Erling Smørgrav{ 109*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 110*6630c3a7SDag-Erling Smørgrav} 111*6630c3a7SDag-Erling Smørgrav 112*6630c3a7SDag-Erling Smørgrav# Soft Updates journaling 113*6630c3a7SDag-Erling Smørgravatf_test_case suj cleanup 114*6630c3a7SDag-Erling Smørgravsuj_head() 115*6630c3a7SDag-Erling Smørgrav{ 116*6630c3a7SDag-Erling Smørgrav atf_set descr "Turn Soft Updates journaling on and off" 117*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 118*6630c3a7SDag-Erling Smørgrav} 119*6630c3a7SDag-Erling Smørgravsuj_body() 120*6630c3a7SDag-Erling Smørgrav{ 121*6630c3a7SDag-Erling Smørgrav tunefs_setup 122*6630c3a7SDag-Erling Smørgrav tunefs_test -j "soft updates journaling" 123*6630c3a7SDag-Erling Smørgrav} 124*6630c3a7SDag-Erling Smørgravsuj_cleanup() 125*6630c3a7SDag-Erling Smørgrav{ 126*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 127*6630c3a7SDag-Erling Smørgrav} 128*6630c3a7SDag-Erling Smørgrav 129*6630c3a7SDag-Erling Smørgrav# GEOM journaling 130*6630c3a7SDag-Erling Smørgravatf_test_case gjournal cleanup 131*6630c3a7SDag-Erling Smørgravgjournal_head() 132*6630c3a7SDag-Erling Smørgrav{ 133*6630c3a7SDag-Erling Smørgrav atf_set descr "Turn GEOM journaling on and off" 134*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 135*6630c3a7SDag-Erling Smørgrav} 136*6630c3a7SDag-Erling Smørgravgjournal_body() 137*6630c3a7SDag-Erling Smørgrav{ 138*6630c3a7SDag-Erling Smørgrav tunefs_setup -u 139*6630c3a7SDag-Erling Smørgrav tunefs_test -J "gjournal" "GEOM journaling" 140*6630c3a7SDag-Erling Smørgrav} 141*6630c3a7SDag-Erling Smørgravgjournal_cleanup() 142*6630c3a7SDag-Erling Smørgrav{ 143*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 144*6630c3a7SDag-Erling Smørgrav} 145*6630c3a7SDag-Erling Smørgrav 146*6630c3a7SDag-Erling Smørgrav# Try combining Soft Updates with GEOM journaling 147*6630c3a7SDag-Erling Smørgravatf_test_case conflict cleanup 148*6630c3a7SDag-Erling Smørgravconflict_head() 149*6630c3a7SDag-Erling Smørgrav{ 150*6630c3a7SDag-Erling Smørgrav atf_set descr "Soft Updates and GEOM journaling are mutually exclusive" 151*6630c3a7SDag-Erling Smørgrav atf_set require.user "root" 152*6630c3a7SDag-Erling Smørgrav} 153*6630c3a7SDag-Erling Smørgravconflict_body() 154*6630c3a7SDag-Erling Smørgrav{ 155*6630c3a7SDag-Erling Smørgrav tunefs_setup -U 156*6630c3a7SDag-Erling Smørgrav 157*6630c3a7SDag-Erling Smørgrav # Verify that SU is enabled 158*6630c3a7SDag-Erling Smørgrav atf_check -o match:"soft updates" \ 159*6630c3a7SDag-Erling Smørgrav file -s $tunefs_dev 160*6630c3a7SDag-Erling Smørgrav # Verify that enabling gjournal fails 161*6630c3a7SDag-Erling Smørgrav atf_check -e match:"cannot be enabled" \ 162*6630c3a7SDag-Erling Smørgrav tunefs -J enable $tunefs_dev 163*6630c3a7SDag-Erling Smørgrav # Now turn SU off 164*6630c3a7SDag-Erling Smørgrav atf_check -e match:"soft updates cleared" \ 165*6630c3a7SDag-Erling Smørgrav tunefs -n disable $tunefs_dev 166*6630c3a7SDag-Erling Smørgrav # Enable gjournal 167*6630c3a7SDag-Erling Smørgrav atf_check -e match:"gjournal set" \ 168*6630c3a7SDag-Erling Smørgrav tunefs -J enable $tunefs_dev 169*6630c3a7SDag-Erling Smørgrav # Verify that enabling SU+J fails 170*6630c3a7SDag-Erling Smørgrav atf_check -e match:"cannot be enabled" \ 171*6630c3a7SDag-Erling Smørgrav tunefs -j enable $tunefs_dev 172*6630c3a7SDag-Erling Smørgrav # Verify that enabling SU alone fails 173*6630c3a7SDag-Erling Smørgrav atf_check -e match:"cannot be enabled" \ 174*6630c3a7SDag-Erling Smørgrav tunefs -n enable $tunefs_dev 175*6630c3a7SDag-Erling Smørgrav} 176*6630c3a7SDag-Erling Smørgravconflict_cleanup() 177*6630c3a7SDag-Erling Smørgrav{ 178*6630c3a7SDag-Erling Smørgrav tunefs_cleanup 179*6630c3a7SDag-Erling Smørgrav} 180*6630c3a7SDag-Erling Smørgrav 181*6630c3a7SDag-Erling Smørgravatf_init_test_cases() 182*6630c3a7SDag-Erling Smørgrav{ 183*6630c3a7SDag-Erling Smørgrav atf_add_test_case posixacl 184*6630c3a7SDag-Erling Smørgrav atf_add_test_case nfs4acl 185*6630c3a7SDag-Erling Smørgrav atf_add_test_case sunoj 186*6630c3a7SDag-Erling Smørgrav atf_add_test_case suj 187*6630c3a7SDag-Erling Smørgrav atf_add_test_case gjournal 188*6630c3a7SDag-Erling Smørgrav atf_add_test_case conflict 189*6630c3a7SDag-Erling Smørgrav} 190