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;
150 fprintf(stderr, usage, argv[0]);
154 signal(SIGUSR1, usr1_handler);
158 for (commands = argv[2]; *commands; commands++) {
161 if (usr1_received == 0)
164 signal(SIGUSR1, usr1_handler);
167 if (close(fd) == -1) {
175 len = atoi(commands+1);
176 fd = llapi_file_open(fname, O_CREAT | O_WRONLY, 0644,
180 perror("create stripe file");
185 if (mkdir(fname, 0755) == -1) {
187 perror("mkdir(0755)");
192 fd = open(fname, O_DIRECTORY);
195 perror("open(O_DIRECTORY)");
203 if (symlink(fname, newfile)) {
213 if (link(fname, newfile)) {
220 if (mknod(fname, S_IFREG | 0644, 0) == -1) {
222 perror("mknod(S_IFREG|0644, 0)");
227 mmap_len = st.st_size;
228 mmap_ptr = mmap(NULL, mmap_len, PROT_WRITE | PROT_READ,
230 if (mmap_ptr == MAP_FAILED) {
240 if (rename (fname, newfile)) {
247 fd = open(fname, O_CREAT|O_RDWR, 0644);
250 perror("open(O_RDWR|O_CREAT)");
255 len = get_flags(commands+1, &flags);
257 fd = open(fname, flags);
265 len = atoi(commands+1);
269 buf = realloc(buf, len + ALIGN);
272 perror("allocating buf for read\n");
276 buf_align = (char *)((long)(buf + ALIGN) &
280 rc = read(fd, buf_align, len);
287 fprintf(stderr, "short read: %u/%u\n",
293 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
297 if (stat(fname, &st) == -1) {
304 if (fstat(fd, &st) == -1) {
311 if (fchmod(fd, 0) == -1) {
318 len = atoi(commands+1);
319 if (ftruncate(fd, len) == -1) {
321 printf("ftruncate (%d,%d)\n", fd, len);
327 if (unlink(fname) == -1) {
334 if (munmap(mmap_ptr, mmap_len)) {
341 len = atoi(commands+1);
345 buf = realloc(buf, len + ALIGN);
348 perror("allocating buf for write\n");
352 buf_align = (char *)((long)(buf + ALIGN) &
354 strncpy(buf_align, msg, bufsize);
357 rc = write(fd, buf_align, len);
364 fprintf(stderr, "short write: %u/%u\n",
370 for (i = 0; i < mmap_len && mmap_ptr; i += 4096)
371 mmap_ptr[i] += junk++;
374 if (fsync(fd) == -1) {
381 if (fdatasync(fd) == -1) {
387 len = atoi(commands+1);
388 if (lseek(fd, len, SEEK_SET) == -1) {
406 fprintf(stderr, "unknown command \"%c\"\n", *commands);
407 fprintf(stderr, usage, argv[0]);