2011-06-03 19:17:05

by Allison Henderson

[permalink] [raw]
Subject: Fwd: Re: [XFSTEST Add Fallocate Punch Hole Tests 1/3 v4] Add Punch Hole to FSX



-------- Original Message --------
Subject: Re: [XFSTEST Add Fallocate Punch Hole Tests 1/3 v4] Add Punch
Hole to FSX
Date: Wed, 01 Jun 2011 16:01:18 -0700
From: Allison Henderson <[email protected]>
To: xfs-oss <[email protected]>

On 5/25/2011 7:34 PM, Allison Henderson wrote:
> This patch adds punch hole tests to the fsx stress test.
>
> Signed-off-by: Allison Henderson<[email protected]>
>
> v1 -> v2:
> Corrections to the Makefile have been backed out.
> Those corrections have been addressed in the
> "xfstests: clean up fallocate configuration tests"
> patch
>
> The punch hole tests can be disabled with the
> -H flag, and will also be disabled if it is
> detected that the filesystem does not support
> punch hole
>
> v2 -> v4
> Punch hole tests and functionality tests have been moved
> into their own functions. Existing dofallocate routine
> has been renamed to do_preallocate.
> ---
> :100644 100755 fe072d3... a55b6f7... M ltp/fsx.c
> ltp/fsx.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++--------
> 1 files changed, 122 insertions(+), 18 deletions(-)
>
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> old mode 100644
> new mode 100755
> index fe072d3..a55b6f7
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -69,6 +69,7 @@ int logcount = 0; /* total ops */
> #define OP_MAPWRITE 6
> #define OP_SKIPPED 7
> #define OP_FALLOCATE 8
> +#define OP_PUNCH_HOLE 9
>
> #undef PAGE_SIZE
> #define PAGE_SIZE getpagesize()
> @@ -110,6 +111,7 @@ int randomoplen = 1; /* -O flag disables it */
> int seed = 1; /* -S flag */
> int mapped_writes = 1; /* -W flag disables */
> int fallocate_calls = 1; /* -F flag disables */
> +int punch_hole_calls = 1; /* -H flag disables */
> int mapped_reads = 1; /* -R flag disables it */
> int fsxgoodfd = 0;
> int o_direct; /* -Z */
> @@ -279,6 +281,14 @@ logdump(void)
> badoff< lp->args[0] + lp->args[1])
> prt("\t******FFFF");
> break;
> + case OP_PUNCH_HOLE:
> + prt("PUNCH HOLE\t0x%x thru 0x%x\t(0x%x bytes)",
> + lp->args[0], lp->args[0] + lp->args[1] - 1,
> + lp->args[1]);
> + if (badoff>= lp->args[0]&& badoff<
> + lp->args[0] + lp->args[1])
> + prt("\t******PPPP");
> + break;
> case OP_SKIPPED:
> prt("SKIPPED (no operation)");
> break;
> @@ -784,10 +794,67 @@ dotruncate(unsigned size)
> }
> }
>
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +void
> +do_punch_hole(unsigned offset, unsigned length)
> +{
> + unsigned end_offset;
> + int max_offset = 0;
> + int max_len = 0;
> + int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
> +
> + if (length == 0) {
> + if (!quiet&& testcalls> simulatedopcount)
> + prt("skipping zero length punch hole\n");
> + log4(OP_SKIPPED, OP_PUNCH_HOLE, offset, length);
> + return;
> + }
> +
> + if (file_size<= (loff_t)offset) {
> + if (!quiet&& testcalls> simulatedopcount)
> + prt("skipping hole punch off the end of the file\n");
> + log4(OP_SKIPPED, OP_PUNCH_HOLE, offset, length);
> + return;
> + }
> +
> + end_offset = offset + length;
> +
> + log4(OP_PUNCH_HOLE, offset, length, 0);
> +
> + if (testcalls<= simulatedopcount)
> + return;
> +
> + if ((progressinterval&& testcalls % progressinterval == 0) ||
> + (debug&& (monitorstart == -1 || monitorend == -1 ||
> + end_offset<= monitorend))) {
> + prt("%lu punch\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> + offset, offset+length, length);
> + }
> + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> + prt("%punch hole: %x to %x\n", offset, length);
> + prterr("do_punch_hole: fallocate");
> + report_failure(161);
> + }
> +
> +
> + max_offset = offset< file_size ? offset : file_size;
> + max_len = max_offset + length<= file_size ? length :
> + file_size - max_offset;
> + memset(good_buf + max_offset, '\0', max_len);
> +}
> +
> +#else
> +void
> +do_punch_hole(unsigned offset, unsigned length)
> +{
> + return;
> +}
> +#endif
> +
> #ifdef FALLOCATE
> /* fallocate is basically a no-op unless extending, then a lot like a truncate */
> void
> -dofallocate(unsigned offset, unsigned length)
> +do_preallocate(unsigned offset, unsigned length)
> {
> unsigned end_offset;
> int keep_size;
> @@ -831,13 +898,13 @@ dofallocate(unsigned offset, unsigned length)
> prt("%lu falloc\tfrom 0x%x to 0x%x\n", testcalls, offset, length);
> if (fallocate(fd, keep_size ? FALLOC_FL_KEEP_SIZE : 0, (loff_t)offset, (loff_t)length) == -1) {
> prt("fallocate: %x to %x\n", offset, length);
> - prterr("dofallocate: fallocate");
> + prterr("do_preallocate: fallocate");
> report_failure(161);
> }
> }
> #else
> void
> -dofallocate(unsigned offset, unsigned length)
> +do_preallocate(unsigned offset, unsigned length)
> {
> return;
> }
> @@ -895,8 +962,7 @@ test(void)
> unsigned long offset;
> unsigned long size = maxoplen;
> unsigned long rv = random();
> - unsigned long op = rv % (3 + !lite + mapped_writes + fallocate_calls);
> -
> + unsigned long op = rv % (3 + !lite + mapped_writes + fallocate_calls + punch_hole_calls);
> /* turn off the map read if necessary */
>
> if (op == 2&& !mapped_reads)
> @@ -924,6 +990,7 @@ test(void)
> * TRUNCATE: op = - 3
> * MAPWRITE: op = 3 4
> * FALLOCATE: op = - 5
> + * PUNCH HOLE: op = - 6
> */
> if (lite ? 0 : op == 3&& (style& 1) == 0) /* vanilla truncate? */
> dotruncate(random() % maxfilelen);
> @@ -941,7 +1008,12 @@ test(void)
> offset %= maxfilelen;
> if (offset + size> maxfilelen)
> size = maxfilelen - offset;
> - dofallocate(offset, size);
> + do_preallocate(offset, size);
> + } else if (op == 6) {
> + offset %= maxfilelen;
> + if (offset + size> maxfilelen)
> + size = maxfilelen - offset;
> + do_punch_hole(offset, size);
> } else if (op == 1 || op == (lite ? 3 : 4)) {
> /* write / mapwrite */
> offset %= maxfilelen;
> @@ -1013,6 +1085,9 @@ usage(void)
> #ifdef FALLOCATE
> " -F: Do not use fallocate (preallocation) calls\n"
> #endif
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +" -H: Do not use punch hole calls\n"
> +#endif
> " -L: fsxLite - no file creations& no file size changes\n\
> -N numops: total # operations to do (default infinity)\n\
> -O: use oplen (see -o flag) for every op (default random)\n\
> @@ -1161,6 +1236,41 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset)
>
> #endif
>
> +void
> +test_fallocate()
> +{
> +#ifdef FALLOCATE
> + if (!lite&& fallocate_calls) {
> + if (fallocate(fd, 0, 0, 1)&& errno == EOPNOTSUPP) {
> + warn("main: filesystem does not support fallocate, disabling");
> + fallocate_calls = 0;
> + } else {
> + ftruncate(fd, 0);
> + }
> + }
> +#else /* ! FALLOCATE */
> + fallocate_calls = 0;
> +#endif
> +}
> +
> +void
> +test_punch_hole()
> +{
> +#ifdef FALLOC_FL_PUNCH_HOLE
> + if (!lite&& punch_hole_calls) {
> + if (fallocate(fd, 0, 0,
> + FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)&&
> + errno == EOPNOTSUPP) {
> +
> + warn("main: filesystem does not support fallocate punch hole, disabling");
> + punch_hole_calls = 0;
> + }
> + }
> +#else /* ! PUNCH HOLE */
> + punch_hole_calls = 0;
> +#endif
> +}
> +
> int
> main(int argc, char **argv)
> {
> @@ -1179,7 +1289,7 @@ main(int argc, char **argv)
>
> setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */
>
> - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FLN:OP:RS:WZ"))
> + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHLN:OP:RS:WZ"))
> != EOF)
> switch (ch) {
> case 'b':
> @@ -1276,6 +1386,9 @@ main(int argc, char **argv)
> case 'F':
> fallocate_calls = 0;
> break;
> + case 'H':
> + punch_hole_calls = 0;
> + break;
> case 'L':
> lite = 1;
> break;
> @@ -1421,17 +1534,8 @@ main(int argc, char **argv)
> } else
> check_trunc_hack();
>
> -#ifdef FALLOCATE
> - if (!lite&& fallocate_calls) {
> - if (fallocate(fd, 0, 0, 1)&& errno == EOPNOTSUPP) {
> - warn("main: filesystem does not support fallocate, disabling");
> - fallocate_calls = 0;
> - } else
> - ftruncate(fd, 0);
> - }
> -#else /* ! FALLOCATE */
> - fallocate_calls = 0;
> -#endif
> + test_fallocate();
> + test_punch_hole();
>
> while (numops == -1 || numops--)
> test();



Hi all,

I just wanted to poke this patch set before too much time gets away.
Most of the changes that happened between v3 and v4 were discussed in
the previous threads. I updated my xfstest recently and noticed that
some activity in this code has caused the patch not to apply, so I may
need to send out an update, but if anyone has any more comments please
let me know so I can add them in. Thx!

Allison Henderson


_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs