aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Coddington <bcodding@redhat.com>2016-10-24 09:52:41 -0400
committerEryu Guan <eguan@redhat.com>2016-10-26 19:15:44 +0800
commitefef020df5b257085831106847d318c93d46531c (patch)
tree1f7a5f58cb68040d8fcf4cdf73604003fc166c7e
parent4c99b91d0ad9a97e9d409e8f52696598c934f43d (diff)
downloadxfstests-dev-efef020df5b257085831106847d318c93d46531c.tar.gz
src/seek_sanity_test: discover allocation size
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>
-rw-r--r--src/seek_sanity_test.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c
index 18262c2b04..a6dd48cc25 100644
--- a/src/seek_sanity_test.c
+++ b/src/seek_sanity_test.c
@@ -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;
}