1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
5 #define _GNU_SOURCE /* pull in O_DIRECTORY in bits/fcntl.h */
11 #include <sys/types.h>
17 #include <lustre/liblustreapi.h>
19 #define T1 "write data before unlink\n"
20 #define T2 "write data after unlink\n"
21 char msg[] = "yabba dabba doo, I'm coming for you, I live in a shoe, I don't know what to do.\n'Bigger, bigger,and bigger yet!' cried the Creator. 'You are not yet substantial enough for my boundless intents!' And ever greater and greater the object became, until all was lost 'neath its momentus bulk.\n";
22 char *buf, *buf_align;
27 "Usage: %s filename command-sequence\n"
28 " command-sequence items:\n"
30 " C[num] create with optional stripes\n"
32 " D open(O_DIRECTORY)\n"
36 " M rw mmap to EOF (must open and stat prior)\n"
39 " O open(O_CREAT|O_RDWR)\n"
40 " r[num] read [optional length]\n"
41 " R reference entire mmap-ed region\n"
45 " T[num] ftruncate [optional position, default 0]\n"
48 " w[num] write optional length\n"
49 " W write entire mmap-ed region\n"
52 " z[num] seek [optional position, default 0]\n"
53 " _ wait for signal\n";
55 static int usr1_received;
56 void usr1_handler(int unused)
62 pop_arg(int argc, char *argv[])
64 static int cur_arg = 3;
69 return argv[cur_arg++];
76 {"O_RDONLY", O_RDONLY},
77 {"O_WRONLY", O_WRONLY},
81 {"O_NOCTTY", O_NOCTTY},
83 {"O_APPEND", O_APPEND},
84 {"O_NONBLOCK", O_NONBLOCK},
85 {"O_NDELAY", O_NDELAY},
88 {"O_DIRECT", O_DIRECT},
90 {"O_LARGEFILE", O_LARGEFILE},
91 {"O_DIRECTORY", O_DIRECTORY},
92 {"O_NOFOLLOW", O_NOFOLLOW},
96 int get_flags(char *data, int *rflags)
104 cloned_flags = strdup(data);
105 if (cloned_flags == NULL) {
106 fprintf(stderr, "Insufficient memory.\n");
110 for (tmp = strtok(cloned_flags, ":"); tmp;
111 tmp = strtok(NULL, ":")) {
114 size = tmp - cloned_flags;
115 for (i = 0; flag_table[i].flag != -1; i++) {
116 if (!strcmp(tmp, flag_table[i].string)){
117 flags |= flag_table[i].flag;
118 size += strlen(flag_table[i].string);
135 #define POP_ARG() (pop_arg(argc, argv))
136 #define min(a,b) ((a)>(b)?(b):(a))
138 int main(int argc, char **argv)
140 char *fname, *commands;
143 size_t mmap_len = 0, i;
144 unsigned char *mmap_ptr = NULL, junk = 0;
145 int rc, len, fd = -1;
151 fprintf(stderr, usage, argv[0]);
155 signal(SIGUSR1, usr1_handler);
159 for (commands = argv[2]; *commands; commands++) {
162 if (usr1_received == 0) {
170 signal(SIGUSR1, usr1_handler);
173 if (close(fd) == -1) {
181 len = atoi(commands+1);
182 fd = llapi_file_open(fname, O_CREAT | O_WRONLY, 0644,
186 perror("create stripe file");
191 if (mkdir(fname, 0755) == -1) {
193 perror("mkdir(0755)");
198 fd = open(fname, O_DIRECTORY);
201 perror("open(O_DIRECTORY)");
209 if (symlink(fname, newfile)) {
219 if (link(fname, newfile)) {
226 if (mknod(fname, S_IFREG | 0644, 0) == -1) {
228 perror("mknod(S_IFREG|0644, 0)");
233 mmap_len = st.st_size;
234 mmap_ptr = mmap(NULL, mmap_len, PROT_WRITE | PROT_READ,
236 if (mmap_ptr == MAP_FAILED) {
246 if (rename (fname, newfile)) {
253 fd = open(fname, O_CREAT|O_RDWR, 0644);
256 perror("open(O_RDWR|O_CREAT)");
261 len = get_flags(commands+1, &flags);
263 fd = open(fname, flags);
271 len = atoi(commands+1);
275 buf = realloc(buf, len + ALIGN);
278 perror("allocating buf for read\n");
282 buf_align = (char *)((long)(buf + ALIGN) &
286 rc = read(fd, buf_align, len);
293 fprintf(stderr, "short read: %u/%u\n",
299 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
303 if (stat(fname, &st) == -1) {
310 if (fstat(fd, &st) == -1) {
317 if (fchmod(fd, 0) == -1) {
324 len = atoi(commands+1);
325 if (ftruncate(fd, len) == -1) {
327 printf("ftruncate (%d,%d)\n", fd, len);
333 if (unlink(fname) == -1) {
340 if (munmap(mmap_ptr, mmap_len)) {
350 len = atoi(commands+1);
354 buf = realloc(buf, len + ALIGN);
357 perror("allocating buf for write\n");
361 buf_align = (char *)((long)(buf + ALIGN) &
363 strncpy(buf_align, msg, bufsize);
366 rc = write(fd, buf_align, len);
373 fprintf(stderr, "short write: %u/%u\n",
379 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
380 mmap_ptr[i] += junk++;
383 if (fsync(fd) == -1) {
390 if (fdatasync(fd) == -1) {
396 len = atoi(commands+1);
397 if (lseek(fd, len, SEEK_SET) == -1) {
415 fprintf(stderr, "unknown command \"%c\"\n", *commands);
416 fprintf(stderr, usage, argv[0]);