[Ocfs2-test-devel] [PATCH 2/2] Ocfs2-test: Stop claiming large memory chunks from function stack in reflink_test.

Tristan Ye tristan.ye at oracle.com
Sun Jun 13 01:38:52 PDT 2010


During multi-nodes reflink tests, we meet segfault sometimes due to claiming
memory chunks more than 1M from function stack, this patch tries to replace
all these usages with dynamic allocation from heap.

Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
 programs/reflink_tests/multi_reflink_test.c |  181 +++++++++++----
 programs/reflink_tests/reflink_test.c       |  327 ++++++++++++++++++---------
 programs/reflink_tests/reflink_test_utils.c |  211 +++++++++++-------
 3 files changed, 486 insertions(+), 233 deletions(-)

diff --git a/programs/reflink_tests/multi_reflink_test.c b/programs/reflink_tests/multi_reflink_test.c
index 0cb1447..6c951af 100755
--- a/programs/reflink_tests/multi_reflink_test.c
+++ b/programs/reflink_tests/multi_reflink_test.c
@@ -330,17 +330,19 @@ static void should_exit(int ret)
 
 static int basic_test(void)
 {
-	int ret, fd;
+	int ret = 0, fd;
 	char dest[PATH_MAX];
 	int sub_testno = 1;
 
-	char write_buf[HUNK_SIZE * 2];
-	char read_buf[HUNK_SIZE * 2];
+	char *write_buf = NULL, *read_buf = NULL;
 
 	unsigned long write_size = 0, read_size = 0;
 	unsigned long append_size = 0, truncate_size = 0;
 	unsigned long interval, offset = 0;
 
+	write_buf = (char *)malloc(HUNK_SIZE * 2);
+	read_buf = (char *)malloc(HUNK_SIZE * 2);
+
 	root_printf("Test %d: Multi-nodes basic refcount test.\n", testno++);
 
 	snprintf(orig_path, PATH_MAX, "%s/multi_original_basic_refile",
@@ -352,7 +354,8 @@ static int basic_test(void)
 	if (!rank) {
 
 		ret = prep_orig_file(orig_path, file_size, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -368,14 +371,16 @@ static int basic_test(void)
 
 		snprintf(dest, PATH_MAX, "%s-%s-%d", orig_path, hostname, rank);
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
 
 	if (!rank) {
 		ret = verify_orig_file(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -410,7 +415,8 @@ static int basic_test(void)
 				ret = write_at_file(dest, write_buf, write_size,
 						    offset);
 
-			should_exit(ret);
+			if (ret)
+				goto bail_free;
 
 			if (test_flags & RAND_TEST)
 				offset += write_size + get_rand(1, interval);
@@ -423,7 +429,8 @@ static int basic_test(void)
 
 	if (!rank) {
 		ret = verify_orig_file(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -455,7 +462,8 @@ static int basic_test(void)
 				ret = read_at_file(dest, read_buf, read_size,
 						   offset);
 
-			should_exit(ret);
+			if (ret)
+				goto bail_free;
 
 			if (test_flags & RAND_TEST)
 				offset = offset + read_size +
@@ -470,7 +478,8 @@ static int basic_test(void)
 
 	if (!rank) {
 		ret = verify_orig_file(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -489,6 +498,11 @@ static int basic_test(void)
 		snprintf(dest, PATH_MAX, "%s-%s-%d", orig_path, hostname, rank);
 		fd = open64(dest, open_rw_flags | O_APPEND);
 		if (fd < 0) {
+			if (write_buf)
+				free(write_buf);
+
+			if (read_buf)
+				free(read_buf);
 			fd = errno;
 			abort_printf("open file %s failed:%d:%s\n",
 				     dest, fd, strerror(fd));
@@ -503,6 +517,11 @@ static int basic_test(void)
 
 		ret = write(fd, write_buf, append_size);
 		if (ret < 0) {
+			if (write_buf)
+				free(write_buf);
+
+			if (read_buf)
+				free(read_buf);
 			ret = errno;
 			abort_printf("write file %s failed:%d:%s\n",
 				     dest, ret, strerror(ret));
@@ -515,7 +534,8 @@ static int basic_test(void)
 
 	if (!rank) {
 		ret = verify_orig_file(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -539,6 +559,11 @@ static int basic_test(void)
 		ret = truncate(dest, truncate_size);
 
 		if (ret < 0) {
+			if (write_buf)
+				free(write_buf);
+
+			if (read_buf)
+				free(read_buf);
 			ret = errno;
 			abort_printf("truncate file %s failed:%d:%s\n",
 				     dest, ret, strerror(ret));
@@ -549,7 +574,8 @@ static int basic_test(void)
 
 	if (!rank) {
 		ret = verify_orig_file(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
@@ -558,17 +584,29 @@ bail:
 	if (rank) {
 
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 
 	} else {
 
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail_free;
 	}
 
 	MPI_Barrier_Sync();
 
-	return 0;
+bail_free:
+
+	if (write_buf)
+		free(write_buf);
+
+	if (read_buf)
+		free(read_buf);
+	
+	should_exit(ret);
+
+	return ret;
 }
 
 static int directio_test(void)
@@ -1031,10 +1069,12 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 	unsigned long i, j;
 	char dest[PATH_MAX];
 
-	int fd, ret, o_ret;
+	int fd, ret = 0, o_ret;
 
 	unsigned long offset = 0, write_size = 0;
-	char write_buf[HUNK_SIZE];
+	char *write_buf = NULL;
+
+	write_buf = (char *)malloc(HUNK_SIZE);
 
 	for (i = 0; i < iter; i++) {
 
@@ -1047,7 +1087,7 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 			fprintf(stderr, "open file %s failed:%d:%s\n",
 				dest, fd, strerror(fd));
 			fd = o_ret;
-			return fd;
+			goto bail;
 		}
 		strcpy(filename, dest);
 
@@ -1075,11 +1115,11 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 
 				ret = read_ea(NORMAL, fd);
 				if (ret < 0)
-					return ret;
+					goto bail;
 
 				ret = xattr_value_validator(j);
 				if (ret < 0)
-					return ret;
+					goto bail;
 			}
 
 			/* Update file data*/
@@ -1094,14 +1134,18 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 
 			ret = write_at(fd, write_buf, write_size, offset);
 			if (ret < 0)
-				return ret;
+				goto bail;
 
 		}
 
 		close(fd);
 	}
 
-	return 0;
+bail:
+	if (write_buf)
+		free(write_buf);
+
+	return ret;
 }
 
 static int xattr_basic_test(int ea_name_size, int ea_value_size)
@@ -1300,15 +1344,18 @@ static int xattr_test(void)
 static int stress_test(void)
 {
 	unsigned long i, j;
-	int ret, sub_testno = 1;
-	char write_buf[2 * HUNK_SIZE], dest[PATH_MAX];
+	int ret = 0, sub_testno = 1;
+	char *write_buf = NULL, dest[PATH_MAX];
 	char tmp_dest[PATH_MAX], tmp_orig[PATH_MAX];
-	char pattern_buf[HUNK_SIZE * 2];
-	char verify_buf[HUNK_SIZE * 2];
+	char *pattern_buf = NULL, *verify_buf = NULL;
 
 	unsigned long offset = 0, write_size = 0, interval = 0;
 	unsigned long verify_size = 0, verify_offset = 0;
 
+	write_buf = (char *)malloc(HUNK_SIZE * 2);
+	pattern_buf = (char *)malloc(HUNK_SIZE * 2);
+	verify_buf = (char *)malloc(HUNK_SIZE * 2);
+
 	root_printf("Test %d: Multi-nodes stress refcount test.\n", testno++);
 
 	root_printf("  *SubTest %d: Stress test with tremendous refcount "
@@ -1320,9 +1367,11 @@ static int stress_test(void)
 			 "refile_rank%d_%ld", workplace, rank, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = prep_orig_file(orig_path, 32 * 1024, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -1334,7 +1383,8 @@ static int stress_test(void)
 		write_size = 1;
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(dest, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -1342,9 +1392,11 @@ static int stress_test(void)
 			 "rank%d_%ld", workplace, rank, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	MPI_Barrier_Sync();
@@ -1359,12 +1411,14 @@ static int stress_test(void)
 	if (!rank) {
 
 		ret = prep_orig_file(orig_path, 10 * HUNK_SIZE, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		for (i = 1; i < size; i++) {
 			snprintf(ref_path, PATH_MAX, "%s_%ld", dest, i);
 			ret = reflink(orig_path, ref_path, 1);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 		}
 	}
 
@@ -1374,7 +1428,8 @@ static int stress_test(void)
 
 		snprintf(ref_path, PATH_MAX, "%s_%d", dest, rank);
 		ret = do_reflinks(ref_path, ref_path, ref_counts, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		for (i = 0; i < ref_counts; i++) {
 
@@ -1393,6 +1448,8 @@ static int stress_test(void)
 			get_rand_buf(write_buf, write_size);
 			ret = write_at_file(ref_path, write_buf, write_size,
 					    offset);
+			if (ret)
+				goto bail;
 		}
 
 	}
@@ -1419,7 +1476,8 @@ static int stress_test(void)
 
 		snprintf(ref_path, PATH_MAX, "%s_%d", dest, rank);
 		ret = do_unlinks(ref_path, ref_counts);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 	} else {
 
@@ -1427,11 +1485,13 @@ static int stress_test(void)
 
 			snprintf(ref_path, PATH_MAX, "%s_%ld", dest, i);
 			ret = do_unlink(ref_path);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 		}
 
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	MPI_Barrier_Sync();
@@ -1446,9 +1506,11 @@ static int stress_test(void)
 
 	if (!rank) {
 		ret = prep_orig_file(orig_path, file_size, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	MPI_Barrier_Sync();
@@ -1463,7 +1525,8 @@ static int stress_test(void)
 			snprintf(dest, PATH_MAX, "%s_%d_%ld", tmp_dest,
 				 rank, i);
 			ret = reflink(orig_path, dest, 1);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			write_size = get_rand(1, M_SIZE);
 			get_rand_buf(write_buf, write_size);
@@ -1481,20 +1544,24 @@ static int stress_test(void)
 
 			ret = read_at_file(orig_path, pattern_buf, verify_size,
 					   verify_offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			ret = write_at_file(dest, write_buf, write_size,
 					    offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			ret = read_at_file(orig_path, verify_buf, verify_size,
 					   verify_offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			if (memcmp(pattern_buf, verify_buf, verify_size)) {
 				abort_printf("Verify original file date failed"
 					     " after writting to snapshot!\n");
-				should_exit(-1);
+				ret = -1;
+				goto bail;
 			}
 
 			offset = offset + write_size + interval;
@@ -1509,7 +1576,8 @@ static int stress_test(void)
 				 rank, j);
 
 			ret = do_unlink(dest);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 		}
 
 		strcpy(dest, tmp_dest);
@@ -1522,7 +1590,8 @@ static int stress_test(void)
 			get_rand_buf(write_buf, write_size);
 			ret = write_at_file(dest, write_buf,
 					    write_size, offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			offset = offset + write_size + interval;
 		}
@@ -1534,13 +1603,27 @@ static int stress_test(void)
 	if (!rank) {
 
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
-	return 0;
+bail:
+	if (write_buf)
+		free(write_buf);
+
+	if (pattern_buf)
+		free(pattern_buf);
+
+	if (verify_buf)
+		free(verify_buf);
+
+	should_exit(ret);
+
+	return ret;
 }
 
 static int dest_test(void)
diff --git a/programs/reflink_tests/reflink_test.c b/programs/reflink_tests/reflink_test.c
index 6de95fb..c0221ec 100755
--- a/programs/reflink_tests/reflink_test.c
+++ b/programs/reflink_tests/reflink_test.c
@@ -465,7 +465,7 @@ static int basic_test()
 static int boundary_test()
 {
 	char dest[PATH_MAX];
-	char write_buf[HUNK_SIZE * 2];
+	char *write_buf = NULL;
 	unsigned long offset = 0, write_size = 0;
 	unsigned long extent_size = 0, write_pos = 0;
 
@@ -475,161 +475,214 @@ static int boundary_test()
 	snprintf(orig_path, PATH_MAX, "%s/original_bound_refile", workplace);
 	snprintf(dest, PATH_MAX, "%s_target", orig_path);
 
+	write_buf = (char *)malloc(HUNK_SIZE * 2);
+
 	printf("  *SubTest %d: CoW on extent 1 more byte than max_inline_sz.\n",
 	       sub_testno++);
 	ret = prep_orig_file(orig_path, max_inline_size + 1, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = 0;
 	write_size = 1;
 	get_rand_buf(write_buf, 1);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	truncate(dest, 0);
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = max_inline_size;
 	write_size = 1;
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	truncate(dest, 0);
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = get_rand(0, max_inline_size);
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	truncate(dest, max_inline_size);
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = verify_orig_file(orig_path);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	printf("  *SubTest %d: CoW on extent between max_inline_sz and 1M.\n",
 	       sub_testno++);
 	extent_size = get_rand(max_inline_size + 1, M_SIZE);
 	ret = prep_orig_file(orig_path, extent_size, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = get_rand(0, extent_size - 1);
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = verify_orig_file(orig_path);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	printf("  *SubTest %d: CoW on 1M extent.\n", sub_testno++);
 	ret = prep_orig_file(orig_path, M_SIZE, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = get_rand(0, M_SIZE - 1);
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = verify_orig_file(orig_path);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	printf("  *SubTest %d: CoW on contiguous 1G extent.\n", sub_testno++);
 	ret = prep_orig_file(orig_path, G_SIZE, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = 0;
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = G_SIZE - 1;
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = get_rand(0, G_SIZE - 1);
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = 0;
 	while (offset < G_SIZE) {
 		write_pos = get_rand(offset, offset + M_SIZE - 1);
 		ret = write_at_file(dest, write_buf, write_size, write_pos);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		offset += M_SIZE;
 	}
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	printf("  *SubTest %d: CoW on incontiguous 1G extent.\n", sub_testno++);
 	ret = prep_orig_file(orig_path, G_SIZE, 0);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = 0;
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = G_SIZE - 1;
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = get_rand(0, G_SIZE - 1);
 	get_rand_buf(write_buf, write_size);
 	ret = write_at_file(dest, write_buf, write_size, offset);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	offset = 0;
 	while (offset < G_SIZE) {
 		write_pos = get_rand(offset, offset + M_SIZE - 1);
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(dest, write_buf, write_size, write_pos);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		offset += M_SIZE;
 	}
 
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = do_unlink(orig_path);
+bail:
+	if (write_buf)
+		free(write_buf);
+
 	should_exit(ret);
 
 	return 0;
@@ -638,9 +691,9 @@ static int boundary_test()
 static int stress_test()
 {
 	char dest[PATH_MAX], tmp_dest[PATH_MAX], tmp_orig[PATH_MAX];
-	char write_buf[HUNK_SIZE];
-	char pattern_buf[HUNK_SIZE * 2];
-	char verify_buf[HUNK_SIZE * 2];
+	char *write_buf = NULL;
+	char *pattern_buf = NULL;
+	char *verify_buf = NULL;
 	unsigned long offset = 0, write_size = 0;
 	unsigned long verify_size = 0, verify_offset = 0;
 	unsigned long i, j, interval = 0;
@@ -648,6 +701,10 @@ static int stress_test()
 
 	int sub_testno = 1;
 
+	write_buf = (char *)malloc(HUNK_SIZE);
+	pattern_buf = (char *)malloc(HUNK_SIZE * 2);
+	verify_buf = (char *)malloc(HUNK_SIZE * 2);
+
 	printf("Test %d: Stress refcount test.\n", testno++);
 
 	printf("  *SubTest %d: Stress test with tremendous refcount trees.\n",
@@ -658,9 +715,11 @@ static int stress_test()
 			 workplace, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = prep_orig_file(orig_path, max_inline_size + 1, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -672,7 +731,8 @@ static int stress_test()
 		write_size = 1;
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(dest, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -680,9 +740,11 @@ static int stress_test()
 			 workplace, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	fflush(stdout);
@@ -691,9 +753,11 @@ static int stress_test()
 	       "one refcount tree.\n", sub_testno++);
 	snprintf(orig_path, PATH_MAX, "%s/original_stress_refile", workplace);
 	ret = prep_orig_file(orig_path, max_inline_size + 1, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_reflinks(orig_path, orig_path, ref_counts, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	for (i = 0; i < ref_counts; i++) {
 
@@ -708,7 +772,8 @@ static int stress_test()
 			get_rand_buf(write_buf, write_size);
 			ret = write_at_file(dest, write_buf, write_size,
 					    offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 			offset += write_size;
 		}
 
@@ -725,9 +790,11 @@ static int stress_test()
 	}
 
 	ret = do_unlinks(orig_path, ref_counts);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(orig_path);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	fflush(stdout);
 
@@ -737,9 +804,11 @@ static int stress_test()
 	snprintf(orig_path, PATH_MAX, "%s/original_stress_refile", workplace);
 	snprintf(dest, PATH_MAX, "%s_target", orig_path);
 	ret = prep_orig_file(orig_path, file_size, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	strcpy(tmp_dest, dest);
 	strcpy(tmp_orig, orig_path);
 
@@ -751,7 +820,8 @@ static int stress_test()
 
 		snprintf(dest, PATH_MAX, "%s_%ld", tmp_dest, i);
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		write_size = get_rand(1, M_SIZE);
 		get_rand_buf(write_buf, write_size);
@@ -768,16 +838,19 @@ static int stress_test()
 
 		ret = read_at_file(orig_path, pattern_buf, verify_size,
 				   verify_offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		ret = write_at_file(dest, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		sync();
 
 		ret = read_at_file(orig_path, verify_buf, verify_size,
 				   verify_offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		if (memcmp(pattern_buf, verify_buf, verify_size)) {
 			fprintf(stderr, "Verify original file date failed "
@@ -796,16 +869,19 @@ static int stress_test()
 		snprintf(dest, PATH_MAX, "%s_%ld", tmp_dest, j);
 
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	strcpy(orig_path, tmp_orig);
 
 	ret = do_reflinks_at_random(orig_path, orig_path, ref_counts);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = do_unlinks(orig_path, ref_counts);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	strcpy(dest, tmp_dest);
 	offset = 0;
@@ -816,16 +892,19 @@ static int stress_test()
 		write_size = get_rand(1, M_SIZE);
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(dest, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		offset = offset + write_size + interval;
 	}
 
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = do_unlink(orig_path);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	fflush(stdout);
 
@@ -835,9 +914,11 @@ static int stress_test()
 	snprintf(orig_path, PATH_MAX, "%s/original_stress_refile", workplace);
 	snprintf(dest, PATH_MAX, "%s_target", orig_path);
 	ret = prep_orig_file(orig_path, file_size, 0);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = reflink(orig_path, dest, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	/*Then write original and target file randomly*/
 	offset = 0;
@@ -848,15 +929,27 @@ static int stress_test()
 		write_size = get_rand(1, M_SIZE);
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(orig_path, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 
 		offset = offset + write_size + interval;
 	}
 
 	ret = do_unlink(dest);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	ret = do_unlink(orig_path);
+bail:
+	if (write_buf)
+		free(write_buf);
+
+	if (pattern_buf)
+		free(pattern_buf);
+
+	if (verify_buf)
+		free(verify_buf);
+
 	should_exit(ret);
 
 	return 0;
@@ -1154,10 +1247,12 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 	unsigned long i, j;
 	char dest[PATH_MAX];
 
-	int fd, ret, o_ret;
+	int fd, ret = 0;
 
 	unsigned long offset = 0, write_size = 0;
-	char write_buf[HUNK_SIZE];
+	char *write_buf = NULL;
+
+	write_buf = (char *)malloc(HUNK_SIZE);
 
 	for (i = 0; i < iter; i++) {
 
@@ -1165,12 +1260,11 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 
 		fd = open64(dest, open_rw_flags);
 		if (fd < 0) {
-			o_ret = fd;
-			fd = errno;
+			ret = errno;
 			fprintf(stderr, "open file %s failed:%d:%s\n",
-				dest, fd, strerror(fd));
-			fd = o_ret;
-			return fd;
+				dest, ret, strerror(ret));
+			ret = fd;
+			goto bail;
 		}
 
 		strcpy(filename, dest);
@@ -1189,13 +1283,16 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 
 			ret = add_or_update_ea(NORMAL, fd, XATTR_REPLACE,
 					       "update");
-			should_exit(ret);
+			if (ret)
+				goto bail;
 
 			if (xattr_value_sz > xattr_name_sz + 50) {
 				ret = read_ea(NORMAL, fd);
-				should_exit(ret);
+				if (ret)
+					goto bail;
 				ret = xattr_value_validator(j);
-				should_exit(ret);
+				if (ret)
+					goto bail;
 			}
 
 			/* Update file data*/
@@ -1210,14 +1307,20 @@ static int do_xattr_data_cows(char *ref_pfx, unsigned long iter, int ea_nums)
 
 			ret = write_at(fd, write_buf, write_size, offset);
 			if (ret < 0)
-				return ret;
+				goto bail;
 
 		}
 
 		close(fd);
 	}
 
-	return 0;
+bail:
+	if (write_buf)
+		free(write_buf);
+
+	should_exit(ret);
+
+	return ret;
 }
 
 static int do_xattr_reads(char *ref_pfx, unsigned long iter, int ea_nums)
@@ -2138,7 +2241,7 @@ static int directio_test(void)
 static int inline_test(void)
 {
 	char dest[PATH_MAX];
-	char write_buf[HUNK_SIZE];
+	char *write_buf = NULL;
 	unsigned long offset = 0, write_size = 0;
 	unsigned long i = 0;
 
@@ -2146,6 +2249,8 @@ static int inline_test(void)
 
 	printf("Test %d: Reflink on inlined files test.\n", testno++);
 
+	write_buf = (char *)malloc(HUNK_SIZE);
+
 	if (file_size > max_inline_size)
 		file_size = get_rand(0, max_inline_size);
 
@@ -2157,7 +2262,8 @@ static int inline_test(void)
 
 	ret = xattr_basic_test(xattr_nums, XATTR_NAME_LEAST_SZ,
 			       XATTR_VALUE_TO_CLUSTER + 100);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	fflush(stdout);
 
@@ -2169,9 +2275,11 @@ static int inline_test(void)
 			 "refile_%ld", workplace, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = prep_orig_file(orig_path, file_size, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		ret = reflink(orig_path, dest, 1);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -2183,12 +2291,14 @@ static int inline_test(void)
 		write_size = 1;
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(orig_path, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 		offset = get_rand(max_inline_size, max_inline_size * 2);
 		write_size = 1;
 		get_rand_buf(write_buf, write_size);
 		ret = write_at_file(dest, write_buf, write_size, offset);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	for (i = 0; i < ref_trees; i++) {
@@ -2196,9 +2306,12 @@ static int inline_test(void)
 			 "refile_%ld", workplace, i);
 		snprintf(dest, PATH_MAX, "%s_target", orig_path);
 		ret = do_unlink(orig_path);
-		should_exit(ret);
+		if (ret)
+			goto bail;
+
 		ret = do_unlink(dest);
-		should_exit(ret);
+		if (ret)
+			goto bail;
 	}
 
 	fflush(stdout);
@@ -2208,10 +2321,12 @@ static int inline_test(void)
 	snprintf(orig_path, PATH_MAX, "%s/original_inline_stress_refile",
 		 workplace);
 	ret = prep_orig_file(orig_path, file_size, 1);
+	if (ret)
+		goto bail;
 
-	should_exit(ret);
 	ret = do_reflinks(orig_path, orig_path, ref_counts, 1);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 
 	for (i = 0; i < ref_counts; i++) {
 
@@ -2226,7 +2341,8 @@ static int inline_test(void)
 			get_rand_buf(write_buf, write_size);
 			ret = write_at_file(dest, write_buf, write_size,
 					    offset);
-			should_exit(ret);
+			if (ret)
+				goto bail;
 			offset += write_size;
 		}
 
@@ -2243,8 +2359,13 @@ static int inline_test(void)
 	}
 
 	ret = do_unlinks(orig_path, ref_counts);
-	should_exit(ret);
+	if (ret)
+		goto bail;
 	ret = do_unlink(orig_path);
+bail:
+	if (write_buf)
+		free(write_buf);
+
 	should_exit(ret);
 
 	return 0;
@@ -2374,7 +2495,7 @@ static int verify_truncate_cow_test(void)
 	char *read_pattern = NULL;
 
 	unsigned long i;
-	unsigned long long offset, read_size, new_size, len, trunc_size;
+	unsigned long long offset, read_size, new_size, trunc_size;
 	char dest[PATH_MAX];
 
 	printf("Test %d: Verify cow for truncating.\n", testno++);
@@ -2412,7 +2533,7 @@ static int verify_truncate_cow_test(void)
 
 		ret = ftruncate(fd, new_size);
 		if (ret < 0) {
-			fprintf(stderr, "failed to truncate file %d to %llu\n",
+			fprintf(stderr, "failed to truncate file %s to %llu\n",
 				orig_path, new_size); 
 			close(fd);
 			goto bail;
diff --git a/programs/reflink_tests/reflink_test_utils.c b/programs/reflink_tests/reflink_test_utils.c
index 13ef58f..a55d6da 100755
--- a/programs/reflink_tests/reflink_test_utils.c
+++ b/programs/reflink_tests/reflink_test_utils.c
@@ -712,28 +712,29 @@ int prep_orig_file_in_chunks(char *file_name, unsigned long chunks)
 
 int verify_reflink_pair(const char *src, const char *dest)
 {
-	int fds, fdd, ret, o_ret;
-	char bufs[HUNK_SIZE], bufd[HUNK_SIZE];
+	int fds = -1, fdd = -1, ret = 0;
+	char *bufs = NULL, *bufd = NULL;
 	unsigned long reads, readd;
 
+	bufs = (char *)malloc(HUNK_SIZE);
+	bufd = (char *)malloc(HUNK_SIZE);
+
 	fds = open64(src, open_ro_flags);
 	if (fds < 0) {
-		o_ret = fds;
-		fds = errno;
-		fprintf(stderr, "open file %s failed:%d:%s\n", src, fds,
-			strerror(fds));
-		fds = o_ret;
-		return fds;
+		ret  = errno;
+		fprintf(stderr, "open file %s failed:%d:%s\n", src, ret,
+			strerror(ret));
+		ret = fds;
+		goto bail;
 	}
 
 	fdd = open64(dest, open_ro_flags);
 	if (fdd < 0) {
-		o_ret = fdd;
-		fdd = errno;
-		fprintf(stderr, "open file %s failed:%d:%s\n", src, fdd,
-			strerror(fdd));
-		fdd = o_ret;
-		return fdd;
+		ret = errno;
+		fprintf(stderr, "open file %s failed:%d:%s\n", src, ret,
+			strerror(ret));
+		ret = fdd;
+		goto bail;
 	}
 
 	while ((reads = read(fds, bufs, HUNK_SIZE)) &&
@@ -742,20 +743,31 @@ int verify_reflink_pair(const char *src, const char *dest)
 		if (reads != readd) {
 			fprintf(stderr, "data readed are not in the "
 				"same size\n");
-			return 1;
+			ret = 1;
+			goto bail;
 		}
 
 		ret = memcmp(bufs, bufd, reads);
 		if (ret) {
 			fprintf(stderr, "data readed are different\n");
-			return ret;
+			goto bail;
 		}
 	}
 
-	close(fds);
-	close(fdd);
+bail:
+	if (bufs)
+		free(bufs);
 
-	return 0;
+	if (bufd)
+		free(bufd);
+
+	if (fds > 0)
+		close(fds);
+
+	if (fdd > 0)
+		close(fdd);
+
+	return ret;
 }
 
 int verify_pattern(char *buf, unsigned long offset, unsigned long size)
@@ -781,19 +793,20 @@ int verify_orig_file(char *orig)
 	int ret = 0, fd, o_ret;
 	unsigned long readed, offset = 0;
 	unsigned long verify_size = 0;
-	char buf[HUNK_SIZE];
+	char *buf = NULL;
 
 	unsigned int mmap_size = page_size;
 	void *region;
 
+	buf = (char *)malloc(HUNK_SIZE);
+
 	fd = open64(orig, open_ro_flags);
 	if (fd < 0) {
-		o_ret = fd;
-		fd = errno;
-		fprintf(stderr, "open file %s failed:%d:%s\n", orig, fd,
-			strerror(fd));
-		fd = o_ret;
-		return fd;
+		ret = errno;
+		fprintf(stderr, "open file %s failed:%d:%s\n", orig, ret,
+			strerror(ret));
+		ret = fd;
+		goto bail;
 	}
 
 	if (file_size > PATTERN_SIZE)
@@ -816,13 +829,13 @@ int verify_orig_file(char *orig)
 			fprintf(stderr, "mmap (read) error %d: \"%s\"\n", ret,
 				strerror(ret));
 			ret = o_ret;
-			return ret;
+			goto bail;
 		}
 
 		ret = verify_pattern(region, 0, verify_size);
 		if (ret) {
 			fprintf(stderr, "Verify orig file by mmap failed\n");
-			return ret;
+			goto bail;
 		}
 
 		munmap(region, mmap_size);
@@ -834,7 +847,7 @@ int verify_orig_file(char *orig)
 		ret = verify_pattern(buf, offset, readed);
 		if (ret) {
 			fprintf(stderr, "Verify original file failed\n");
-			return ret;
+			goto bail;
 		}
 
 		offset += readed;
@@ -842,9 +855,14 @@ int verify_orig_file(char *orig)
 			break;
 	}
 
-	close(fd);
+bail:
+	if (buf)
+		free(buf);
 
-	return 0;
+	if (fd > 0)
+		close(fd);
+
+	return ret;
 }
 
 int do_reflinks(const char *src, const char *dest_prefix,
@@ -888,23 +906,24 @@ int do_reflinks(const char *src, const char *dest_prefix,
 int do_reflinks_at_random(const char *src, const char *dest_prefix,
 				 unsigned long iter)
 {
-	int ret, o_ret, fd, method;
+	int ret = 0, o_ret, fd, method;
 	unsigned long i = 0;
-	char dest[PATH_MAX], buf[2 * HUNK_SIZE], *ptr;
+	char dest[PATH_MAX], *buf = NULL, *ptr;
 
 	unsigned long write_size = 0, append_size = 0, truncate_size = 0;
 	unsigned long read_size = 0, offset = 0;
 	unsigned long tmp_file_size = file_size;
 
+	buf = (char *)malloc(HUNK_SIZE * 2);
+
 	fd = open64(src, open_rw_flags | O_APPEND);
 
 	if (fd < 0) {
-		o_ret = fd;
-		fd = errno;
+		ret = errno;
 		fprintf(stderr, "open file %s failed:%d:%s\n",
-			src, fd, strerror(fd));
-		fd = o_ret;
-		return fd;
+			src, ret, strerror(ret));
+		ret = fd;
+		goto bail;
 	}
 
 	if (test_flags & ODCT_TEST)
@@ -935,7 +954,7 @@ int do_reflinks_at_random(const char *src, const char *dest_prefix,
 			if (ret < 0) {
 				fprintf(stderr, "do_reflinks_at_random failed"
 					" at write_at\n");
-				return ret;
+				goto bail;
 			}
 		}
 
@@ -953,7 +972,7 @@ int do_reflinks_at_random(const char *src, const char *dest_prefix,
 					"at appending on file %s:%d:%s.\n",
 					src, ret, strerror(ret));
 				ret = o_ret;
-				return ret;
+				goto bail;
 			}
 
 			tmp_file_size += append_size;
@@ -973,7 +992,7 @@ int do_reflinks_at_random(const char *src, const char *dest_prefix,
 					"at truncating on file %s:%d:%s.\n",
 					src, ret, strerror(ret));
 				ret = o_ret;
-				return ret;
+				goto bail;
 			}
 
 			tmp_file_size = truncate_size;
@@ -1008,7 +1027,7 @@ int do_reflinks_at_random(const char *src, const char *dest_prefix,
 					"at reading on file %s:%d:%s.\n",
 					src, ret, strerror(ret));
 				ret = o_ret;
-				return ret;
+				goto bail;
 			}
 		}
 
@@ -1018,24 +1037,31 @@ int do_reflinks_at_random(const char *src, const char *dest_prefix,
 			fprintf(stderr, "do_reflinks_at_random failed at "
 				"reflink(%ld) after method(%d) operation.\n",
 				i, method);
-			return ret;
+			goto bail;
 		}
 
 		i++;
 	}
 
-	close(fd);
+bail:
+	if (buf)
+		free(buf);
 
-	return 0;
+	if (fd > 0)
+		close(fd);
+
+	return ret;
 }
 
 int do_reads_on_reflinks(char *ref_pfx, unsigned long iter,
 				unsigned long size, unsigned long interval)
 {
-	int ret, fd, o_ret;
+	int ret = 0, fd;
 	unsigned long i, read_size, offset = 0;
 	char ref_path[PATH_MAX];
-	char buf[HUNK_SIZE * 2], *ptr;
+	char *buf = NULL, *ptr;
+
+	buf = (char *)malloc(HUNK_SIZE * 2);
 
 	if (test_flags & ODCT_TEST)
 		ptr = buf_dio;
@@ -1049,12 +1075,11 @@ int do_reads_on_reflinks(char *ref_pfx, unsigned long iter,
 		snprintf(ref_path, PATH_MAX, "%sr%ld", ref_pfx, i);
 		fd = open64(ref_path, open_ro_flags);
 		if (fd < 0) {
-			o_ret = fd;
-			fd = errno;
+			ret = errno;
 			fprintf(stderr, "open file %s failed:%d:%s\n",
-				ref_path, fd, strerror(fd));
-			fd = o_ret;
-			return fd;
+				ref_path, ret, strerror(ret));
+			ret = fd;
+			goto bail;
 		}
 
 		offset = 0;
@@ -1084,7 +1109,10 @@ int do_reads_on_reflinks(char *ref_pfx, unsigned long iter,
 				ret = mmap_read_at(fd, ptr, read_size, offset);
 				if (ret) {
 					fprintf(stderr, "mmap_read_at fail\n");
-					return ret;
+					if (fd > 0)
+						close(fd);
+
+					goto bail;
 				}
 
 			} else {
@@ -1099,9 +1127,11 @@ int do_reads_on_reflinks(char *ref_pfx, unsigned long iter,
 
 				ret = read_at(fd, ptr, read_size, offset);
 				if (ret) {
-
 					fprintf(stderr, "read_at failed\n");
-					return ret;
+					if (fd > 0)
+						close(fd);
+
+					goto bail;
 				}
 			}
 
@@ -1115,16 +1145,22 @@ int do_reads_on_reflinks(char *ref_pfx, unsigned long iter,
 		close(fd);
 	}
 
-	return 0;
+bail:
+	if (buf)
+		free(buf);
+
+	return ret;
 }
 
 int do_cows_on_write(char *ref_pfx, unsigned long iter,
 			    unsigned long size, unsigned long interval)
 {
-	int ret, fd, o_ret;
+	int ret = 0, fd;
 	unsigned long i, write_size, offset = 0;
 	char ref_path[PATH_MAX];
-	char buf[HUNK_SIZE * 2], *ptr;
+	char *buf = NULL, *ptr;
+
+	buf = (char *)malloc(HUNK_SIZE * 2);
 
 	if (test_flags & ODCT_TEST)
 		ptr = buf_dio;
@@ -1141,12 +1177,11 @@ int do_cows_on_write(char *ref_pfx, unsigned long iter,
 		snprintf(ref_path, PATH_MAX, "%sr%ld", ref_pfx, i);
 		fd = open64(ref_path, open_rw_flags);
 		if (fd < 0) {
-			o_ret = fd;
-			fd = errno;
+			ret = errno;
 			fprintf(stderr, "open file %s failed:%d:%s\n",
-				ref_path, fd, strerror(fd));
-			fd = o_ret;
-			return fd;
+				ref_path, ret, strerror(ret));
+			ret = fd;
+			goto bail;
 		}
 
 		offset = 0;
@@ -1178,7 +1213,9 @@ int do_cows_on_write(char *ref_pfx, unsigned long iter,
 				if (ret) {
 
 					fprintf(stderr, "mmap_write_at fail\n");
-					return ret;
+					if (fd > 0)
+						close(fd);
+					goto bail;
 				}
 
 			} else {
@@ -1195,7 +1232,10 @@ int do_cows_on_write(char *ref_pfx, unsigned long iter,
 				if (ret) {
 
 					fprintf(stderr, "write_at failed\n");
-					return ret;
+					if (fd > 0)
+						close(fd);
+
+					goto bail;
 				}
 			}
 
@@ -1209,7 +1249,11 @@ int do_cows_on_write(char *ref_pfx, unsigned long iter,
 		close(fd);
 	}
 
-	return 0;
+bail:
+	if (buf)
+		free(buf);
+
+	return ret;
 }
 
 int do_cows_on_ftruncate(char *ref_pfx, unsigned long iter,
@@ -1255,10 +1299,12 @@ int do_cows_on_ftruncate(char *ref_pfx, unsigned long iter,
 
 int do_appends(char *ref_pfx, unsigned long iter)
 {
-	int ret, fd, o_ret;
+	int ret = 0, fd, o_ret;
 	unsigned long i, append_size;
 	char ref_path[PATH_MAX];
-	char buf[HUNK_SIZE], *ptr;
+	char *buf = NULL, *ptr;
+
+	buf = (char *)malloc(HUNK_SIZE);
 
 	if (test_flags & ODCT_TEST)
 		ptr = buf_dio;
@@ -1269,12 +1315,11 @@ int do_appends(char *ref_pfx, unsigned long iter)
 		snprintf(ref_path, PATH_MAX, "%sr%ld", ref_pfx, i);
 		fd = open64(ref_path, open_rw_flags | O_APPEND);
 		if (fd < 0) {
-			o_ret = fd;
-			fd = errno;
+			ret = errno;
 			fprintf(stderr, "create file %s failed:%d:%s\n",
-				ref_path, fd, strerror(fd));
-			fd = o_ret;
-			return fd;
+				ref_path, ret, strerror(ret));
+			ret = fd;
+			goto bail;
 		}
 
 		if (test_flags & RAND_TEST)
@@ -1293,13 +1338,19 @@ int do_appends(char *ref_pfx, unsigned long iter)
 			fprintf(stderr, "append file %s failed:%d:%s\n",
 				ref_path, ret, strerror(ret));
 			ret = o_ret;
-			return ret;
+			if (fd > 0)
+				close(fd);
+			goto bail;
 		}
 
 		close(fd);
 	}
 
-	return 0;
+bail:
+	if (buf)
+		free(buf);
+
+	return ret;
 }
 
 int do_unlink(char *path)
@@ -1892,15 +1943,13 @@ int semaphore_v(int sem_id)
 
 int open_file(const char *filename, int flags)
 {
-	int fd, ret, o_ret;
+	int fd, ret = 0;
 
 	fd = open64(filename, open_rw_flags, FILE_MODE);
 	if (fd < 0) {
-		o_ret = fd;
-		fd = errno;
-		fprintf(stderr, "open file %s failed:%d:%s\n", filename, fd,
-			strerror(fd));
-		fd = o_ret;
+		ret = errno;
+		fprintf(stderr, "open file %s failed:%d:%s\n", filename, ret,
+			strerror(ret));
 		return -1;
 	}
 
-- 
1.5.5




More information about the Ocfs2-test-devel mailing list