X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fwriteme.c;h=0c9eaf23a32f8bff070c3ebc07eb4e0910ab7759;hb=f7392c7c4a16bc1127ee448f937ba81c50dcdfd5;hp=bf5c971e611815bc8a6ee2baa2ee1169397a5d06;hpb=0343ecb7de2dae4cf8016416bf1af5d34e9a746d;p=fs%2Flustre-release.git diff --git a/lustre/tests/writeme.c b/lustre/tests/writeme.c index bf5c971..0c9eaf2 100644 --- a/lustre/tests/writeme.c +++ b/lustre/tests/writeme.c @@ -1,46 +1,103 @@ +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.gnu.org/licenses/gpl-2.0.html + * + * GPL HEADER END + */ +/* + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2011, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + */ + #include #include #include #include #include +#include void usage(char *prog) { - printf("usage: %s [-s] filename\n", prog); + printf("usage: %s [-s] [-b ] filename\n", prog); + exit(1); } int main(int argc, char **argv) { - int fd, rc; - int do_sync = 0; - int i = 0; - int file_arg = 1; - char buf[4096]; + bool limit_write = false, do_sync = false; + int c, per_write, fd, rc; + unsigned long bytes = 0; + char buf[4096]; + char *endptr = NULL; - memset(buf, 0, 4096); + while ((c = getopt(argc, argv, "sb:")) != -1) { + switch (c) { + case 's': + do_sync = true; + break; + case 'b': + limit_write = true; + bytes = strtoul(optarg, &endptr, 10); + if (endptr != NULL && *endptr != '\0') + usage(argv[0]); + break; + default: + usage(argv[0]); + break; + } + } - if (argc < 2 || argc > 3) { + if (argc - optind != 1) usage(argv[0]); - exit(1); - } - - if (strcmp(argv[1], "-s") == 0) { - do_sync = 1; - file_arg++; - } - - fd = open(argv[file_arg], O_RDWR | O_CREAT, 0600); - if (fd == -1) { - printf("Error opening %s\n", argv[1]); - exit(1); - } - - while (1) { - sprintf(buf, "write %d\n", i); - rc = write(fd, buf, sizeof(buf)); + + memset(buf, 0, 4096); + fd = open(argv[optind], O_RDWR | O_CREAT, 0600); + if (fd == -1) { + printf("Error opening %s\n", argv[1]); + exit(1); + } + + /* Even 0 bytes, write at least once */ + if (limit_write) { + do { + per_write = bytes > 4096 ? 4096 : bytes; + rc = write(fd, buf, per_write); + if (rc > 0) + bytes -= rc; + else if (rc < 0) + break; + } while (bytes > 0); + + return rc >= 0 ? 0 : rc; + } + + for (rc = 0; ;) { + sprintf(buf, "write %d\n", rc); + rc = write(fd, buf, sizeof(buf)); if (do_sync) sync(); - sleep(1); - } - return 0; + sleep(1); + } + + return 0; }