xref: /freebsd/tools/test/stress2/misc/vnodes.sh (revision 9768746b)
1#!/bin/sh
2
3#
4# Copyright (c) 2012 Peter Holm <pho@FreeBSD.org>
5# All rights reserved.
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# Demonstrate vnode leak
30
31# Test scenario by Petr Salinger <Petr Salinger seznam cz>
32
33. ../default.cfg
34
35kldstat -v | grep -q pty || { kldload pty || exit 0; }
36here=`pwd`
37cd /tmp
38sed '1,/^EOF/d' < $here/$0 > vnodes.c
39mycc -o vnodes -Wall -Wextra -O2 vnodes.c || exit 1
40rm -f vnodes.c
41
42s=0
43old=`sysctl -n vfs.numvnodes`
44/tmp/vnodes
45new=`sysctl -n vfs.numvnodes`
46[ $((new - old)) -gt 100 ] && { s=1; echo "FAIL vnode leak"; }
47
48rm -f /tmp/vnodes
49exit $s
50EOF
51#include <sys/types.h>
52#include <sys/wait.h>
53#include <err.h>
54#include <errno.h>
55#include <fcntl.h>
56#include <stdio.h>
57#include <stdlib.h>
58#include <unistd.h>
59
60char dname[]= "/dev/ptyrX";
61
62void leak(void)
63{
64	int i, fd;
65
66	if (fork() == 0) {
67		for (i = '0'; i < '9'; i ++) {
68			dname[9] = i;
69			fd = open(dname, O_RDWR);
70			if (fd == -1)
71				if (errno != EBUSY && errno != ENXIO)
72					err(1, "open(%s)", dname);
73		}
74		_exit(0);
75	}
76	wait(NULL);
77}
78
79int main(void)
80{
81	int i;
82
83	for (i = 0 ;i < 100000; i++) {
84		leak();
85	}
86	return (0);
87}
88