linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
@ 2011-05-02 19:16 Allison Henderson
  2011-05-02 19:23 ` Eric Sandeen
  2011-05-03 13:18 ` Josef Bacik
  0 siblings, 2 replies; 7+ messages in thread
From: Allison Henderson @ 2011-05-02 19:16 UTC (permalink / raw)
  To: linux-fsdevel, Ext4 Developers List

This patch adds punch hole tests to the fsx
stress test.  The test is performed through
the fallocate call by randomly choosing to
use the punch hole flag when running the
fallocate test.  Regions that have
been punched out should contain zeros, so
the expected file contents buffer is updated
to contain zeros when a hole is punched out.

Signed-off-by: Allison Henderson <achender@us.ibm.com>
---
:100644 100644 32cd380... d424941... M	ltp/Makefile
:100644 100644 fe072d3... 4f54ef6... M	ltp/fsx.c
 ltp/Makefile |    2 +-
 ltp/fsx.c    |   73 ++++++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 62 insertions(+), 13 deletions(-)

diff --git a/ltp/Makefile b/ltp/Makefile
index 32cd380..d424941 100644
--- a/ltp/Makefile
+++ b/ltp/Makefile
@@ -27,7 +27,7 @@ LCFLAGS += -DAIO
 LLDLIBS += -laio -lpthread
 endif
 
-ifeq ($(HAVE_FALLOCATE), true)
+ifeq ($(HAVE_FALLOCATE), yes)
 LCFLAGS += -DFALLOCATE
 endif
 
diff --git a/ltp/fsx.c b/ltp/fsx.c
index fe072d3..4f54ef6 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -207,7 +207,8 @@ logdump(void)
 {
 	int	i, count, down;
 	struct log_entry	*lp;
-	char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"};
+	char *falloc_type[4] = {"PAST_EOF", "EXTENDING", "INTERIOR",
+				"PUNCH_HOLE"};
 
 	prt("LOG DUMP (%d total operations):\n", logcount);
 	if (logcount < LOGSIZE) {
@@ -791,7 +792,11 @@ dofallocate(unsigned offset, unsigned length)
 {
 	unsigned end_offset;
 	int keep_size;
-
+	int max_offset = 0;
+	int max_len = 0;
+	int punch_hole = 0;
+	int mode = 0;
+	char *op_name;
         if (length == 0) {
                 if (!quiet && testcalls > simulatedopcount)
                         prt("skipping zero length fallocate\n");
@@ -799,11 +804,31 @@ dofallocate(unsigned offset, unsigned length)
                 return;
         }
 
+#ifdef FALLOC_FL_PUNCH_HOLE
+	punch_hole = random() % 2;
+	/* Keep size must be set for punch hole */
+	if (punch_hole) {
+		keep_size = 1;
+		mode = FALLOC_FL_PUNCH_HOLE;
+	} else
+		keep_size = random() % 2;
+#else
 	keep_size = random() % 2;
+#endif
+
+	if (keep_size)
+		mode |= FALLOC_FL_KEEP_SIZE;
+
+	if (punch_hole && file_size <= (loff_t)offset) {
+		if (!quiet && testcalls > simulatedopcount)
+			prt("skipping hole punch off the end of the file\n");
+		log4(OP_SKIPPED, OP_FALLOCATE, offset, length);
+		return;
+	}
 
 	end_offset = keep_size ? 0 : offset + length;
 
-	if (end_offset > biggest) {
+	if ((end_offset > biggest) && !punch_hole) {
 		biggest = end_offset;
 		if (!quiet && testcalls > simulatedopcount)
 			prt("fallocating to largest ever: 0x%x\n", end_offset);
@@ -811,13 +836,15 @@ dofallocate(unsigned offset, unsigned length)
 
 	/*
 	 * last arg:
-	 * 	1: allocate past EOF
-	 * 	2: extending prealloc
-	 * 	3: interior prealloc
+	 *      0: allocate past EOF
+	 *      1: extending prealloc
+	 *      2: interior prealloc
+	 *      3: punch hole
 	 */
-	log4(OP_FALLOCATE, offset, length, (end_offset > file_size) ? (keep_size ? 1 : 2) : 3);
+	log4(OP_FALLOCATE, offset, length, punch_hole ? 3 :
+			(end_offset > file_size) ? (keep_size ? 0 : 1) : 2);
 
-	if (end_offset > file_size) {
+	if (((loff_t)end_offset > file_size) && !punch_hole) {
 		memset(good_buf + file_size, '\0', end_offset - file_size);
 		file_size = end_offset;
 	}
@@ -827,13 +854,35 @@ dofallocate(unsigned offset, unsigned length)
 	
 	if ((progressinterval && testcalls % progressinterval == 0) ||
 	    (debug && (monitorstart == -1 || monitorend == -1 ||
-		      end_offset <= monitorend)))
-		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);
+		      end_offset <= monitorend))) {
+#ifdef FALLOC_FL_PUNCH_HOLE
+		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
+			"punch hole" : "falloc";
+#else
+		op_name = "falloc";
+#endif
+		prt("%lu %s\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
+			op_name, offset, offset+length, length);
+	}
+	if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
+#ifdef FALLOC_FL_PUNCH_HOLE
+		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
+			"punch hole" : "fallocate";
+#else
+		op_name = "fallocate";
+#endif
+
+		prt("%s: %x to %x\n", op_name, offset, length);
 		prterr("dofallocate: fallocate");
 		report_failure(161);
 	}
+
+	if (punch_hole) {
+		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
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-02 19:16 [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX Allison Henderson
@ 2011-05-02 19:23 ` Eric Sandeen
  2011-05-02 19:35   ` Eric Sandeen
  2011-05-03 13:18 ` Josef Bacik
  1 sibling, 1 reply; 7+ messages in thread
From: Eric Sandeen @ 2011-05-02 19:23 UTC (permalink / raw)
  To: Allison Henderson; +Cc: linux-fsdevel, Ext4 Developers List, xfs-oss

On 5/2/11 2:16 PM, Allison Henderson wrote:
> This patch adds punch hole tests to the fsx
> stress test.  The test is performed through
> the fallocate call by randomly choosing to
> use the punch hole flag when running the
> fallocate test.  Regions that have
> been punched out should contain zeros, so
> the expected file contents buffer is updated
> to contain zeros when a hole is punched out.

I'll cc: the xfs list since this would live in xfstests.

Thanks,
-Eric

> Signed-off-by: Allison Henderson <achender@us.ibm.com>
> ---
> :100644 100644 32cd380... d424941... M	ltp/Makefile
> :100644 100644 fe072d3... 4f54ef6... M	ltp/fsx.c
>  ltp/Makefile |    2 +-
>  ltp/fsx.c    |   73 ++++++++++++++++++++++++++++++++++++++++++++++++---------
>  2 files changed, 62 insertions(+), 13 deletions(-)
> 
> diff --git a/ltp/Makefile b/ltp/Makefile
> index 32cd380..d424941 100644
> --- a/ltp/Makefile
> +++ b/ltp/Makefile
> @@ -27,7 +27,7 @@ LCFLAGS += -DAIO
>  LLDLIBS += -laio -lpthread
>  endif
>  
> -ifeq ($(HAVE_FALLOCATE), true)
> +ifeq ($(HAVE_FALLOCATE), yes)
>  LCFLAGS += -DFALLOCATE
>  endif
>  
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> index fe072d3..4f54ef6 100644
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -207,7 +207,8 @@ logdump(void)
>  {
>  	int	i, count, down;
>  	struct log_entry	*lp;
> -	char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"};
> +	char *falloc_type[4] = {"PAST_EOF", "EXTENDING", "INTERIOR",
> +				"PUNCH_HOLE"};
>  
>  	prt("LOG DUMP (%d total operations):\n", logcount);
>  	if (logcount < LOGSIZE) {
> @@ -791,7 +792,11 @@ dofallocate(unsigned offset, unsigned length)
>  {
>  	unsigned end_offset;
>  	int keep_size;
> -
> +	int max_offset = 0;
> +	int max_len = 0;
> +	int punch_hole = 0;
> +	int mode = 0;
> +	char *op_name;
>          if (length == 0) {
>                  if (!quiet && testcalls > simulatedopcount)
>                          prt("skipping zero length fallocate\n");
> @@ -799,11 +804,31 @@ dofallocate(unsigned offset, unsigned length)
>                  return;
>          }
>  
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +	punch_hole = random() % 2;
> +	/* Keep size must be set for punch hole */
> +	if (punch_hole) {
> +		keep_size = 1;
> +		mode = FALLOC_FL_PUNCH_HOLE;
> +	} else
> +		keep_size = random() % 2;
> +#else
>  	keep_size = random() % 2;
> +#endif
> +
> +	if (keep_size)
> +		mode |= FALLOC_FL_KEEP_SIZE;
> +
> +	if (punch_hole && file_size <= (loff_t)offset) {
> +		if (!quiet && testcalls > simulatedopcount)
> +			prt("skipping hole punch off the end of the file\n");
> +		log4(OP_SKIPPED, OP_FALLOCATE, offset, length);
> +		return;
> +	}
>  
>  	end_offset = keep_size ? 0 : offset + length;
>  
> -	if (end_offset > biggest) {
> +	if ((end_offset > biggest) && !punch_hole) {
>  		biggest = end_offset;
>  		if (!quiet && testcalls > simulatedopcount)
>  			prt("fallocating to largest ever: 0x%x\n", end_offset);
> @@ -811,13 +836,15 @@ dofallocate(unsigned offset, unsigned length)
>  
>  	/*
>  	 * last arg:
> -	 * 	1: allocate past EOF
> -	 * 	2: extending prealloc
> -	 * 	3: interior prealloc
> +	 *      0: allocate past EOF
> +	 *      1: extending prealloc
> +	 *      2: interior prealloc
> +	 *      3: punch hole
>  	 */
> -	log4(OP_FALLOCATE, offset, length, (end_offset > file_size) ? (keep_size ? 1 : 2) : 3);
> +	log4(OP_FALLOCATE, offset, length, punch_hole ? 3 :
> +			(end_offset > file_size) ? (keep_size ? 0 : 1) : 2);
>  
> -	if (end_offset > file_size) {
> +	if (((loff_t)end_offset > file_size) && !punch_hole) {
>  		memset(good_buf + file_size, '\0', end_offset - file_size);
>  		file_size = end_offset;
>  	}
> @@ -827,13 +854,35 @@ dofallocate(unsigned offset, unsigned length)
>  	
>  	if ((progressinterval && testcalls % progressinterval == 0) ||
>  	    (debug && (monitorstart == -1 || monitorend == -1 ||
> -		      end_offset <= monitorend)))
> -		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);
> +		      end_offset <= monitorend))) {
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
> +			"punch hole" : "falloc";
> +#else
> +		op_name = "falloc";
> +#endif
> +		prt("%lu %s\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> +			op_name, offset, offset+length, length);
> +	}
> +	if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
> +			"punch hole" : "fallocate";
> +#else
> +		op_name = "fallocate";
> +#endif
> +
> +		prt("%s: %x to %x\n", op_name, offset, length);
>  		prterr("dofallocate: fallocate");
>  		report_failure(161);
>  	}
> +
> +	if (punch_hole) {
> +		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


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-02 19:23 ` Eric Sandeen
@ 2011-05-02 19:35   ` Eric Sandeen
  2011-05-02 20:29     ` Andreas Dilger
  0 siblings, 1 reply; 7+ messages in thread
From: Eric Sandeen @ 2011-05-02 19:35 UTC (permalink / raw)
  To: Allison Henderson; +Cc: linux-fsdevel, Ext4 Developers List, xfs-oss

On 5/2/11 2:23 PM, Eric Sandeen wrote:
> On 5/2/11 2:16 PM, Allison Henderson wrote:
>> This patch adds punch hole tests to the fsx
>> stress test.  The test is performed through
>> the fallocate call by randomly choosing to
>> use the punch hole flag when running the
>> fallocate test.  Regions that have
>> been punched out should contain zeros, so
>> the expected file contents buffer is updated
>> to contain zeros when a hole is punched out.
> 
> I'll cc: the xfs list since this would live in xfstests.
> 
> Thanks,
> -Eric
> 
>> Signed-off-by: Allison Henderson <achender@us.ibm.com>
>> ---
>> :100644 100644 32cd380... d424941... M	ltp/Makefile
>> :100644 100644 fe072d3... 4f54ef6... M	ltp/fsx.c
>>  ltp/Makefile |    2 +-
>>  ltp/fsx.c    |   73 ++++++++++++++++++++++++++++++++++++++++++++++++---------
>>  2 files changed, 62 insertions(+), 13 deletions(-)
>>
>> diff --git a/ltp/Makefile b/ltp/Makefile
>> index 32cd380..d424941 100644
>> --- a/ltp/Makefile
>> +++ b/ltp/Makefile
>> @@ -27,7 +27,7 @@ LCFLAGS += -DAIO
>>  LLDLIBS += -laio -lpthread
>>  endif
>>  
>> -ifeq ($(HAVE_FALLOCATE), true)
>> +ifeq ($(HAVE_FALLOCATE), yes)

argh I ended up with 2 fallocate tests in aclocal.m4, need to tidy that up, I'll do that in a separate patch.

>>  LCFLAGS += -DFALLOCATE
>>  endif
>>  
>> diff --git a/ltp/fsx.c b/ltp/fsx.c
>> index fe072d3..4f54ef6 100644
>> --- a/ltp/fsx.c
>> +++ b/ltp/fsx.c
>> @@ -207,7 +207,8 @@ logdump(void)
>>  {
>>  	int	i, count, down;
>>  	struct log_entry	*lp;
>> -	char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"};
>> +	char *falloc_type[4] = {"PAST_EOF", "EXTENDING", "INTERIOR",
>> +				"PUNCH_HOLE"};
>>  
>>  	prt("LOG DUMP (%d total operations):\n", logcount);
>>  	if (logcount < LOGSIZE) {
>> @@ -791,7 +792,11 @@ dofallocate(unsigned offset, unsigned length)
>>  {
>>  	unsigned end_offset;
>>  	int keep_size;
>> -
>> +	int max_offset = 0;
>> +	int max_len = 0;
>> +	int punch_hole = 0;
>> +	int mode = 0;
>> +	char *op_name;
>>          if (length == 0) {
>>                  if (!quiet && testcalls > simulatedopcount)
>>                          prt("skipping zero length fallocate\n");
>> @@ -799,11 +804,31 @@ dofallocate(unsigned offset, unsigned length)
>>                  return;
>>          }
>>  
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +	punch_hole = random() % 2;
>> +	/* Keep size must be set for punch hole */
>> +	if (punch_hole) {
>> +		keep_size = 1;
>> +		mode = FALLOC_FL_PUNCH_HOLE;
>> +	} else
>> +		keep_size = random() % 2;
>> +#else
>>  	keep_size = random() % 2;
>> +#endif
>> +
>> +	if (keep_size)
>> +		mode |= FALLOC_FL_KEEP_SIZE;
>> +
>> +	if (punch_hole && file_size <= (loff_t)offset) {
>> +		if (!quiet && testcalls > simulatedopcount)
>> +			prt("skipping hole punch off the end of the file\n");
>> +		log4(OP_SKIPPED, OP_FALLOCATE, offset, length);
>> +		return;
>> +	}
>>  
>>  	end_offset = keep_size ? 0 : offset + length;
>>  
>> -	if (end_offset > biggest) {
>> +	if ((end_offset > biggest) && !punch_hole) {
>>  		biggest = end_offset;
>>  		if (!quiet && testcalls > simulatedopcount)
>>  			prt("fallocating to largest ever: 0x%x\n", end_offset);
>> @@ -811,13 +836,15 @@ dofallocate(unsigned offset, unsigned length)
>>  
>>  	/*
>>  	 * last arg:
>> -	 * 	1: allocate past EOF
>> -	 * 	2: extending prealloc
>> -	 * 	3: interior prealloc
>> +	 *      0: allocate past EOF
>> +	 *      1: extending prealloc
>> +	 *      2: interior prealloc
>> +	 *      3: punch hole
>>  	 */
>> -	log4(OP_FALLOCATE, offset, length, (end_offset > file_size) ? (keep_size ? 1 : 2) : 3);
>> +	log4(OP_FALLOCATE, offset, length, punch_hole ? 3 :
>> +			(end_offset > file_size) ? (keep_size ? 0 : 1) : 2);
>>  
>> -	if (end_offset > file_size) {
>> +	if (((loff_t)end_offset > file_size) && !punch_hole) {
>>  		memset(good_buf + file_size, '\0', end_offset - file_size);
>>  		file_size = end_offset;
>>  	}
>> @@ -827,13 +854,35 @@ dofallocate(unsigned offset, unsigned length)
>>  	
>>  	if ((progressinterval && testcalls % progressinterval == 0) ||
>>  	    (debug && (monitorstart == -1 || monitorend == -1 ||
>> -		      end_offset <= monitorend)))
>> -		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);
>> +		      end_offset <= monitorend))) {
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
>> +			"punch hole" : "falloc";
>> +#else
>> +		op_name = "falloc";
>> +#endif
>> +		prt("%lu %s\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
>> +			op_name, offset, offset+length, length);
>> +	}
>> +	if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
>> +			"punch hole" : "fallocate";
>> +#else
>> +		op_name = "fallocate";
>> +#endif
>> +
>> +		prt("%s: %x to %x\n", op_name, offset, length);
>>  		prterr("dofallocate: fallocate");
>>  		report_failure(161);
>>  	}
>> +
>> +	if (punch_hole) {
>> +		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
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-02 19:35   ` Eric Sandeen
@ 2011-05-02 20:29     ` Andreas Dilger
  2011-05-02 22:39       ` Allison Henderson
  0 siblings, 1 reply; 7+ messages in thread
From: Andreas Dilger @ 2011-05-02 20:29 UTC (permalink / raw)
  To: Eric Sandeen
  Cc: Allison Henderson, linux-fsdevel, Ext4 Developers List, xfs-oss

On 5/2/11 2:16 PM, Allison Henderson wrote:
> This patch adds punch hole tests to the fsx
> stress test.  The test is performed through
> the fallocate call by randomly choosing to
> use the punch hole flag when running the
> fallocate test.  Regions that have
> been punched out should contain zeros, so
> the expected file contents buffer is updated
> to contain zeros when a hole is punched out.
> 
> Signed-off-by: Allison Henderson <achender@us.ibm.com>
> ---
> :100644 100644 32cd380... d424941... M	ltp/Makefile
> :100644 100644 fe072d3... 4f54ef6... M	ltp/fsx.c
> ltp/Makefile |    2 +-
> ltp/fsx.c    |   73 ++++++++++++++++++++++++++++++++++++++++++++++++---------
> 2 files changed, 62 insertions(+), 13 deletions(-)
> 
> diff --git a/ltp/Makefile b/ltp/Makefile
> index 32cd380..d424941 100644
> --- a/ltp/Makefile
> +++ b/ltp/Makefile
> @@ -27,7 +27,7 @@ LCFLAGS += -DAIO
> LLDLIBS += -laio -lpthread
> endif
> 
> -ifeq ($(HAVE_FALLOCATE), true)
> +ifeq ($(HAVE_FALLOCATE), yes)
> 

> LCFLAGS += -DFALLOCATE
> endif
> 
> diff --git a/ltp/fsx.c b/ltp/fsx.c
> index fe072d3..4f54ef6 100644
> --- a/ltp/fsx.c
> +++ b/ltp/fsx.c
> @@ -207,7 +207,8 @@ logdump(void)
> {
> 	int	i, count, down;
> 	struct log_entry	*lp;
> -	char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"};
> +	char *falloc_type[4] = {"PAST_EOF", "EXTENDING", "INTERIOR",
> +				"PUNCH_HOLE"};
> 
> 	prt("LOG DUMP (%d total operations):\n", logcount);
> 	if (logcount < LOGSIZE) {
> @@ -791,7 +792,11 @@ dofallocate(unsigned offset, unsigned length)
> {
> 	unsigned end_offset;
> 	int keep_size;
> -
> +	int max_offset = 0;
> +	int max_len = 0;
> +	int punch_hole = 0;
> +	int mode = 0;
> +	char *op_name;
>         if (length == 0) {
>                 if (!quiet && testcalls > simulatedopcount)
>                         prt("skipping zero length fallocate\n");
> @@ -799,11 +804,31 @@ dofallocate(unsigned offset, unsigned length)
>                 return;
>         }
> 
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +	punch_hole = random() % 2;
> +	/* Keep size must be set for punch hole */
> +	if (punch_hole) {
> +		keep_size = 1;
> +		mode = FALLOC_FL_PUNCH_HOLE;
> +	} else
> +		keep_size = random() % 2;
> +#else
> 	keep_size = random() % 2;
> +#endif
> +
> +	if (keep_size)
> +		mode |= FALLOC_FL_KEEP_SIZE;
> +
> +	if (punch_hole && file_size <= (loff_t)offset) {
> +		if (!quiet && testcalls > simulatedopcount)
> +			prt("skipping hole punch off the end of the file\n");
> +		log4(OP_SKIPPED, OP_FALLOCATE, offset, length);
> +		return;
> +	}

Isn't a hole punch off the end of the file is just a truncate?  I think that is a valid test case, since punch(newsize, ~0ULL) should be identical to truncate(newsize). In that case, "keep_size" would affect whether the file size is left alone, or it is now "newsize", so I don't think it should always be set to run with keep_size = 1 for FALLOC_FL_PUNCH_HOLE operations.

> 	end_offset = keep_size ? 0 : offset + length;
> 
> -	if (end_offset > biggest) {
> +	if ((end_offset > biggest) && !punch_hole) {
> 		biggest = end_offset;
> 		if (!quiet && testcalls > simulatedopcount)
> 			prt("fallocating to largest ever: 0x%x\n", end_offset);
> @@ -811,13 +836,15 @@ dofallocate(unsigned offset, unsigned length)
> 
> 	/*
> 	 * last arg:
> -	 * 	1: allocate past EOF
> -	 * 	2: extending prealloc
> -	 * 	3: interior prealloc
> +	 *      0: allocate past EOF
> +	 *      1: extending prealloc
> +	 *      2: interior prealloc
> +	 *      3: punch hole
> 	 */
> -	log4(OP_FALLOCATE, offset, length, (end_offset > file_size) ? (keep_size ? 1 : 2) : 3);
> +	log4(OP_FALLOCATE, offset, length, punch_hole ? 3 :
> +			(end_offset > file_size) ? (keep_size ? 0 : 1) : 2);
> 
> -	if (end_offset > file_size) {
> +	if (((loff_t)end_offset > file_size) && !punch_hole) {
> 		memset(good_buf + file_size, '\0', end_offset - file_size);
> 		file_size = end_offset;
> 	}
> @@ -827,13 +854,35 @@ dofallocate(unsigned offset, unsigned length)
> 	
> 	if ((progressinterval && testcalls % progressinterval == 0) ||
> 	    (debug && (monitorstart == -1 || monitorend == -1 ||
> -		      end_offset <= monitorend)))
> -		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);
> +		      end_offset <= monitorend))) {
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
> +			"punch hole" : "falloc";
> +#else
> +		op_name = "falloc";
> +#endif
> +		prt("%lu %s\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
> +			op_name, offset, offset+length, length);
> +	}
> +	if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
> +#ifdef FALLOC_FL_PUNCH_HOLE
> +		op_name = (mode & FALLOC_FL_PUNCH_HOLE) ?
> +			"punch hole" : "fallocate";
> +#else
> +		op_name = "fallocate";
> +#endif
> +
> +		prt("%s: %x to %x\n", op_name, offset, length);
> 		prterr("dofallocate: fallocate");
> 		report_failure(161);
> 	}
> +
> +	if (punch_hole) {
> +		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


Cheers, Andreas






^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-02 20:29     ` Andreas Dilger
@ 2011-05-02 22:39       ` Allison Henderson
  0 siblings, 0 replies; 7+ messages in thread
From: Allison Henderson @ 2011-05-02 22:39 UTC (permalink / raw)
  To: Andreas Dilger; +Cc: Eric Sandeen, linux-fsdevel, Ext4 Developers List, xfs-oss

On 5/2/2011 1:29 PM, Andreas Dilger wrote:
> On 5/2/11 2:16 PM, Allison Henderson wrote:
>> This patch adds punch hole tests to the fsx
>> stress test.  The test is performed through
>> the fallocate call by randomly choosing to
>> use the punch hole flag when running the
>> fallocate test.  Regions that have
>> been punched out should contain zeros, so
>> the expected file contents buffer is updated
>> to contain zeros when a hole is punched out.
>>
>> Signed-off-by: Allison Henderson<achender@us.ibm.com>
>> ---
>> :100644 100644 32cd380... d424941... M	ltp/Makefile
>> :100644 100644 fe072d3... 4f54ef6... M	ltp/fsx.c
>> ltp/Makefile |    2 +-
>> ltp/fsx.c    |   73 ++++++++++++++++++++++++++++++++++++++++++++++++---------
>> 2 files changed, 62 insertions(+), 13 deletions(-)
>>
>> diff --git a/ltp/Makefile b/ltp/Makefile
>> index 32cd380..d424941 100644
>> --- a/ltp/Makefile
>> +++ b/ltp/Makefile
>> @@ -27,7 +27,7 @@ LCFLAGS += -DAIO
>> LLDLIBS += -laio -lpthread
>> endif
>>
>> -ifeq ($(HAVE_FALLOCATE), true)
>> +ifeq ($(HAVE_FALLOCATE), yes)
>>
> 
>> LCFLAGS += -DFALLOCATE
>> endif
>>
>> diff --git a/ltp/fsx.c b/ltp/fsx.c
>> index fe072d3..4f54ef6 100644
>> --- a/ltp/fsx.c
>> +++ b/ltp/fsx.c
>> @@ -207,7 +207,8 @@ logdump(void)
>> {
>> 	int	i, count, down;
>> 	struct log_entry	*lp;
>> -	char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"};
>> +	char *falloc_type[4] = {"PAST_EOF", "EXTENDING", "INTERIOR",
>> +				"PUNCH_HOLE"};
>>
>> 	prt("LOG DUMP (%d total operations):\n", logcount);
>> 	if (logcount<  LOGSIZE) {
>> @@ -791,7 +792,11 @@ dofallocate(unsigned offset, unsigned length)
>> {
>> 	unsigned end_offset;
>> 	int keep_size;
>> -
>> +	int max_offset = 0;
>> +	int max_len = 0;
>> +	int punch_hole = 0;
>> +	int mode = 0;
>> +	char *op_name;
>>          if (length == 0) {
>>                  if (!quiet&&  testcalls>  simulatedopcount)
>>                          prt("skipping zero length fallocate\n");
>> @@ -799,11 +804,31 @@ dofallocate(unsigned offset, unsigned length)
>>                  return;
>>          }
>>
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +	punch_hole = random() % 2;
>> +	/* Keep size must be set for punch hole */
>> +	if (punch_hole) {
>> +		keep_size = 1;
>> +		mode = FALLOC_FL_PUNCH_HOLE;
>> +	} else
>> +		keep_size = random() % 2;
>> +#else
>> 	keep_size = random() % 2;
>> +#endif
>> +
>> +	if (keep_size)
>> +		mode |= FALLOC_FL_KEEP_SIZE;
>> +
>> +	if (punch_hole&&  file_size<= (loff_t)offset) {
>> +		if (!quiet&&  testcalls>  simulatedopcount)
>> +			prt("skipping hole punch off the end of the file\n");
>> +		log4(OP_SKIPPED, OP_FALLOCATE, offset, length);
>> +		return;
>> +	}
> 
> Isn't a hole punch off the end of the file is just a truncate?  I think that is a valid test case, since punch(newsize, ~0ULL) should be identical to truncate(newsize). In that case, "keep_size" would affect whether the file size is left alone, or it is now "newsize", so I don't think it should always be set to run with keep_size = 1 for FALLOC_FL_PUNCH_HOLE operations.

Hi there, 

Well actually punch hole requires that the keep size flag be set when using the punch hole flag, so it's not quite the same as truncate.  The punch hole operation does not modify the length of the file, it only changes whether or not the specified blocks are allocated.  So a hole that extends off the end of the file would cause the last few blocks of the file to be released, but the length of the file would not shrink.  The above code snippet though is checking to see if the entire hole is off the edge of the file.  For example, the file is 3 blocks in length, but we are trying to punch out blocks 5 though 7.  This operation would have no effect, so we skip it here.

Allison Henderson

> 
>> 	end_offset = keep_size ? 0 : offset + length;
>>
>> -	if (end_offset>  biggest) {
>> +	if ((end_offset>  biggest)&&  !punch_hole) {
>> 		biggest = end_offset;
>> 		if (!quiet&&  testcalls>  simulatedopcount)
>> 			prt("fallocating to largest ever: 0x%x\n", end_offset);
>> @@ -811,13 +836,15 @@ dofallocate(unsigned offset, unsigned length)
>>
>> 	/*
>> 	 * last arg:
>> -	 * 	1: allocate past EOF
>> -	 * 	2: extending prealloc
>> -	 * 	3: interior prealloc
>> +	 *      0: allocate past EOF
>> +	 *      1: extending prealloc
>> +	 *      2: interior prealloc
>> +	 *      3: punch hole
>> 	 */
>> -	log4(OP_FALLOCATE, offset, length, (end_offset>  file_size) ? (keep_size ? 1 : 2) : 3);
>> +	log4(OP_FALLOCATE, offset, length, punch_hole ? 3 :
>> +			(end_offset>  file_size) ? (keep_size ? 0 : 1) : 2);
>>
>> -	if (end_offset>  file_size) {
>> +	if (((loff_t)end_offset>  file_size)&&  !punch_hole) {
>> 		memset(good_buf + file_size, '\0', end_offset - file_size);
>> 		file_size = end_offset;
>> 	}
>> @@ -827,13 +854,35 @@ dofallocate(unsigned offset, unsigned length)
>> 	
>> 	if ((progressinterval&&  testcalls % progressinterval == 0) ||
>> 	    (debug&&  (monitorstart == -1 || monitorend == -1 ||
>> -		      end_offset<= monitorend)))
>> -		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);
>> +		      end_offset<= monitorend))) {
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +		op_name = (mode&  FALLOC_FL_PUNCH_HOLE) ?
>> +			"punch hole" : "falloc";
>> +#else
>> +		op_name = "falloc";
>> +#endif
>> +		prt("%lu %s\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls,
>> +			op_name, offset, offset+length, length);
>> +	}
>> +	if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
>> +#ifdef FALLOC_FL_PUNCH_HOLE
>> +		op_name = (mode&  FALLOC_FL_PUNCH_HOLE) ?
>> +			"punch hole" : "fallocate";
>> +#else
>> +		op_name = "fallocate";
>> +#endif
>> +
>> +		prt("%s: %x to %x\n", op_name, offset, length);
>> 		prterr("dofallocate: fallocate");
>> 		report_failure(161);
>> 	}
>> +
>> +	if (punch_hole) {
>> +		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
> 
> 
> Cheers, Andreas
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-02 19:16 [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX Allison Henderson
  2011-05-02 19:23 ` Eric Sandeen
@ 2011-05-03 13:18 ` Josef Bacik
  2011-05-03 15:36   ` Allison Henderson
  1 sibling, 1 reply; 7+ messages in thread
From: Josef Bacik @ 2011-05-03 13:18 UTC (permalink / raw)
  To: Allison Henderson; +Cc: linux-fsdevel, Ext4 Developers List

On 05/02/2011 03:16 PM, Allison Henderson wrote:
> This patch adds punch hole tests to the fsx
> stress test.  The test is performed through
> the fallocate call by randomly choosing to
> use the punch hole flag when running the
> fallocate test.  Regions that have
> been punched out should contain zeros, so
> the expected file contents buffer is updated
> to contain zeros when a hole is punched out.
>

It doesn't look like you have anything to detect if the hole punching 
failed to disable it, how does this behave on say btrfs where we don't 
do hole punching yet?  Thanks,

Josef

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX
  2011-05-03 13:18 ` Josef Bacik
@ 2011-05-03 15:36   ` Allison Henderson
  0 siblings, 0 replies; 7+ messages in thread
From: Allison Henderson @ 2011-05-03 15:36 UTC (permalink / raw)
  To: Josef Bacik; +Cc: linux-fsdevel, Ext4 Developers List

On 5/3/2011 6:18 AM, Josef Bacik wrote:
> On 05/02/2011 03:16 PM, Allison Henderson wrote:
>> This patch adds punch hole tests to the fsx
>> stress test. The test is performed through
>> the fallocate call by randomly choosing to
>> use the punch hole flag when running the
>> fallocate test. Regions that have
>> been punched out should contain zeros, so
>> the expected file contents buffer is updated
>> to contain zeros when a hole is punched out.
>>
>
> It doesn't look like you have anything to detect if the hole punching
> failed to disable it, how does this behave on say btrfs where we don't
> do hole punching yet? Thanks,
>
> Josef


Hi there,

Oh it looks like I need to add a check for that.  I was so busy using it 
to test ext4 that I forgot to put that in.  Thx!

Allison Henderson

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-05-03 15:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-02 19:16 [XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX Allison Henderson
2011-05-02 19:23 ` Eric Sandeen
2011-05-02 19:35   ` Eric Sandeen
2011-05-02 20:29     ` Andreas Dilger
2011-05-02 22:39       ` Allison Henderson
2011-05-03 13:18 ` Josef Bacik
2011-05-03 15:36   ` Allison Henderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).