]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
src/seek_sanity_test: discover allocation size
authorBenjamin Coddington <bcodding@redhat.com>
Mon, 24 Oct 2016 13:52:41 +0000 (09:52 -0400)
committerEryu Guan <eguan@redhat.com>
Wed, 26 Oct 2016 11:15:44 +0000 (19:15 +0800)
Try to discover the allocation size.  For NFS, the st_blksize is
optimized for the network, and will usually be much larger than the
allocation size of the exported filesystem, which may trigger
preallocation strategies in the exported filesystem causing the seek
tests here to fail.

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
src/seek_sanity_test.c

index 18262c2b04939fb166e5ab62c2591da02df0cedc..a6dd48cc257b0f46c3fb166345b6a07c614e755e 100644 (file)
@@ -700,8 +700,8 @@ static int run_test(struct testrec *tr)
 
 static int test_basic_support(void)
 {
-       int ret = -1, fd;
-       off_t pos;
+       int ret = -1, fd, shift;
+       off_t pos = 0, offset = 1;
        char *buf = NULL;
        int bufsz, filsz;
 
@@ -715,6 +715,35 @@ static int test_basic_support(void)
        if (ret)
                goto out;
 
+       /* try to discover the actual alloc size */
+       while (pos == 0 && offset < alloc_size) {
+               offset <<= 1;
+               ftruncate(fd, 0);
+               pwrite(fd, "a", 1, offset);
+               pos = lseek(fd, 0, SEEK_DATA);
+       }
+
+       /* bisect */
+       shift = offset >> 2;
+       while (shift && offset < alloc_size) {
+               ftruncate(fd, 0);
+               pwrite(fd, "a", 1, offset);
+               pos = lseek(fd, 0, SEEK_DATA);
+               offset += pos ? -shift : shift;
+               shift >>= 1;
+       }
+       if (!shift)
+               offset += pos ? 0 : 1;
+       alloc_size = offset;
+
+       if (pos == -1) {
+               fprintf(stderr, "Kernel does not support llseek(2) extension "
+                       "SEEK_DATA. Aborting.\n");
+               ret = -1;
+               goto out;
+       }
+
+       ftruncate(fd, 0);
        bufsz = alloc_size * 2;
        filsz = bufsz * 2;
 
@@ -734,12 +763,10 @@ static int test_basic_support(void)
                goto out;
 
        /* Is SEEK_DATA and SEEK_HOLE supported in the kernel? */
-       pos = lseek(fd, 0, SEEK_DATA);
-       if (pos != -1)
-               pos = lseek(fd, 0, SEEK_HOLE);
+       pos = lseek(fd, 0, SEEK_HOLE);
        if (pos == -1) {
-               fprintf(stderr, "Kernel does not support llseek(2) extensions "
-                       "SEEK_HOLE and/or SEEK_DATA. Aborting.\n");
+               fprintf(stderr, "Kernel does not support llseek(2) extension "
+                       "SEEK_HOLE. Aborting.\n");
                ret = -1;
                goto out;
        }