1#!/bin/sh 2# 3# SPDX-License-Identifier: BSD-2-Clause-FreeBSD 4# 5# Copyright (c) 2022 Peter Holm <pho@FreeBSD.org> 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28 29# Regression test for: 30# D35514 UFS: make mkdir() reliable when using SU and reaching nlink limit 31# Bug 165392 - [ufs] [patch] Multiple mkdir/rmdir fails with errno 31 32 33. ../default.cfg 34 35cat > /tmp/nlink.c <<EOF 36#include <sys/stat.h> 37#include <ufs/ufs/dinode.h> 38#include <err.h> 39#include <errno.h> 40#include <stdio.h> 41#include <unistd.h> 42 43int 44main (void) { 45 int i, mx; 46 char dir[100]; 47 48 mx = UFS_LINK_MAX - 2; 49 for (i = 0; i < mx; i++) { 50 snprintf(dir, sizeof(dir), "%d", i); 51 if (mkdir(dir, 0700) == -1) 52 err(1, "mkdir(%s)", dir); 53 } 54 55 /* The following mkdir(2) must fail */ 56 i = mx; 57 snprintf(dir, sizeof(dir), "%d", i); 58 if (mkdir(dir, 0700) != -1) /* this must fail */ 59 err(1, "mkdir(%s)", dir); 60 if (errno != EMLINK) 61 err(1, "Must fail: mkdir(%s)", dir); 62 63 /* Must succeed */ 64 i = 0; 65 snprintf(dir, sizeof(dir), "%d", i); 66 if (rmdir(dir) == -1) 67 err(1, "rmdir(%s)", dir); 68 snprintf(dir, sizeof(dir), "%s", "a"); 69 if (mkdir(dir, 0700) == -1) 70 err(1, "mkdir(%s)", dir); 71 72 return (0); 73} 74EOF 75mycc -o /tmp/nlink -Wall -Wextra -O2 /tmp/nlink.c || exit 1 76rm /tmp/nlink.c 77 78set -e 79here=`pwd` 80mount | grep -q "on $mntpoint " && umount -f $mntpoint 81mdconfig -l | grep "md$mdstart " && mdconfig -d -u $mdstart 82mdconfig -a -t swap -s 1g -u $mdstart 83newfs -Un /dev/md$mdstart > /dev/null 84mount /dev/md$mdstart $mntpoint 85set +e 86 87cd $mntpoint 88/tmp/nlink; s=$? 89n=`ls -a | wc -l` 90[ $s -ne 0 ] && echo "$n dirs" 91cd $here 92 93umount $mntpoint 94mdconfig -d -u $mdstart 95rm /tmp/nlink 96exit $s 97