Whamcloud - gitweb
b=1792
[fs/lustre-release.git] / lustre / tests / iopentest2.c
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <unistd.h>
6 #include <limits.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <libgen.h>
10 #include <errno.h>
11
12 const char usage_fmt[] = "Usage: %s <mountpoint>\n";
13 #define INAME_LEN (PATH_MAX + 1)
14 const char *progname;
15
16 #define CHECK_IT(exp, pstr) \
17 if (!(exp)) { \
18     fprintf(stderr, "%s: at %s:%d: ", progname, __FILE__, __LINE__); \
19     perror((pstr)); \
20     exit(1); \
21 }
22
23 #define CHECK_SNPRINTF(rc, len) \
24     CHECK_IT((rc) > 0 && (rc) <= (len), "snprintf() failed")
25
26 static char *get_iname(char *fname, const char *mtpt)
27 {
28         char *iname;
29         int fd, rc;
30         struct stat buf;
31
32         iname = malloc(INAME_LEN);
33         CHECK_IT(iname, "malloc() failed");
34
35         fd = open(fname, O_CREAT, 0644);
36         CHECK_IT(fd >= 0 || errno == EISDIR, "open(fname) failed");
37
38         if (fd >= 0)
39                 close(fd);
40
41         rc = stat(fname, &buf);
42         CHECK_IT(rc == 0, "stat(fname) failed");
43
44         rc = snprintf(iname, INAME_LEN,
45                       "%s/__iopen__/%lu", mtpt, buf.st_ino);
46         CHECK_SNPRINTF(rc, INAME_LEN);
47
48         return iname;
49 }
50
51 int main(int argc, char *argv[])
52 {
53         char *fname, *mtpt, *pname;
54         int rc, fd;
55         char *fname_iname, *dir;
56         char *dir_iname = NULL, *foo = NULL, *bar = NULL;
57
58         int i,j;
59         int thread=0;
60
61         pname = strdup(argv[0]);
62         progname = basename(argv[0]);
63                                                                                                                              
64         if (argc != 2) {
65                 fprintf(stderr, usage_fmt, progname);
66                 return 1;
67         }
68  
69         for(i=1;i<=10;i++) {
70                 rc=fork();
71                 if (rc < 0) {
72                         fprintf(stderr, "error: %s: #%ld - %s\n", argv[0], i,
73                                 strerror(rc = errno));
74                         break;
75                 } else if (rc == 0) {
76                         thread = i;
77                         break;
78                 } else {
79                         printf("%s: thread #%ld (PID %d) started\n",
80                                argv[0], i, rc);
81                 }
82                 rc = 0;
83         }
84
85         if (thread!=0){
86                 j=1000;
87
88                 mtpt  = argv[1];
89                 fname = malloc(INAME_LEN);
90                 CHECK_IT(fname, "malloc() failed");
91
92                 rc = snprintf(fname, INAME_LEN,
93                               "%s/%d", mtpt, getpid());
94                 CHECK_SNPRINTF(rc, INAME_LEN);
95
96                 rc = mkdir(fname, 0644);
97                 CHECK_IT(rc == 0, "mkdir(fname) failed");
98
99                 fname_iname = get_iname(fname, mtpt);
100
101                 dir = malloc(INAME_LEN);
102                 CHECK_IT(dir, "malloc() failed");
103
104                 rc = snprintf(dir, INAME_LEN,
105                               "%s/dir", fname_iname);
106                 CHECK_SNPRINTF(rc, INAME_LEN);
107
108                 foo = malloc(INAME_LEN);
109                 CHECK_IT(foo, "malloc() failed");
110
111                 bar = malloc(INAME_LEN);
112                 CHECK_IT(bar, "malloc() failed");
113
114                 do {
115                         rc = mkdir(dir, 0644);
116                         CHECK_IT(rc == 0, "mkdir() failed");
117
118                         dir_iname = get_iname(dir, mtpt);
119                 
120                         rc = snprintf(foo, INAME_LEN,
121                                       "%s/bar", dir_iname);
122                         CHECK_SNPRINTF(rc, INAME_LEN);
123                 
124                         rc = snprintf(bar, INAME_LEN,
125                                       "%s/bar", dir_iname);
126                         CHECK_SNPRINTF(rc, INAME_LEN);
127
128                         fd = open(foo, O_CREAT, 0644);
129                         CHECK_IT(fd >= 0, "open(foo) failed");
130                         close(fd);
131
132                         rc = rename(foo, bar);
133                         CHECK_IT(rc == 0, "rename(foo, bar) failed");
134
135                         rc = unlink(bar);
136                         CHECK_IT(rc == 0, "unlink(bar) failed");
137                         rc = rmdir(dir);
138                         CHECK_IT(rc == 0, "rmdir(dir) failed");
139
140                         free(dir_iname);
141                         j--;
142                 } while (j>=1);
143         }
144         return 0;
145 }