diff options
Diffstat (limited to 'tests/basic/quota.c')
| -rw-r--r-- | tests/basic/quota.c | 102 |
1 files changed, 72 insertions, 30 deletions
diff --git a/tests/basic/quota.c b/tests/basic/quota.c index 4cc0322e132..809ceb8e54c 100644 --- a/tests/basic/quota.c +++ b/tests/basic/quota.c @@ -3,45 +3,87 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> -int -file_write (char *filename, int filesize) +ssize_t +nwrite(int fd, const void *buf, size_t count) { - int fd, ret = 0; - int i = 0; - char buf[1024] = {'a',}; - fd = open (filename, O_RDWR|O_CREAT|O_APPEND, 0600); - while (i < filesize) { - ret = write(fd, buf, sizeof(buf)); - if (ret == -1) { - close (fd); - return ret; - } - i += sizeof(buf); - ret = fdatasync(fd); - if (ret) { - close (fd); - return ret; - } + ssize_t ret = 0; + ssize_t written = 0; + + for (written = 0; written != count; written += ret) { + ret = write(fd, buf + written, count - written); + if (ret < 0) { + if (errno == EINTR) + ret = 0; + else + goto out; } - ret = close(fd); - if (ret) - return ret; + } - return 0; + ret = written; +out: + return ret; } int -main (int argc, char **argv) +file_write(char *filename, int bs, int count) { - if (argc != 3) { - printf("Usage: %s <filename> <size(in bytes)>\n", argv[0]); - return EXIT_FAILURE; + int fd = 0; + int ret = -1; + int i = 0; + char *buf = NULL; + + bs = bs * 1024; + + buf = (char *)malloc(bs); + if (buf == NULL) + goto out; + + memset(buf, 0, bs); + + fd = open(filename, O_RDWR | O_CREAT | O_SYNC, 0600); + while (i < count) { + ret = nwrite(fd, buf, bs); + if (ret == -1) { + close(fd); + goto out; } + i++; + } + + ret = fdatasync(fd); + if (ret) { + close(fd); + goto out; + } + + ret = close(fd); + if (ret) + goto out; + + ret = 0; + +out: + if (buf) + free(buf); + return ret; +} + +int +main(int argc, char **argv) +{ + if (argc != 4) { + printf("Usage: %s <filename> <block size in k> <count>\n", argv[0]); + return EXIT_FAILURE; + } - printf ("argv[2] is %s\n", argv[2]); - if (file_write (argv[1], atoi(argv[2])) == -1) - return EXIT_FAILURE; + if (file_write(argv[1], atoi(argv[2]), atoi(argv[3])) < 0) { + perror("write failed"); + return EXIT_FAILURE; + } - return EXIT_SUCCESS; + return EXIT_SUCCESS; } |
