diff options
Diffstat (limited to 'harness/cases/8.t')
-rw-r--r-- | harness/cases/8.t | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/harness/cases/8.t b/harness/cases/8.t index 8a3d83e..e59199f 100644 --- a/harness/cases/8.t +++ b/harness/cases/8.t @@ -2,44 +2,23 @@ - Ditto for the above three tests at the offset maximum (largest possible ext2/3 file size.) (8.t) */ -#include <sys/vfs.h> - -#define EXT2_OLD_SUPER_MAGIC 0xEF51 -#define EXT2_SUPER_MAGIC 0xEF53 +#include <sys/types.h> +#include <unistd.h> long long get_fs_limit(int fd) { - struct statfs s; - int res; - long long lim = 0; - - res = fstatfs(fd, &s); assert(res == 0); + long long min = 0, max = 9223372036854775807LL; + char c = 0; - switch(s.f_type) { - case EXT2_OLD_SUPER_MAGIC: - case EXT2_SUPER_MAGIC: -#if 0 - { - long long tmp; - tmp = s.f_bsize / 4; - /* 12 direct + indirect block + dind + tind */ - lim = 12 + tmp + tmp * tmp + tmp * tmp * tmp; - lim *= s.f_bsize; - printf("limit(%ld) = %Ld\n", (long)s.f_bsize, lim); - } -#endif - switch(s.f_bsize) { - case 4096: lim = 2199023251456; break; - default: - printf("unknown ext2 blocksize %ld\n", (long)s.f_bsize); - exit(3); + while (max - min > 1) { + if (pwrite64(fd, &c, 1, (min + max) / 2) == -1) + max = (min + max) / 2; + else { + ftruncate(fd, 0); + min = (min + max) / 2; } - break; - default: - printf("unknown filesystem 0x%08lx\n", (long)s.f_type); - exit(3); } - return lim; + return max; } #define SET_RLIMIT(x) do ; while (0) |