Whamcloud - gitweb
- added test_3b which emulates recursive mount. Does not pass yet.
[fs/lustre-release.git] / lustre / tests / iopentest2.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  */
4
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <unistd.h>
10 #include <limits.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <libgen.h>
14 #include <errno.h>
15 #include <sys/wait.h>
16
17 const char *progname;
18 const char usage_fmt[] = "Usage: %s <mountpoint>\n";
19 #define INAME_LEN (PATH_MAX + 1)
20
21 #define CHECK_IT(exp, pstr) \
22 if (!(exp)) { \
23     fprintf(stderr, "%s: at %s:%d: ", progname, __FILE__, __LINE__); \
24     perror((pstr)); \
25     exit(1); \
26 }
27
28 #define CHECK_SNPRINTF(rc, len) \
29     CHECK_IT((rc) > 0 && (rc) <= (len), "snprintf() failed")
30
31 static char *get_iname(char *fname, const char *mtpt)
32 {
33         char *iname;
34         int fd, rc;
35         struct stat buf;
36
37         iname = malloc(INAME_LEN);
38         CHECK_IT(iname, "malloc() failed");
39
40         fd = open(fname, O_CREAT, 0644);
41         if (fd < 0 && errno != EISDIR) {
42                 fprintf(stderr, "%s:%d: open(%s) failed: %s\n", __FILE__,
43                         __LINE__, fname, strerror(errno));
44                 exit(1);
45         }
46
47         if (fd >= 0)
48                 close(fd);
49
50         rc = stat(fname, &buf);
51         if (rc != 0) {
52                 fprintf(stderr, "%s:%d: stat(%s) failed: %s\n", __FILE__,
53                         __LINE__, fname, strerror(errno));
54                 exit(1);
55         }
56
57         rc = snprintf(iname, INAME_LEN,
58                       "%s/__iopen__/%lu", mtpt, (unsigned long)buf.st_ino);
59         CHECK_SNPRINTF(rc, INAME_LEN);
60
61         return iname;
62 }
63
64 int main(int argc, char *argv[])
65 {
66         char *fname, *mtpt, *pname;
67         char *fname_iname, *dir;
68         char *dir_iname = NULL, *foo = NULL, *bar = NULL;
69         int rc, fd, i, thread = 0;
70         int pidlist[10];
71
72         pname = strdup(argv[0]);
73         progname = basename(argv[0]);
74
75         if (argc != 2) {
76                 fprintf(stderr, usage_fmt, progname);
77                 return 1;
78         }
79  
80         for (i = 1; i <= 10; i++) {
81                 rc = fork();
82                 if (rc < 0) {
83                         fprintf(stderr, "error: %s: #%d - %s\n", argv[0], i,
84                                 strerror(rc = errno));
85                         break;
86                 } else if (rc == 0) {
87                         thread = i;
88                         break;
89                 }
90                 printf("%s: thread #%d (PID %d) started\n", argv[0], i, rc);
91                 pidlist[i-1] = rc;
92                 rc = 0;
93         }
94
95         if (thread != 0) {
96                 mtpt  = argv[1];
97                 fname = malloc(INAME_LEN);
98                 CHECK_IT(fname, "malloc() failed");
99
100                 rc = snprintf(fname, INAME_LEN,
101                               "%s/%d", mtpt, getpid());
102                 CHECK_SNPRINTF(rc, INAME_LEN);
103
104                 rc = mkdir(fname, 0644);
105                 if (rc != 0) {
106                         fprintf(stderr, "%s:%d: mkdir(%s) failed: %s\n",
107                                 __FILE__, __LINE__, fname, strerror(errno));
108                         exit(1);
109                 }
110
111                 fname_iname = get_iname(fname, mtpt);
112
113                 dir = malloc(INAME_LEN);
114                 CHECK_IT(dir, "malloc() failed");
115
116                 rc = snprintf(dir, INAME_LEN, "%s/dir", fname_iname);
117                 CHECK_SNPRINTF(rc, INAME_LEN);
118
119                 foo = malloc(INAME_LEN);
120                 CHECK_IT(foo, "malloc() failed");
121
122                 bar = malloc(INAME_LEN);
123                 CHECK_IT(bar, "malloc() failed");
124
125                 for (i = 0; i < 1000; i++) {
126                         rc = mkdir(dir, 0644);
127                         if (rc != 0) {
128                                 fprintf(stderr, "%s:%d: mkdir(%s) failed: %s\n",
129                                         __FILE__, __LINE__, dir,
130                                         strerror(errno));
131                                 exit(1);
132                         }
133
134                         dir_iname = get_iname(dir, mtpt);
135
136                         rc = snprintf(foo, INAME_LEN, "%s/bar", dir_iname);
137                         CHECK_SNPRINTF(rc, INAME_LEN);
138
139                         rc = snprintf(bar, INAME_LEN, "%s/bar", dir_iname);
140                         CHECK_SNPRINTF(rc, INAME_LEN);
141
142                         fd = open(foo, O_CREAT, 0644);
143                         if (fd < 0) {
144                                 fprintf(stderr, "%s:%d: open(%s) failed: %s\n",
145                                         __FILE__, __LINE__, foo,
146                                         strerror(errno));
147                                 exit(1);
148                         }
149                         rc = close(fd);
150                         if (rc != 0) {
151                                 fprintf(stderr, "%s:%d: close() failed: %s\n",
152                                         __FILE__, __LINE__, strerror(errno));
153                                 exit(1);
154                         }
155
156                         rc = rename(foo, bar);
157                         if (rc != 0) {
158                                 fprintf(stderr, "%s:%d: rename(%s, %s) failed: "
159                                         "%s\n", __FILE__, __LINE__, foo, bar,
160                                         strerror(errno));
161                                 exit(1);
162                         }
163
164                         rc = unlink(bar);
165                         if (rc != 0) {
166                                 fprintf(stderr, "%s:%d: unlink(%s) failed: "
167                                         "%s\n", __FILE__, __LINE__, bar,
168                                         strerror(errno));
169                                 exit(1);
170                         }
171                         rc = rmdir(dir);
172                         if (rc != 0) {
173                                 fprintf(stderr, "%s:%d: rmdir(%s) failed: %s\n",
174                                         __FILE__, __LINE__, dir,
175                                         strerror(errno));
176                                 exit(1);
177                         }
178
179                         free(dir_iname);
180                 }
181         } else {
182                         for ( i=0; i<10; i++)
183                                 waitpid(pidlist[i], NULL, 0);
184         }
185         return 0;
186 }