]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/test/stress2/misc/tmpfs10.sh
sqlite3: import sqlite3 3.35.5
[FreeBSD/FreeBSD.git] / tools / test / stress2 / misc / tmpfs10.sh
1 #!/bin/sh
2
3 #
4 # Copyright (c) 2013 EMC Corp.
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 # tmpfs(5) name lookup problem seen:
30
31 # $ ./tmpfs10.sh
32 # tmpfs10: unlink(p01193.14729) at loop #2: No such file or directory
33 # unlink(p01193.14729) succeeded at call #2.
34 # tmpfs10: unlink(p01186.14409) at loop #2: No such file or directory
35 # unlink(p01186.14409) succeeded at call #2.
36 # FAIL
37 # $
38
39 # Fixed in r253967.
40
41 [ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
42
43 . ../default.cfg
44
45 odir=`pwd`
46 cd /tmp
47 sed '1,/^EOF/d' < $odir/$0 > tmpfs10.c
48 mycc -o tmpfs10 -Wall -Wextra -O2 -g tmpfs10.c || exit 1
49 rm -f tmpfs10.c
50 cd $odir
51
52 mount | grep -q "on $mntpoint " && umount $mntpoint
53 mount -t tmpfs tmpfs $mntpoint
54 cd $mntpoint
55 /tmp/tmpfs10 ||
56 { find $mntpoint ! -type d | xargs ls -il; echo FAIL; }
57 cd $odir
58 umount $mntpoint
59 rm -f /tmp/tmpfs10
60 exit 0
61 EOF
62 #include <err.h>
63 #include <errno.h>
64 #include <fcntl.h>
65 #include <stdio.h>
66 #include <stdlib.h>
67 #include <sys/param.h>
68 #include <sys/stat.h>
69 #include <sys/wait.h>
70 #include <unistd.h>
71
72 static int loop;
73 int error;
74
75 #define PARALLEL 20
76 #define SIZE 16000
77
78 void
79 test2(void)
80 {
81         int i, j, k;
82         pid_t pid;
83         char file[128], dir[128];
84
85         loop++;
86         pid = getpid();
87         sprintf(dir,"%s.%05d", getprogname(), pid);
88         if (mkdir(dir, 0770) < 0)
89                 err(1, "mkdir(%s), %s:%d", dir, __FILE__, __LINE__);
90
91         if (chdir(dir) == -1)
92                 err(1, "chdir(%s), %s:%d", dir, __FILE__, __LINE__);
93
94         for (j = 0; j < SIZE; j++) {
95                 sprintf(file,"p%05d.%05d", pid, j);
96                 if (symlink("/tmp/not/there", file) == -1) {
97                         if (errno != EINTR) {
98                                 warn("symlink(%s). %s.%d", file, __FILE__, __LINE__);
99                                 break;
100                         }
101                 }
102         }
103
104         for (i = --j; i >= 0; i--) {
105                 sprintf(file,"p%05d.%05d", pid, i);
106                 if (unlink(file) == -1) {
107                         warn("unlink(%s) at loop #%d", file, loop);
108                         error++;
109                         for (k = 0; k < 10; k++) {
110                                 usleep(10000);
111                                 if (unlink(file) == 0) {
112                                         fprintf(stderr,
113                                             "unlink(%s) succeeded at call #%d.\n",
114                                             file, k + 2);
115                                         break;
116                                 }
117                         }
118                 }
119         }
120
121         (void)chdir("..");
122         if (rmdir(dir) == -1)
123                 warn("rmdir(%s), %s:%d", dir, __FILE__, __LINE__);
124
125 }
126
127 void
128 test(void)
129 {
130         sleep(arc4random() % 3 + 1);
131
132         test2();
133         if (error == 0)
134                 test2();
135
136         _exit(error);
137 }
138
139 int
140 main(void)
141 {
142         int e, i, status;
143
144         for (i = 0; i < PARALLEL; i++)
145                 if (fork() == 0)
146                         test();
147
148         e = 0;
149         for (i = 0; i < PARALLEL; i++) {
150                 wait(&status);
151                 e += WEXITSTATUS(status);
152         }
153
154         return (e);
155 }