]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
qa: add O_TRUNC test
authorSage Weil <sage@inktank.com>
Thu, 4 Jul 2013 04:53:48 +0000 (21:53 -0700)
committerSage Weil <sage@inktank.com>
Thu, 4 Jul 2013 04:53:48 +0000 (21:53 -0700)
From: Yan, Zheng <yan.zheng@intel.com>

Simple reproducer for #5453, modified to run for a finite number of
iterations.

Signed-off-by: Sage Weil <sage@inktank.com>
qa/Makefile
qa/fs/Makefile [new file with mode: 0644]
qa/fs/test_o_trunc.c [new file with mode: 0644]
qa/workunits/misc/test_o_trunc.sh [new file with mode: 0755]

index ad655b7e743cb4468bfb6e691bfcb7ad875dd565..c4efe2c9f3aba1dbb9b2d43a0ae62db7c8ada7a9 100644 (file)
@@ -1,4 +1,4 @@
-DIRS= workunits btrfs
+DIRS= workunits btrfs fs
 
 all:
        for d in $(DIRS) ; do ( cd $$d ; $(MAKE) all ) ; done
diff --git a/qa/fs/Makefile b/qa/fs/Makefile
new file mode 100644 (file)
index 0000000..c993425
--- /dev/null
@@ -0,0 +1,11 @@
+CFLAGS = -Wall -Wextra -D_GNU_SOURCE
+
+TARGETS = test_o_trunc
+
+.c:
+       $(CC) $(CFLAGS) $@.c -o $@
+
+all:   $(TARGETS)
+
+clean:
+       rm $(TARGETS)
diff --git a/qa/fs/test_o_trunc.c b/qa/fs/test_o_trunc.c
new file mode 100644 (file)
index 0000000..0210528
--- /dev/null
@@ -0,0 +1,44 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+        int fd, ret;
+        char obuf[32], ibuf[1024];
+        int n, max = 0;
+
+       if (argc > 2)
+               max = atoi(argv[2]);
+       if (!max)
+               max = 600;
+
+        memset(obuf, 0xff, sizeof(obuf));
+
+        for (n = 1; n <= max; ++n) {
+                fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644);
+                printf("%d/%d: open fd = %d\n", n, max, fd);
+
+                ret = write(fd, obuf, sizeof(obuf));
+                printf("write ret = %d\n", ret);
+
+                sleep(1);
+
+                ret = write(fd, obuf, sizeof(obuf));
+                printf("write ret = %d\n", ret);
+
+                ret = pread(fd, ibuf, sizeof(ibuf), 0);
+                printf("pread ret = %d\n", ret);
+
+                if (memcmp(obuf, ibuf, sizeof(obuf))) {
+                        printf("mismatch\n");
+                        break;
+                }
+                close(fd);
+        }
+        return 0;
+}
diff --git a/qa/workunits/misc/test_o_trunc.sh b/qa/workunits/misc/test_o_trunc.sh
new file mode 100755 (executable)
index 0000000..dda24d8
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh -ex
+
+../../fs/test_o_trunc trunc.foo 600
+
+echo OK
+