[XFS Punch Hole 1/1] XFS Add Punch Hole Testing to FSX

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
: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

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux