On 5/30/13 3:01 PM, Jan Kara wrote: > On Thu 30-05-13 08:48:24, Eric Sandeen wrote: >> On 5/30/13 7:45 AM, Jan Kara wrote: >>> Test whether SEEK_HOLE and SEEK_DATA works correctly with offsets over >>> 4GB. >> >> >> Hm, should we add 2T as well while we're at it? >> >> (and does this cause any new failures?) > Yes, ext4 is broken. I've sent fixes for it yesterday. I'm not sure what Argh, sorry I forgot that. I just want to be careful about more rigorous tests making it look like we have regressions in the code. > exactly would overflow at 2T ... block counts if signed int is used and > blocksize is 1KB? Hum ok, where'd I come up with 2T? :) never mind that maybe, unless there are other potential trouble points we should add (8T? 16T for filesystems that can handle it?) -Eric > Honza > >>> Signed-off-by: Jan Kara <jack@xxxxxxx> >>> --- >>> src/seek_sanity_test.c | 38 ++++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 38 insertions(+) >>> >>> diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c >>> index 7d5868b..55e7ed6 100644 >>> --- a/src/seek_sanity_test.c >>> +++ b/src/seek_sanity_test.c >>> @@ -18,6 +18,7 @@ >>> */ >>> >>> #define _XOPEN_SOURCE 500 >>> +#define _FILE_OFFSET_BITS 64 >>> #include <sys/types.h> >>> #include <sys/stat.h> >>> #include <sys/vfs.h> >>> @@ -191,6 +192,42 @@ static int do_lseek(int testnum, int subtest, int fd, int filsz, int origin, >>> return ret; >>> } >>> >>> +/* test a huge file to check for 4G overflows */ >>> +static int test10(int fd, int testnum) >>> +{ >>> + char *buf = NULL; >>> + int bufsz = alloc_size; >>> + off_t filsz = 8ULL << 30; /* 8G */ >>> + off_t off = filsz - 2*bufsz; >>> + int ret = -1; >>> + >>> + buf = do_malloc(bufsz); >>> + if (!buf) >>> + goto out; >>> + memset(buf, 'a', bufsz); >>> + >>> + ret = do_pwrite(fd, buf, bufsz, 0); >>> + if (ret) >>> + goto out; >>> + ret = do_pwrite(fd, buf, bufsz, off); >>> + if (ret) >>> + goto out; >>> + >>> + /* offset at the beginning */ >>> + ret += do_lseek(testnum, 1, fd, filsz, SEEK_HOLE, 0, bufsz); >>> + ret += do_lseek(testnum, 2, fd, filsz, SEEK_HOLE, 1, bufsz); >>> + ret += do_lseek(testnum, 3, fd, filsz, SEEK_DATA, 0, 0); >>> + ret += do_lseek(testnum, 4, fd, filsz, SEEK_DATA, 1, 1); >>> + >>> + /* offset around eof */ >>> + ret += do_lseek(testnum, 5, fd, filsz, SEEK_HOLE, off, off + bufsz); >>> + ret += do_lseek(testnum, 6, fd, filsz, SEEK_DATA, off, off); >>> + ret += do_lseek(testnum, 7, fd, filsz, SEEK_DATA, off + 1, off + 1); >>> + >>> +out: >>> + do_free(buf); >>> + return ret; >>> +} >>> /* >>> * test file with unwritten extents, have both dirty and >>> * writeback pages in page cache. >>> @@ -577,6 +614,7 @@ struct testrec seek_tests[] = { >>> { 7, test07, "Test file with unwritten extents, only have dirty pages" }, >>> { 8, test08, "Test file with unwritten extents, only have unwritten pages" }, >>> { 9, test09, "Test file with unwritten extents, have both dirty && unwritten pages" }, >>> + { 10, test10, "Test a huge file" }, >>> }; >>> >>> static int run_test(struct testrec *tr) >>> >> _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs