1a565cc81SJason A. Harmening#!/bin/sh 2a565cc81SJason A. Harmening 3a565cc81SJason A. Harmening# 4a565cc81SJason A. Harmening# Copyright (c) 2022 Jason Harmening <jah@FreeBSD.org> 5a565cc81SJason A. Harmening# All rights reserved. 6a565cc81SJason A. Harmening# 7a565cc81SJason A. Harmening# Redistribution and use in source and binary forms, with or without 8a565cc81SJason A. Harmening# modification, are permitted provided that the following conditions 9a565cc81SJason A. Harmening# are met: 10a565cc81SJason A. Harmening# 1. Redistributions of source code must retain the above copyright 11a565cc81SJason A. Harmening# notice, this list of conditions and the following disclaimer. 12a565cc81SJason A. Harmening# 2. Redistributions in binary form must reproduce the above copyright 13a565cc81SJason A. Harmening# notice, this list of conditions and the following disclaimer in the 14a565cc81SJason A. Harmening# documentation and/or other materials provided with the distribution. 15a565cc81SJason A. Harmening# 16a565cc81SJason A. Harmening# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17a565cc81SJason A. Harmening# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a565cc81SJason A. Harmening# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a565cc81SJason A. Harmening# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20a565cc81SJason A. Harmening# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21a565cc81SJason A. Harmening# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22a565cc81SJason A. Harmening# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23a565cc81SJason A. Harmening# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24a565cc81SJason A. Harmening# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25a565cc81SJason A. Harmening# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26a565cc81SJason A. Harmening# SUCH DAMAGE. 27a565cc81SJason A. Harmening# 28a565cc81SJason A. Harmening 29a565cc81SJason A. Harmening[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 30a565cc81SJason A. Harmening 31a565cc81SJason A. Harmening# Regression test: 32a565cc81SJason A. Harmening 33a565cc81SJason A. Harmening# There is an issue, namely, when the lower file is already 34a565cc81SJason A. Harmening# opened r/w, but its nullfs alias is executed. This situation obviously 35a565cc81SJason A. Harmening# shall result in ETXTBUSY, but it currently does not. 36a565cc81SJason A. Harmening 37a565cc81SJason A. Harmening# Based on nullfs10.sh by pho@, original test scenario by kib@ 38a565cc81SJason A. Harmening 39a565cc81SJason A. Harmening. ../default.cfg 40a565cc81SJason A. Harmening 41a565cc81SJason A. Harmeningmd1=$mdstart 42a565cc81SJason A. Harmeningmd2=$((md1 + 1)) 43a565cc81SJason A. Harmeningmp1=/mnt$md1 44a565cc81SJason A. Harmeningmp2=/mnt$md2 45a565cc81SJason A. Harmeningmkdir -p $mp1 $mp2 46a565cc81SJason A. Harmeningset -e 47a565cc81SJason A. Harmeningfor i in $mp1 $mp2; do 48a565cc81SJason A. Harmening mount | grep -q "on $i " && umount -f $i 49a565cc81SJason A. Harmeningdone 50a565cc81SJason A. Harmeningfor i in $md1 $md2; do 51a565cc81SJason A. Harmening mdconfig -l | grep -q md$i && mdconfig -d -u $i 52a565cc81SJason A. Harmeningdone 53a565cc81SJason A. Harmening 54a565cc81SJason A. Harmeningmdconfig -a -t swap -s 4g -u $md1 55a565cc81SJason A. Harmeningmdconfig -a -t swap -s 4g -u $md2 56a565cc81SJason A. Harmeningnewfs $newfs_flags -n md$md1 > /dev/null 57a565cc81SJason A. Harmeningnewfs $newfs_flags -n md$md2 > /dev/null 58a565cc81SJason A. Harmeningmount /dev/md$md1 $mp1 59a565cc81SJason A. Harmeningmount /dev/md$md2 $mp2 60a565cc81SJason A. Harmening 61a565cc81SJason A. Harmeningmkdir $mp2/shadow 62a565cc81SJason A. Harmeningcp /bin/ls $mp2/shadow/ 63a565cc81SJason A. Harmeningmount -t unionfs -o noatime $mp1 $mp2 64a565cc81SJason A. Harmeningset +e 65a565cc81SJason A. Harmening 66a565cc81SJason A. Harmeningmount | grep -E "$mp1|$mp2" 67a565cc81SJason A. Harmening 68a565cc81SJason A. Harmeningchmod 777 $mp1 69a565cc81SJason A. Harmeningchmod 777 $mp2 70a565cc81SJason A. Harmening 71a565cc81SJason A. Harmeningchmod +w $mp2/shadow/ls 72a565cc81SJason A. Harmeningsleep 2 >> $mp2/shadow/ls & 73a565cc81SJason A. Harmeningsleep .5 74a565cc81SJason A. Harmening 75a565cc81SJason A. Harmening# This line should cause a "$mp1/shadow/ls: Text file busy" error 76a565cc81SJason A. Harmening$mp1/shadow/ls -l /bin/ls $mp1 $mp2 && echo FAIL || echo OK 77a565cc81SJason A. Harmeningkill $! 78a565cc81SJason A. Harmeningwait 79a565cc81SJason A. Harmening 80a565cc81SJason A. Harmeningwhile mount | grep -q "$mp2 "; do 81a565cc81SJason A. Harmening umount $mp2 || sleep 1 82a565cc81SJason A. Harmeningdone 83a565cc81SJason A. Harmening 84a565cc81SJason A. Harmeningwhile mount | grep -q "$mp1 "; do 85a565cc81SJason A. Harmening umount $mp1 || sleep 1 86a565cc81SJason A. Harmeningdone 87a565cc81SJason A. Harmeningmdconfig -d -u $md2 88a565cc81SJason A. Harmeningmdconfig -d -u $md1 89