xref: /freebsd/tools/test/stress2/misc/unionfs15.sh (revision 02a2005a)
102a2005aSPeter Holm#!/bin/sh
202a2005aSPeter Holm
302a2005aSPeter Holm#
402a2005aSPeter Holm# Copyright (c) 2024 Peter Holm <pho@FreeBSD.org>
502a2005aSPeter Holm#
602a2005aSPeter Holm# SPDX-License-Identifier: BSD-2-Clause
702a2005aSPeter Holm#
802a2005aSPeter Holm
902a2005aSPeter Holm# O_PATH test scenario.  Variation of nullfs29.sh
1002a2005aSPeter Holm
1102a2005aSPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
1202a2005aSPeter Holm. ../default.cfg
1302a2005aSPeter Holm
1402a2005aSPeter Holmmd1=$mdstart
1502a2005aSPeter Holmmd2=$((md1 + 1))
1602a2005aSPeter Holmmp1=/mnt$md1
1702a2005aSPeter Holmmp2=/mnt$md2
1802a2005aSPeter Holmmkdir -p $mp1 $mp2
1902a2005aSPeter Holmset -e
2002a2005aSPeter Holmfor i in $mp1 $mp2; do
2102a2005aSPeter Holm	mount | grep -q "on $i " && umount -f $i
2202a2005aSPeter Holmdone
2302a2005aSPeter Holmfor i in $md1 $md2; do
2402a2005aSPeter Holm	mdconfig -l | grep -q md$i && mdconfig -d -u $i
2502a2005aSPeter Holmdone
2602a2005aSPeter Holm
2702a2005aSPeter Holmmdconfig -a -t swap -s 2g -u $md1
2802a2005aSPeter Holmmdconfig -a -t swap -s 2g -u $md2
2902a2005aSPeter Holmnewfs $newfs_flags -n md$md1 > /dev/null
3002a2005aSPeter Holmnewfs $newfs_flags -n md$md2 > /dev/null
3102a2005aSPeter Holmmount /dev/md$md1 $mp1
3202a2005aSPeter Holmmount /dev/md$md2 $mp2
3302a2005aSPeter Holmmount -t unionfs -o noatime $mp1 $mp2
3402a2005aSPeter Holmset +e
3502a2005aSPeter Holm
3602a2005aSPeter Holmcat > /tmp/unionfs15.c <<EOF
3702a2005aSPeter Holm#include <sys/stat.h>
3802a2005aSPeter Holm#include <err.h>
3902a2005aSPeter Holm#include <errno.h>
4002a2005aSPeter Holm#include <fcntl.h>
4102a2005aSPeter Holm#include <stdio.h>
4202a2005aSPeter Holm#include <stdlib.h>
4302a2005aSPeter Holm#include <unistd.h>
4402a2005aSPeter Holm
4502a2005aSPeter Holmint
4602a2005aSPeter Holmmain(void) {
4702a2005aSPeter Holm	int new_dir, new_file, ret;
4802a2005aSPeter Holm	struct stat sb;
4902a2005aSPeter Holm	char *dir = "test2";
5002a2005aSPeter Holm	char *path= "test2/what2";
5102a2005aSPeter Holm
5202a2005aSPeter Holm	if (mkdir(dir, 0755) == -1)
5302a2005aSPeter Holm		err(1, "mkdir(test2)");
5402a2005aSPeter Holm	new_dir = openat(AT_FDCWD, dir, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_PATH, 0700);
5502a2005aSPeter Holm	if (new_dir == -1)
5602a2005aSPeter Holm		err(1, "openat(%s)", dir);
5702a2005aSPeter Holm
5802a2005aSPeter Holm	ret = fstatat(new_dir, "what2", &sb, AT_SYMLINK_NOFOLLOW);
5902a2005aSPeter Holm	if (ret == 0)
6002a2005aSPeter Holm		errx(1, "Expected fstatat() to fail");
6102a2005aSPeter Holm	if (ret == -1 && errno != ENOENT)
6202a2005aSPeter Holm		err(1, "fstatat(%s)", dir);
6302a2005aSPeter Holm
6402a2005aSPeter Holm	close(new_dir);
6502a2005aSPeter Holm	new_file = openat(AT_FDCWD, path, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644);
6602a2005aSPeter Holm	if (new_file== -1)
6702a2005aSPeter Holm		err(1, "openat(%s)", path);
6802a2005aSPeter Holm}
6902a2005aSPeter Holm
7002a2005aSPeter HolmEOF
7102a2005aSPeter Holmmycc -o /tmp/unionfs15 -Wall -Wextra -O2 /tmp/unionfs15.c || exit 1
7202a2005aSPeter Holmcd $mp2
7302a2005aSPeter Holm/tmp/unionfs15; s=$?
7402a2005aSPeter Holmcd $here
7502a2005aSPeter Holmumount $mp2
7602a2005aSPeter Holm
7702a2005aSPeter Holmwhile mount | grep -Eq "on $mp2 .*unionfs"; do
7802a2005aSPeter Holm	umount $mp2 && break
7902a2005aSPeter Holm	sleep 5
8002a2005aSPeter Holmdone
8102a2005aSPeter Holmumount $mp2
8202a2005aSPeter Holmumount $mp1
8302a2005aSPeter Holmmdconfig -d -u $md2
8402a2005aSPeter Holmmdconfig -d -u $md1
8502a2005aSPeter Holmrm -f /tmp/unionfs15.c /tmp/unionfs15
8602a2005aSPeter Holmexit $s
87