[PATCH] xfstests: Add query fiemap count test.

Tao Ma tao.ma at oracle.com
Wed Apr 28 01:50:50 CDT 2010


According to Documentation/filesystems/fiemap.txt, If fm_extent_count
is zero, then the fm_extents[] array is ignored (no extents will be
returned), and the fm_mapped_extents count will hold the number of
extents needed.

This is broken by commit 97db39a1f6f69e906e98118392400de5217aa33a.
So add this test case in fiemap tester to avoid future regression.

Cc: Dave Chinner <david at fromorbit.com>
Cc: Eric Sandeen <sandeen at redhat.com>
Cc: Christoph Hellwig <hch at lst.de>
Cc: Alex Elder <aelder at sgi.com>
Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
 src/fiemap-tester.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/src/fiemap-tester.c b/src/fiemap-tester.c
index 8be7ddf..9d57a7e 100644
--- a/src/fiemap-tester.c
+++ b/src/fiemap-tester.c
@@ -406,6 +406,20 @@ check_hole(struct fiemap *fiemap, int fd, __u64 logical_offset, int blocksize)
 	return 0;
 }
 
+static int query_fiemap_count(int fd, int blocks, int blocksize)
+{
+	struct fiemap fiemap = { 0, };
+
+	fiemap.fm_length = blocks * blocksize;
+
+	if (ioctl(fd, FS_IOC_FIEMAP, (unsigned long)&fiemap) < 0) {
+		perror("FIEMAP query ioctl failed");
+		return -1;
+	}
+
+	return 0;
+}
+
 static int
 compare_fiemap_and_map(int fd, char *map, int blocks, int blocksize)
 {
@@ -415,6 +429,9 @@ compare_fiemap_and_map(int fd, char *map, int blocks, int blocksize)
 	__u64 map_start, map_length;
 	int i, c;
 
+	if (query_fiemap_count(fd, blocks, blocksize) < 0)
+		return -1;
+
 	blocks_to_map = (random() % blocks) + 1;
 	fiebuf = malloc(sizeof(struct fiemap) +
 			(blocks_to_map * sizeof(struct fiemap_extent)));
-- 
1.6.3.3.334.g916e1.dirty




More information about the xfs mailing list