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