This is the patch of testcases for the ext4 new features test. It contains multi-block alloc/delayed alloc test, inode version test, journal checksumming test, nanosec timestamps test, online defrag test, persist prealloc test, subdirectory limit test and uninit groups test of ext4. In this test suite, there is two FAIL in the subdirectory limit test. It is because we cann't create more than 32000 subdirectory when block size is small, such as 1024, and the name of every subdirectory is very long, such as every name is 255 bytes. I think it is the bug of the ext4.
Note: Your MUST run configure in the directory testcases/kernel/fs/ext4-new-features to config the tool of ffsb, and specify a partition to be used for test before compiling the tool. The data on the specified partition would be DESTROYED.
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>,
Minor-Segmentation-fault-in-ffsb-fixed-by: Subrata Modak <subrata@linux.vnet.ibm.com>,
diff --git a/README b/README
index cec6e36..e98827c 100644
--- a/README
+++ b/README
@@ -405,3 +405,21 @@
 1) Add as many framework as they get added/modifed in the kernel
 ---------------------------------
 
+---------------------------------
+Enabling Kernel Configuration to test ext4 new features
+---------------------------------
+CONFIG_EXT4_FS=y
+CONFIG_EXT4DEV_COMPAT=y
+CONFIG_EXT4_FS_XATTR=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+
+Beside that, the following packages are necessary.
+  e2fsprogs
+  e2fsprogs-devel
+  e2fsprogs-libs
+And the version of packages must be 1.41.4 or above.
+
+For more information to build/install/run these tests, look through:
+ltp/testcases/kernel/fs/ext4-new-features/README
+---------------------------------
diff --git a/runtest/fs_ext4 b/runtest/fs_ext4
new file mode 100644
index 0000000..c65ebab
--- /dev/null
+++ b/runtest/fs_ext4
@@ -0,0 +1 @@
+ext4_new_feature_test	run_ext4_test.sh
diff --git a/testcases/kernel/fs/Makefile b/testcases/kernel/fs/Makefile
index 12e2f48..afad6f9 100644
--- a/testcases/kernel/fs/Makefile
+++ b/testcases/kernel/fs/Makefile
@@ -25,6 +25,8 @@
 include $(top_srcdir)/include/mk/env_pre.mk
 
 # XXX (garrcoop): Need to add autoconf checks for JFS.
-FILTER_OUT_DIRS		:= dmapi
+# ext4-new-features: This test need to be configured be user.
+# Please read $LTPROOT/README to see the detail information
+FILTER_OUT_DIRS		:= dmapi ext4-new-features
 
 include $(top_srcdir)/include/mk/generic_trunk_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/Makefile b/testcases/kernel/fs/ext4-new-features/Makefile
new file mode 100644
index 0000000..0e09dd6
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/Makefile
@@ -0,0 +1,38 @@
+#
+#    kernel/fs/ext4-new-features testcases Makefile.
+#
+#    Copyright (C) 2009, Cisco Systems Inc.
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../..
+
+include $(top_srcdir)/include/mk/env_pre.mk
+
+INSTALL_TARGETS		:= *.sh
+INSTALL_TARGETS		:= ext4-test-config
+INSTALL_TARGETS		:= ffsb-6.0-rc2/ffsb
+
+FILTER_OUT_DIRS		:= ffsb-6.0-rc2
+
+trunk-all: ffsb-6.0-rc2
+
+trunk-clean:: | ffsb-clean
+
+ffsb-clean:: ffsb-6.0-rc2
+	$(MAKE) -C $^ -f "$(abs_srcdir)/$^/Makefile" clean
+
+include $(top_srcdir)/include/mk/generic_trunk_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/README b/testcases/kernel/fs/ext4-new-features/README
new file mode 100644
index 0000000..0ea0460
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/README
@@ -0,0 +1,147 @@
+TEST SUITE:
+
+The directory ext4-new-features contains the tests related to the ext4
+filesystem's new features.
+
+Ext4 is an advanced level of the ext3 filesystem which incorporates scalability
+and reliability enhancements for supporting large filesystems(64 bit) in keeping
+with increasing disk capacities and state-of-the-art feature requirements. More
+extensive information of ext4 can be found at the ext4 wiki site at the URL:
+http://ext4.wiki.kernel.org
+
+There are total 119 testcases for ext4 new features test that have been added.
+Now, these testcases can test multi-block alloc/delayed alloc, inode version
+field on disk, journal checksumming, nanosec timestamps, online defrag, persist
+prealloc, subdirectory limit and uninit groups of ext4.
+The detail information of ext4 new features can be found at the URL:
+http://ext4.wiki.kernel.org/index.php/New_ext4_features
+
+
+TESTS AIM:
+
+The aim of the tests is to test ext4 new features.
+
+
+TEST STEPS:
+# cd LTPROOT/testcases/kernel/fs/ext4-new-features
+# ./configure
+# make
+# make install
+# cd LTPROOT
+# ./runltp -f fs_ext4
+
+**This testsuite wouldn't be built when doing LTP default build. We MUST do it
+  by ourself.
+
+
+NOTE:
+
+1. This test can be run by root only.
+2. Your MUST run *configure* in this directory to config the tool of ffsb and
+   specify a partition to be used for test before compiling the tool, and be
+   CAREFUL the data on the specified partition would be DESTROYED. It is better
+   that the size of partition is between 5G and 10G. If the partition is too
+   big, the test will spend much time. It is unnecessary.
+3. Before starting test ext4 new features, please check whether ext4 filesystem
+   is compiled into the kernel or not, and the kernel version is *2.6.31* or
+   above.
+4. A snapshot of config file options is given below:
+   ONFIG_EXT4_FS=y
+   CONFIG_EXT4DEV_COMPAT=y
+   CONFIG_EXT4_FS_XATTR=y
+   CONFIG_EXT4_FS_POSIX_ACL=y
+   CONFIG_EXT4_FS_SECURITY=y
+
+5. Beside that, the following packages are necessary:
+   e2fsprogs
+     (http://www.rpmfind.net/linux/rpm2html/search.php?query=e2fsprogs)
+   e2fsprogs-devel
+     (http://www.rpmfind.net/linux/rpm2html/search.php?query=e2fsprogs-devel)
+   e2fsprogs-libs
+     (http://www.rpmfind.net/linux/rpm2html/search.php?query=e2fsprogs-libs)
+   and the version of these packages should be 1.41.4 or above, otherwise the
+   test will fail.
+
+
+FILES DESCRIPTION:
+
+configure
+---------
+This is a config script that is used to configure the ffsb tool and specify a
+partition for test. And the data on the specified partition would be destroyed.
+Be careful! Beside that, you MUST run this script before compile the testcases.
+
+ext4-delalloc-mballoc
+---------------------
+Directory containing the shell script which is used to test multi-block
+allocation and delayed allocation of ext4.
+
+ext4-ffsb-config
+----------------
+Directory containing the config of ffsb for test.
+
+ext4-inode-version
+------------------
+Directory containing the shell script which is used to test inode version field
+on disk of ext4.
+
+ext4-journal-checksum
+---------------------
+Directory containing the shell script which is used to test journal checksumming
+of ext4.
+
+ext4-nsec-timestamps
+--------------------
+Directory containing the shell script which is used to test nanosec timestamps
+of ext4.
+
+ext4-online-defrag
+------------------
+Directory containing the shell script which is used to test online defrag
+feature of ext4.
+
+ext4-persist-prealloc
+---------------------
+Directory containing the shell script which is used to test persist prealloc
+feature of ext4.
+
+ext4-subdir-limit
+-----------------
+Directory containing the shell script which is used to test subdirectory limit
+of ext4. According to the kernel documentation, we create more than 32000
+subdirectorys on the ext4 filesystem.
+
+But, when then block size is small, such as 1024, and the name of every
+subdirectory is very long, such as every name is 255 bytes, we can just create
+less than 20000 subdirectory. In this test suite, there is two FAIL cases by
+reason of it.
+
+ext4-uninit-groups
+------------------
+Directory containing the shell script which is used to test uninitialized groups
+feature of ext4.
+
+ffsb-6.0-rc2
+------------
+This directory contains The Flexible Filesystem Benchmark (FFSB) tool. We use
+this tool to create some files to fill the test partition. This tool was written
+by Sonny Rao(raosanth@us.ibm.com).
+
+ext4_funcs.sh
+-------------
+This script contains some functions for ext4 new features test script.
+such as: ext4_setup, ext4_cleanup
+
+run_ext4_test.sh
+----------------
+This script runs all the 119 testcases.
+
+Makefile
+--------
+Each directory in this directory has its usual makefile, it is for its
+directory.
+
+README
+------
+The one you have gone through.
+
diff --git a/testcases/kernel/fs/ext4-new-features/configure b/testcases/kernel/fs/ext4-new-features/configure
new file mode 100755
index 0000000..13f43f9
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/configure
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+echo "Run the ffsb's configure"
+cd ./ffsb-6.0-rc2
+./configure
+cd ..
+
+EXT4_DEV=
+RESULT=
+
+echo "Ext4 new features test configure"
+echo "Please specify a partition to create ext4 filesystem:"
+read EXT4_DEV
+
+echo "The partition is: $EXT4_DEV, Are you sure(Y/N)?"
+read RESULT
+if [ "$RESULT" == "Y" ] || [ "$RESULT" == "y" ]; then
+	echo "EXT4_DEV=$EXT4_DEV" > ./ext4-test-config
+elif [ "$RESULT" == "N" ]; then
+	echo "Give up specifing a partition!"
+else
+	echo "Your input is wrong($RESULT)."
+fi
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/Makefile
new file mode 100644
index 0000000..1980349
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, Fujitsu LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+MAKE_TARGETS		:=
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/ext4-alloc-test.sh b/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/ext4-alloc-test.sh
new file mode 100755
index 0000000..ec2f389
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-delalloc-mballoc/ext4-alloc-test.sh
@@ -0,0 +1,167 @@
+#!/bin/bash
+
+################################################################################
+#                                                                              #
+# Copyright (c) 2009 FUJITSU LIMITED                                           #
+#                                                                              #
+# This program is free software;  you can redistribute it and#or modify        #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation; either version 2 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful, but          #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   #
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     #
+# for more details.                                                            #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program;  if not, write to the Free Software                 #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA      #
+#                                                                              #
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-delalloc-mballoc"
+export TST_TOTAL=17
+export TST_COUNT=1
+
+# $1: the test config
+
+export TEST_DIR=$PWD
+
+read_config $1
+
+# Case 17: mount ext4 partition to ext3
+ext4_test_remount()
+{
+	mkfs.ext3 -I 256 -b 1024 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs $EXT4_DEV
+
+	mount -t ext4 -o delalloc,auto_da_alloc $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	./ffsb ffsb-config0 > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "ffsb returned failure"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return
+	fi
+
+	mount -t ext3 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount to ext3"
+		return 1
+	fi
+	umount mnt_point
+
+	fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "remount test pass"
+}
+
+# Case 1-16: Use ffsb to test mballoc and delalloc
+# $1: delalloc or nodelalloc
+# $2: 0 - indirect-io, 1 - direct-io
+# $3: block size
+# $4: auto_da_alloc
+ext4_test_delalloc_mballoc()
+{
+	tst_resm TINFO "isDelalloc: $1, isDirectIO: $2, Blocksize: $3, \
+		isAuto_da_alloc: $4"
+
+	mkfs.ext4 -I 256 -b $3 /$EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs -O extents $EXT4_DEV
+
+	mount -t ext4 -o $1,$4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	./ffsb ffsb-config$2 > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "ffsb returned failure"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "delalloc/mballoc test pass"
+}
+
+# main
+ext4_setup
+
+DELALLOC=( "delalloc" "nodelalloc" )
+DIRECT_IO=( 0 1 )
+BLOCK_SIZE=( 1024 4096 )
+BLOCK_AUTO_DA_ALLOC=( "auto_da_alloc=1" "noauto_da_alloc" )
+
+RET=0
+
+for ((i = 0; i < 2; i++))
+{
+	for ((j = 0; j < 2; j++))
+	{
+		for ((k = 0; k < 2; k++))
+		{
+			for ((l = 0; l < 2; l++))
+			{
+				ext4_test_delalloc_mballoc ${DELALLOC[$k]} \
+						${DIRECT_IO[$j]} \
+						${BLOCK_SIZE[$i]} \
+						${BLOCK_AUTO_DA_ALLOC[$l]}
+				if [ $? -ne 0 ]; then
+					RET=1
+				fi
+				: $((TST_COUNT++))
+			}
+		}
+	}
+}
+
+ext4_test_remount
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+
+ext4_cleanup
+
+exit $RET
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/Makefile
new file mode 100644
index 0000000..19dca28
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, FUJITSU LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+MAKE_TARGETS		:=
+INSTALL_TARGETS		?= ffsb-config[0-7]
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config0 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config0
new file mode 100644
index 0000000..caf1928
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config0
@@ -0,0 +1,23 @@
+directio=0
+time=500
+
+[filesystem0]
+location=mnt_point
+num_files=100000
+num_dirs=40
+max_filesize=40960
+min_filesize=4096
+[end0]
+
+
+[threadgroup0]
+num_threads=10
+read_weight=3
+write_weight=1
+append_weight=1
+write_random=1
+write_size=4096
+write_blocksize=4096
+read_size=4096
+read_blocksize=4096
+[end0]
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config1 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config1
new file mode 100644
index 0000000..9fe820d
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config1
@@ -0,0 +1,23 @@
+directio=1
+time=400
+
+[filesystem0]
+location=mnt_point
+num_files=100000
+num_dirs=40
+max_filesize=4096
+min_filesize=4096
+[end0]
+
+
+[threadgroup0]
+num_threads=10
+read_weight=3
+write_weight=1
+append_weight=1
+write_random=1
+write_size=4096
+write_blocksize=4096
+read_size=4096
+read_blocksize=4096
+[end0]
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config2 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config2
new file mode 100644
index 0000000..993fe14
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config2
@@ -0,0 +1,23 @@
+directio=0
+time=500
+
+[filesystem0]
+location=mnt_point
+num_files=100000
+num_dirs=40
+max_filesize=20480
+min_filesize=4096
+[end0]
+
+
+[threadgroup0]
+num_threads=10
+read_weight=3
+write_weight=1
+append_weight=1
+write_random=1
+write_size=4096
+write_blocksize=4096
+read_size=4096
+read_blocksize=4096
+[end0]
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config3 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config3
new file mode 100644
index 0000000..d95149d
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config3
@@ -0,0 +1,29 @@
+directio=0
+time=0
+
+[filesystem0]
+	location=mnt_point/
+	num_files=1
+	num_dirs=1
+	max_filesize=409600
+	min_filesize=40960
+	agefs=1
+	[threadgroup0]
+		num_threads=10
+		write_size=409600
+		write_blocksize=40960
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=0.20
+[end0]
+
+[threadgroup0]
+	num_threads=32
+	read_weight=1
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config4 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config4
new file mode 100644
index 0000000..f1a432e
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config4
@@ -0,0 +1,29 @@
+directio=0
+time=0
+
+[filesystem0]
+	location=mnt_point/
+	num_files=1
+	num_dirs=1
+	max_filesize=409600
+	min_filesize=40960
+	agefs=1
+	[threadgroup0]
+		num_threads=10
+		write_size=409600
+		write_blocksize=40960
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=0.40
+[end0]
+
+[threadgroup0]
+	num_threads=32
+	read_weight=1
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config5 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config5
new file mode 100644
index 0000000..758eded
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config5
@@ -0,0 +1,29 @@
+directio=0
+time=0
+
+[filesystem0]
+	location=mnt_point/
+	num_files=1
+	num_dirs=1
+	max_filesize=409600
+	min_filesize=40960
+	agefs=1
+	[threadgroup0]
+		num_threads=10
+		write_size=409600
+		write_blocksize=40960
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=0.60
+[end0]
+
+[threadgroup0]
+	num_threads=32
+	read_weight=1
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config6 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config6
new file mode 100644
index 0000000..6592177
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config6
@@ -0,0 +1,29 @@
+directio=0
+time=0
+
+[filesystem0]
+	location=mnt_point/
+	num_files=1
+	num_dirs=1
+	max_filesize=409600
+	min_filesize=40960
+	agefs=1
+	[threadgroup0]
+		num_threads=10
+		write_size=409600
+		write_blocksize=40960
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=0.80
+[end0]
+
+[threadgroup0]
+	num_threads=32
+	read_weight=1
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config7 b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config7
new file mode 100644
index 0000000..0f6df51
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-ffsb-config/ffsb-config7
@@ -0,0 +1,29 @@
+directio=0
+time=0
+
+[filesystem0]
+	location=mnt_point/
+	num_files=1
+	num_dirs=1
+	max_filesize=409600
+	min_filesize=40960
+	agefs=1
+	[threadgroup0]
+		num_threads=10
+		write_size=409600
+		write_blocksize=40960
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=1.00
+[end0]
+
+[threadgroup0]
+	num_threads=32
+	read_weight=1
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-inode-version/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/Makefile
new file mode 100644
index 0000000..6b8aabb
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, FUJITSU LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+LDLIBS += -lm
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_get_inode_version.sh b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_get_inode_version.sh
new file mode 100755
index 0000000..8f5c907
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_get_inode_version.sh
@@ -0,0 +1,41 @@
+#! /bin/bash
+
+################################################################################
+#                                                                              #
+# Copyright (c) 2009 FUJITSU LIMITED                                           #
+#                                                                              #
+# This program is free software;  you can redistribute it and#or modify        #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation; either version 2 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful, but          #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   #
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     #
+# for more details.                                                            #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program;  if not, write to the Free Software                 #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA      #
+#                                                                              #
+################################################################################
+
+#$1: inode version of which file
+#$2: 1  - return inode version by return value
+#    !1 - writting inode version to stddev
+
+inode_version=`debugfs -R "stat $1" $EXT4_DEV | grep 'Version' | awk '{
+print $NF }'`
+
+# The inode_version's format: '0x0000000a' or '0x00000000:0000000a',
+# so delete ':'
+inode_version=`echo $inode_version | sed 's/://'`
+
+inode_version=$(( $inode_version ))
+
+if [ "$2" == "1" ]; then
+	exit $inode_version
+else
+	echo $inode_version
+fi
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_inode_version_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_inode_version_test.sh
new file mode 100755
index 0000000..f27248b
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_inode_version_test.sh
@@ -0,0 +1,205 @@
+#!/bin/bash
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-inode-version"
+export TST_TOTAL=8
+export TST_COUNT=1
+
+export TEST_DIR=$PWD
+
+# $1: the test config
+read_config $1
+
+# Test that inode version is not 32 bits with 128 inode size
+ext4_test_128_inode_version()
+{
+	tst_resm TINFO "Test inode version is 32 bits with 128 inode size"
+
+	mkfs.ext4 -I 128 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs -O extents $EXT4_DEV
+
+	mount -t ext4 -o i_version $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	# inode version > 0
+	touch mnt_point/tmp_file
+	sync
+	version=`./ext4_get_inode_version.sh tmp_file`
+
+	if [ $version -lt 1 ]; then
+		tst_resm TFAIL "inode version is smaller than 1"
+		umount mnt_point
+		return 1
+	fi
+
+	# inode version is 32 bits: 0x00000000
+	version=`debugfs $EXT4_DEV -R "stat tmp_file" | grep 'Version'`
+	version=`echo $version | awk '{ print $NF }'`
+	version=`echo $version | sed 's/^0x//'`
+	len=${#version}
+
+	if [ $len -ne 8 ]; then
+		tst_resm TFAIL "inode version is not 32 bits"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	tst_resm TPASS "32 bits inode version with 128 inode size test pass"
+}
+
+# Test file timestamps is nanosecond with 256 inode size
+# $1: file operation
+test_inode_version()
+{
+	mkfs.ext3 -I 256 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs $EXT4_DEV > /dev/null
+
+	mount -t ext4 -o i_version $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	# Check the inode version after some file operation
+	old_version=`./ext4_test_inode_version $1 mnt_point/tmp_file tmp_file`
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "inode version is wrong"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	# Test mount to ext3 and then mount back to ext4
+	mount -t ext3 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount to ext3"
+		return 1
+	fi
+	umount mnt_point
+
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount back to ext4"
+		return 1
+	fi
+
+	version=`./ext4_get_inode_version.sh tmp_file`
+#	echo "remount: old - $old_version"
+#	echo "remount: new - $version"
+	if [ $old_version -ne $version ]; then
+		tst_resm TFAIL "inode version has changed unexpected"
+		umount mnt_point
+		return 1
+	else
+		tst_resm TPASS "inode version with 256 inode size test pass"
+		umount mnt_point
+	fi
+}
+
+# main
+ext4_setup
+
+RET=0
+
+ext4_test_128_inode_version
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version create
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version chmod
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version chown
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version read
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version write
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version mmap_read
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+test_inode_version mmap_write
+if [ $? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+ext4_cleanup
+
+exit $RET
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_test_inode_version.c b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_test_inode_version.c
new file mode 100644
index 0000000..e9f3840
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-inode-version/ext4_test_inode_version.c
@@ -0,0 +1,219 @@
+/******************************************************************************/
+/*                                                                            */
+/* Copyright (c) 2009 FUJITSU LIMITED                                         */
+/*                                                                            */
+/* This program is free software;  you can redistribute it and/or modify      */
+/* it under the terms of the GNU General Public License as published by       */
+/* the Free Software Foundation; either version 2 of the License, or          */
+/* (at your option) any later version.                                        */
+/*                                                                            */
+/* This program is distributed in the hope that it will be useful,            */
+/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
+/* the GNU General Public License for more details.                           */
+/*                                                                            */
+/* You should have received a copy of the GNU General Public License          */
+/* along with this program;  if not, write to the Free Software               */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
+/*                                                                            */
+/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
+/*                                                                            */
+/******************************************************************************/
+
+#include <unistd.h>
+#include <wait.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+
+char *filename;
+char *filepath;
+int fd;
+
+int old_inode_version;
+int new_inode_version;
+
+int get_inode_version(void)
+{
+	char buf[1024];
+
+	sprintf(buf, "./ext4_get_inode_version.sh %s 1", filename);
+
+	/* sync before run debugfs to get inode version */
+	sync();
+
+	return WEXITSTATUS(system(buf));
+}
+
+void test_chmod(void)
+{
+	if (fchmod(fd, S_IRUSR | S_IWUSR)) {
+		fprintf(stderr, "fchmod failed\n");
+		exit(1);
+	}
+}
+
+void test_chown(void)
+{
+	if (fchown(fd, 1, 1)) {
+		fprintf(stderr, "fchown failed\n");
+		exit(1);
+	}
+}
+
+void test_read(void)
+{
+	char buf[2];
+
+	/* write something before read */
+	if (write(fd, "abc", 4) == -1) {
+		perror("write");
+		exit(1);
+	}
+	close(fd);
+
+	if (open(filepath, O_RDONLY) == -1) {
+		perror("open");
+		exit(1);
+	}
+
+	old_inode_version = get_inode_version();
+
+	if (read(fd, buf, 1) == -1) {
+		perror("read");
+		exit(1);
+	}
+}
+
+void test_write(void)
+{
+	if (write(fd, "a", 1) == -1) {
+		fprintf(stderr, "write failed\n");
+		exit(1);
+	}
+}
+
+void test_mmap_read(void)
+{
+	char *p;
+	char c;
+
+	/* write something before read */
+	if (write(fd, "abc", 4) == -1) {
+		perror("write");
+		exit(1);
+	}
+	close(fd);
+
+	if (open(filepath, O_RDONLY) == -1) {
+		perror("open");
+		exit(1);
+	}
+
+	old_inode_version = get_inode_version();
+
+	p = mmap(NULL, 1, PROT_READ, MAP_PRIVATE | MAP_FILE, fd, 0);
+	if (p == (void *)-1) {
+		perror("mmap");
+		exit(1);
+	}
+	c = *p;
+
+	new_inode_version = get_inode_version();
+
+	msync(p, 1, MS_SYNC);
+}
+
+void test_mmap_write(void)
+{
+	char *p;
+
+	if (write(fd, "abc", 4) == -1) {
+		perror("write");
+		exit(1);
+	}
+	close(fd);
+
+	if (open(filepath, O_RDWR) == -1) {
+		perror("open");
+		exit(1);
+	}
+
+	old_inode_version = get_inode_version();
+
+	p = mmap(NULL, 1, PROT_WRITE,
+		 MAP_PRIVATE | MAP_FILE, fd, 0);
+	if (p == (void *)-1) {
+		perror("mmap");
+		exit(1);
+	}
+	*p = 'x';
+
+	new_inode_version = get_inode_version();
+
+	msync(p, 1, MS_SYNC);
+}
+
+/**
+ * argv[1]: file operation
+ * argv[2]: file to test (with path)
+ * argv[3]: file to test (without path)
+ */
+int main(int argc, char *argv[])
+{
+	if (argc != 4) {
+		fprintf(stderr, "wrong argument number\n");
+		return 1;
+	}
+	filepath = argv[2];
+	filename = argv[3];
+
+	/* create file and get the initial inode version */
+	fd = creat(argv[2], O_RDWR);
+	if (fd == -1) {
+		fprintf(stderr, "failed to create file: %s\n", argv[2]);
+		return 1;
+	}
+
+	old_inode_version = get_inode_version();
+
+	if (strcmp(argv[1], "create") == 0) {
+		printf("%d\n", old_inode_version);
+		return 0;
+	} else if (strcmp(argv[1], "chmod") == 0) {
+		test_chmod();
+	} else if (strcmp(argv[1], "chown") == 0) {
+		test_chown();
+	} else if (strcmp(argv[1], "read") == 0) {
+		test_read();
+	} else if (strcmp(argv[1], "write") == 0) {
+		test_write();
+	} else if (strcmp(argv[1], "mmap_read") == 0) {
+		test_mmap_read();
+	} else if (strcmp(argv[1], "mmap_write") == 0) {
+		test_mmap_write();
+	} else {
+		fprintf(stderr, "wrong file operation: %s\n", argv[1]);
+		return 1;
+	}
+
+	new_inode_version = get_inode_version();
+#if 0
+	fprintf(stderr, "test_inode_version: old - %d\n", old_inode_version);
+	fprintf(stderr, "test_inode_version: new - %d\n", new_inode_version);
+#endif
+	/* wrong inode version, test failed */
+	if (new_inode_version <= old_inode_version)
+		return 1;
+
+	printf("%d\n", new_inode_version);
+
+	close(fd);
+
+	return 0;
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/Makefile
new file mode 100644
index 0000000..1980349
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, Fujitsu LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+MAKE_TARGETS		:=
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/ext4_journal_checksum.sh b/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/ext4_journal_checksum.sh
new file mode 100755
index 0000000..550afa1
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-journal-checksum/ext4_journal_checksum.sh
@@ -0,0 +1,148 @@
+#!/bin/bash
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-journal-checksum"
+export TST_TOTAL=36
+export TST_COUNT=1
+
+# $1: the test config
+
+export TEST_DIR=$PWD
+
+read_config $1
+
+# Use ffsb to test journal checksumming
+# $1: journal mode: writeback, ordered, journal
+# $2: commit interval: 1 sec, 100 sec
+# $3: journal_checksum or not
+# $4: journal_async_commit or not
+# $5: barrier: 0, 1
+ext4_test_journal_checksum()
+{
+	local checksum=
+	local async_commit=
+
+	if [ "$3" == "" ]; then
+		checksum="No use"
+	else
+		checksum="Used"
+	fi
+	if [ "$4" == "" ]; then
+		async_commit="No use"
+	else
+		async_commit="Used"
+	fi
+
+	tst_resm TINFO "journal mode: $1, commit interval: $2, \
+		journal_checksum: $checksum, \
+		journal_async_commit: $async_commit, barrier: $5"
+
+	mkfs.ext4 -I 256 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs -O extents $EXT4_DEV
+
+	mount -t ext4 -o data=$1,commit=$2,$3,$4,barrier=$5 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	./ffsb ffsb-config2 > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "ffsb returned failure"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	e2fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "ext4 journal checksum test pass"
+}
+
+# main
+ext4_setup
+
+DATA=( "writeback" "ordered" "journal" )
+COMMIT=( 1 100 )
+JOURNAL_CHECKSUM=( "journal_checksum" "" )
+JOURNAL_ASYNC_COMMIT=( "journal_async_commit" "" )
+BARRIER=( 0 1 )
+
+RET=0
+
+for ((i = 0; i < 2; i++))
+{
+	for ((j = 0; j < 2; j++))
+	{
+		for ((k = 0; k < 2; k++))
+		{
+			for ((l = 0; l < 2; l++))
+			{
+				for ((m = 0; m < 3; m++))
+				{
+
+					# when journal_async_commit is used,
+					# journal_checksum is set automatically
+					if [ $j -eq 0 -a $k -eq 1 ]; then
+						continue
+					fi
+
+					ext4_test_journal_checksum ${DATA[$m]} \
+						${COMMIT[$l]} \
+						"${JOURNAL_CHECKSUM[$k]}" \
+						"${JOURNAL_ASYNC_COMMIT[$j]}" \
+						${BARRIER[$i]}
+					if [ $? -ne 0 ]; then
+						RET=1
+					fi
+
+					: $((TST_COUNT++))
+				}
+			}
+		}
+	}
+}
+
+ext4_cleanup
+
+exit $RET
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/Makefile
new file mode 100644
index 0000000..6b8aabb
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, FUJITSU LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+LDLIBS += -lm
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_file_time.c b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_file_time.c
new file mode 100644
index 0000000..faa9383
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_file_time.c
@@ -0,0 +1,70 @@
+/******************************************************************************/
+/*                                                                            */
+/* Copyright (c) 2009 FUJITSU LIMITED                                         */
+/*                                                                            */
+/* This program is free software;  you can redistribute it and/or modify      */
+/* it under the terms of the GNU General Public License as published by       */
+/* the Free Software Foundation; either version 2 of the License, or          */
+/* (at your option) any later version.                                        */
+/*                                                                            */
+/* This program is distributed in the hope that it will be useful,            */
+/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
+/* the GNU General Public License for more details.                           */
+/*                                                                            */
+/* You should have received a copy of the GNU General Public License          */
+/* along with this program;  if not, write to the Free Software               */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
+/*                                                                            */
+/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
+/*                                                                            */
+/******************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * Usage: file_time <filename> <atime|mtime|ctime> <sec|nsec>
+ */
+int main(int argc, char *argv[])
+{
+	time_t t;
+	struct stat st;
+
+	if (argc != 4) {
+		fprintf(stderr, "Wrong argument num!\n");
+		return 1;
+	}
+
+	if (stat(argv[1], &st) != 0) {
+		perror("stat failed");
+		return 1;
+	}
+
+	if (strcmp(argv[3], "sec") == 0) {
+		if (strcmp(argv[2], "atime") == 0)
+			t = st.st_atime;
+		else if (strcmp(argv[2], "mtime") == 0)
+			t = st.st_mtime;
+		else
+			t = st.st_ctime;
+	} else if (strcmp(argv[3], "nsec") == 0) {
+		if (strcmp(argv[2], "atime") == 0)
+			t = st.st_atim.tv_nsec;
+		else if (strcmp(argv[2], "mtime") == 0)
+			t = st.st_mtim.tv_nsec;
+		else
+			t = st.st_ctim.tv_nsec;
+	} else {
+		fprintf(stderr, "Wrong argument: %s\n", argv[3]);
+		return 1;
+	}
+
+	printf("%lu\n", t);
+
+	return 0;
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_nsec_timestamps_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_nsec_timestamps_test.sh
new file mode 100755
index 0000000..ad7729e
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-nsec-timestamps/ext4_nsec_timestamps_test.sh
@@ -0,0 +1,196 @@
+#!/bin/bash
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-nsec-timestamps"
+export TST_TOTAL=2
+export TST_COUNT=1
+
+# $1: the test config
+read_config $1
+
+TEST_DIR=$PWD
+
+# Test that file timestamps is second with 128 inode size
+ext4_test_sec_timestamps()
+{
+	tst_resm TINFO "Test timestamps with 128 inode size"
+
+	mkfs.ext4 -I 128 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs -O extents $EXT4_DEV
+
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	touch mnt_point/tmp_file
+
+	atime=`./ext4_file_time mnt_point/tmp_file atime nsec`
+	mtime=`./ext4_file_time mnt_point/tmp_file mtime nsec`
+	ctime=`./ext4_file_time mnt_point/tmp_file ctime nsec`
+
+	if [ $atime -ne 0 -o $mtime -ne 0 -o $ctime -ne 0 ]; then
+		tst_resm TFAIL "Timestamp is not second(atime: $atime, mtime: \
+				$mtime, ctime: $ctime)"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	tst_resm TPASS "Ext4 nanosecond timestamps test with 128 inode size pass"
+}
+
+# Test file timestamps is nanosecond with 256 inode size
+ext4_test_nsec_timestamps()
+{
+	tst_resm TINFO "Test timestamps with 256 inode size"
+
+	mkfs.ext3 -I 256 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs $EXT4_DEV
+
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	# Create file
+	touch mnt_point/tmp_file
+	sleep 1
+
+	# Change atime, ctime and mtime of the file
+	touch mnt_point/tmp_file
+
+	cur_time=`date '+%s %N'`
+	sec=`echo $cur_time | awk {'print $1'}`
+	nsec=`echo $cur_time | awk {'print $2'}`
+
+	sec_atime=`./ext4_file_time mnt_point/tmp_file atime sec`
+	sec_mtime=`./ext4_file_time mnt_point/tmp_file mtime sec`
+	sec_ctime=`./ext4_file_time mnt_point/tmp_file ctime sec`
+	nsec_atime=`./ext4_file_time mnt_point/tmp_file atime nsec`
+	nsec_mtime=`./ext4_file_time mnt_point/tmp_file mtime nsec`
+	nsec_ctime=`./ext4_file_time mnt_point/tmp_file ctime nsec`
+
+	# Test nanosecond
+	if [ $nsec_atime -eq 0 -a $nsec_mtime -eq 0 -a $nsec_ctime -eq 0 ]
+	then
+		tst_resm TFAIL "The timestamp is not nanosecond(nsec_atime: $nsec_atime, nsec_mtime: $nsec_mtime, nsec_ctime: $nsec_ctime)"
+		umount mnt_point
+		return 1
+	fi
+
+	diff1=$(( $sec_atime - $sec ))
+	diff2=$(( $sec_mtime - $sec ))
+	diff3=$(( $sec_ctime - $sec ))
+
+	# Test difference between file time and current time
+	if [ $diff1 -gt 1 -o $diff2 -gt 1 -o $diff2 -gt 1 ]; then
+		tst_resm TFAIL "The timestamp is wrong, it must be earlier \
+			than the current time we got.(sec_atime: $sec_atime, \
+			sec_mtime: $sec_mtime, sec_ctime: $sec_ctime, \
+			cur_time[s]: $sec)"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	# Test mount to ext3 and then mount back to ext4
+	mount -t ext3 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount to ext3"
+		return 1
+	fi
+	umount mnt_point
+
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount back to ext4"
+		return 1
+	fi
+
+	nsec_atime2=`./ext4_file_time mnt_point/tmp_file atime nsec`
+	nsec_mtime2=`./ext4_file_time mnt_point/tmp_file mtime nsec`
+	nsec_ctime2=`./ext4_file_time mnt_point/tmp_file mtime nsec`
+
+	if [ $nsec_atime -ne $nsec_atime2 -o $nsec_ctime -ne $nsec_ctime2 -o \
+	     $nsec_mtime -ne $nsec_mtime2 ]; then
+		tst_resm TFAIL "File nanosecond timestamp has changed \
+			unexpected. Before[atime mtime ctime]: $nsec_atime \
+			$nsec_mtime $nsec_ctime, After[atime mtime ctime]: \
+			$nsec_atime2 $nsec_mtime2 $nsec_ctime2)"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	tst_resm TPASS "Ext4 nanosecond timestamps test with 256 inode size pass"
+}
+
+# main
+ext4_setup
+
+RET=0
+
+ext4_test_sec_timestamps
+if [$? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+ext4_test_nsec_timestamps
+if [$? -ne 0 ]; then
+	RET=1
+fi
+: $((TST_COUNT++))
+
+ext4_cleanup
+exit $RET
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/Makefile
new file mode 100644
index 0000000..6b8aabb
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, FUJITSU LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+LDLIBS += -lm
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/e4defrag.c b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/e4defrag.c
new file mode 100644
index 0000000..05d6893
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/e4defrag.c
@@ -0,0 +1,2171 @@
+/*
+ * e4defrag.c - ext4 filesystem defragmenter
+ *
+ * Copyright (C) 2009 NEC Software Tohoku, Ltd.
+ *
+ * Author: Akira Fujita	<a-fujita@rs.jp.nec.com>
+ *         Takashi Sato	<t-sato@yk.jp.nec.com>
+ */
+
+#ifndef _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE
+#endif
+
+#ifndef _LARGEFILE64_SOURCE
+#define _LARGEFILE64_SOURCE
+#endif
+
+#define _XOPEN_SOURCE	500
+#define _GNU_SOURCE
+#include <ctype.h>
+#include <dirent.h>
+#include <endian.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <ftw.h>
+#include <limits.h>
+#include <mntent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <ext2fs/ext2_types.h>
+#include <ext2fs/ext2fs.h>
+#include <linux/fs.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+#include <sys/syscall.h>
+#include <sys/vfs.h>
+
+/* Ioctl command */
+#define FS_IOC_FIEMAP		_IOWR('f', 11, struct fiemap)
+#define EXT4_IOC_MOVE_EXT	_IOWR('f', 15, struct move_extent)
+
+/* Macro functions */
+#define PRINT_ERR_MSG(msg)	fprintf(stderr, "%s\n", (msg))
+#define IN_FTW_PRINT_ERR_MSG(msg)	\
+	fprintf(stderr, "\t%s\t\t[ NG ]\n", (msg))
+#define PRINT_FILE_NAME(file)	fprintf(stderr, " \"%s\"\n", (file))
+#define PRINT_ERR_MSG_WITH_ERRNO(msg)	\
+	fprintf(stderr, "\t%s:%s\t[ NG ]\n", (msg), strerror(errno))
+#define STATISTIC_ERR_MSG(msg)	\
+	fprintf(stderr, "\t%s\n", (msg))
+#define STATISTIC_ERR_MSG_WITH_ERRNO(msg)	\
+	fprintf(stderr, "\t%s:%s\n", (msg), strerror(errno))
+#define min(x, y) (((x) > (y)) ? (y) : (x))
+#define SECTOR_TO_BLOCK(sectors, blocksize) \
+	((sectors) / ((blocksize) >> 9))
+#define CALC_SCORE(ratio) \
+	((ratio) > 10 ? (80 + 20 * (ratio) / 100) : (8 * (ratio)))
+/* Wrap up the free function */
+#define FREE(tmp)				\
+	do {					\
+		if ((tmp) != NULL)		\
+			free(tmp);		\
+	} while (0)				\
+/* Insert list2 after list1 */
+#define insert(list1, list2)			\
+	do {					\
+		list2->next = list1->next;	\
+		list1->next->prev = list2;	\
+		list2->prev = list1;		\
+		list1->next = list2;		\
+	} while (0)
+
+/* To delete unused warning */
+#ifdef __GNUC__
+#define EXT2FS_ATTR(x) __attribute__(x)
+#else
+#define EXT2FS_ATTR(x)
+#endif
+
+#ifndef __NR_fadvise64
+#define __NR_fadvise64		250
+#endif
+
+#ifndef __NR_sync_file_range
+#define __NR_sync_file_range	314
+#endif
+
+#ifndef __NR_fallocate
+#define __NR_fallocate		324
+#endif
+
+#ifndef POSIX_FADV_DONTNEED
+#if defined(__s390x__)
+#define POSIX_FADV_DONTNEED	6 /* Don't need these pages */
+#else
+#define POSIX_FADV_DONTNEED	4 /* Don't need these pages */
+#endif
+#endif
+
+#ifndef SYNC_FILE_RANGE_WAIT_BEFORE
+#define SYNC_FILE_RANGE_WAIT_BEFORE	1
+#endif
+#ifndef SYNC_FILE_RANGE_WRITE
+#define SYNC_FILE_RANGE_WRITE		2
+#endif
+#ifndef SYNC_FILE_RANGE_WAIT_AFTER
+#define SYNC_FILE_RANGE_WAIT_AFTER	4
+#endif
+
+/* The mode of defrag */
+#define DETAIL			0x01
+#define STATISTIC		0x02
+
+#define DEVNAME			0
+#define DIRNAME			1
+#define FILENAME		2
+
+#define FTW_OPEN_FD		2000
+
+#define FS_EXT4			"ext4"
+#define ROOT_UID		0
+
+#define BOUND_SCORE		55
+#define SHOW_FRAG_FILES	5
+
+/* Magic number for ext4 */
+#define EXT4_SUPER_MAGIC	0xEF53
+
+/* Definition of flex_bg */
+#define EXT4_FEATURE_INCOMPAT_FLEX_BG		0x0200
+
+/* The following four macros are used for ioctl FS_IOC_FIEMAP
+ * FIEMAP_FLAG_SYNC:	sync file data before map.
+ * FIEMAP_EXTENT_LAST:	last extent in file.
+ * FIEMAP_MAX_OFFSET:	max file offset.
+ * EXTENT_MAX_COUNT:	the maximum number of extents for exchanging between
+ *			kernel-space and user-space per ioctl
+ */
+#define FIEMAP_FLAG_SYNC	0x00000001
+#define FIEMAP_EXTENT_LAST	0x00000001
+#define FIEMAP_EXTENT_UNWRITTEN	0x00000800
+#define FIEMAP_MAX_OFFSET	(~0ULL)
+#define EXTENT_MAX_COUNT	512
+
+/* The following macros are error message */
+#define MSG_USAGE		\
+"Usage	: e4defrag [-v] file...| directory...| device...\n\
+	: e4defrag  -c  file...| directory...| device...\n"
+
+#define NGMSG_EXT4		"Filesystem is not ext4 filesystem"
+#define NGMSG_FILE_EXTENT	"Failed to get file extents"
+#define NGMSG_FILE_INFO		"Failed to get file information"
+#define NGMSG_FILE_OPEN		"Failed to open"
+#define NGMSG_FILE_UNREG	"File is not regular file"
+#define NGMSG_LOST_FOUND	"Can not process \"lost+found\""
+
+/* Data type for filesystem-wide blocks number */
+typedef unsigned long long ext4_fsblk_t;
+
+struct fiemap_extent_data {
+	__u64 len;			/* blocks count */
+	__u64 logical;		/* start logical block number */
+	ext4_fsblk_t physical;		/* start physical block number */
+};
+
+struct fiemap_extent_list {
+	struct fiemap_extent_list *prev;
+	struct fiemap_extent_list *next;
+	struct fiemap_extent_data data;	/* extent belong to file */
+};
+
+struct fiemap_extent_group {
+	struct fiemap_extent_group *prev;
+	struct fiemap_extent_group *next;
+	__u64 len;	/* length of this continuous region */
+	struct fiemap_extent_list *start;	/* start ext */
+	struct fiemap_extent_list *end;		/* end ext */
+};
+
+struct move_extent {
+	__s32 reserved;	/* original file descriptor */
+	__u32 donor_fd;	/* donor file descriptor */
+	__u64 orig_start;	/* logical start offset in block for orig */
+	__u64 donor_start;	/* logical start offset in block for donor */
+	__u64 len;	/* block length to be moved */
+	__u64 moved_len;	/* moved block length */
+};
+
+struct fiemap_extent {
+	__u64 fe_logical;	/* logical offset in bytes for the start of
+				* the extent from the beginning of the file */
+	__u64 fe_physical;	/* physical offset in bytes for the start
+				* of the extent from the beginning
+				* of the disk */
+	__u64 fe_length;	/* length in bytes for this extent */
+	__u64 fe_reserved64[2];
+	__u32 fe_flags;    	/* FIEMAP_EXTENT_* flags for this extent */
+	__u32 fe_reserved[3];
+};
+
+struct fiemap {
+	__u64 fm_start;		/* logical offset (inclusive) at
+				* which to start mapping (in) */
+	__u64 fm_length;	/* logical length of mapping which
+				* userspace wants (in) */
+	__u32 fm_flags;		/* FIEMAP_FLAG_* flags for request (in/out) */
+	__u32 fm_mapped_extents;/* number of extents that were mapped (out) */
+	__u32 fm_extent_count;	/* size of fm_extents array (in) */
+	__u32 fm_reserved;
+	struct fiemap_extent fm_extents[0];/* array of mapped extents (out) */
+};
+
+struct frag_statistic_ino {
+	int now_count;	/* the file's extents count of before defrag */
+	int best_count; /* the best file's extents count */
+	float ratio;	/* the ratio of fragmentation */
+	char msg_buffer[PATH_MAX + 1];	/* pathname of the file */
+};
+
+typedef __u16 __le16;
+typedef __u32 __le32;
+typedef __u64 __le64;
+
+/*
+ * Structure of the super block
+ */
+struct ext4_super_block {
+/*00*/	__le32	s_inodes_count;		/* Inodes count */
+	__le32	s_blocks_count_lo;	/* Blocks count */
+	__le32	s_r_blocks_count_lo;	/* Reserved blocks count */
+	__le32	s_free_blocks_count_lo;	/* Free blocks count */
+/*10*/	__le32	s_free_inodes_count;	/* Free inodes count */
+	__le32	s_first_data_block;	/* First Data Block */
+	__le32	s_log_block_size;	/* Block size */
+	__le32	s_obso_log_frag_size;	/* Obsoleted fragment size */
+/*20*/	__le32	s_blocks_per_group;	/* # Blocks per group */
+	__le32	s_obso_frags_per_group;	/* Obsoleted fragments per group */
+	__le32	s_inodes_per_group;	/* # Inodes per group */
+	__le32	s_mtime;		/* Mount time */
+/*30*/	__le32	s_wtime;		/* Write time */
+	__le16	s_mnt_count;		/* Mount count */
+	__le16	s_max_mnt_count;	/* Maximal mount count */
+	__le16	s_magic;		/* Magic signature */
+	__le16	s_state;		/* File system state */
+	__le16	s_errors;		/* Behaviour when detecting errors */
+	__le16	s_minor_rev_level;	/* minor revision level */
+/*40*/	__le32	s_lastcheck;		/* time of last check */
+	__le32	s_checkinterval;	/* max. time between checks */
+	__le32	s_creator_os;		/* OS */
+	__le32	s_rev_level;		/* Revision level */
+/*50*/	__le16	s_def_resuid;		/* Default uid for reserved blocks */
+	__le16	s_def_resgid;		/* Default gid for reserved blocks */
+	/*
+	 * These fields are for EXT4_DYNAMIC_REV superblocks only.
+	 *
+	 * Note: the difference between the compatible feature set and
+	 * the incompatible feature set is that if there is a bit set
+	 * in the incompatible feature set that the kernel doesn't
+	 * know about, it should refuse to mount the filesystem.
+	 *
+	 * e2fsck's requirements are more strict; if it doesn't know
+	 * about a feature in either the compatible or incompatible
+	 * feature set, it must abort and not try to meddle with
+	 * things it doesn't understand...
+	 */
+	__le32	s_first_ino;		/* First non-reserved inode */
+	__le16  s_inode_size;		/* size of inode structure */
+	__le16	s_block_group_nr;	/* block group # of this superblock */
+	__le32	s_feature_compat;	/* compatible feature set */
+/*60*/	__le32	s_feature_incompat;	/* incompatible feature set */
+	__le32	s_feature_ro_compat;	/* readonly-compatible feature set */
+/*68*/	__u8	s_uuid[16];		/* 128-bit uuid for volume */
+/*78*/	char	s_volume_name[16];	/* volume name */
+/*88*/	char	s_last_mounted[64];	/* directory where last mounted */
+/*C8*/	__le32	s_algorithm_usage_bitmap; /* For compression */
+	/*
+	 * Performance hints.  Directory preallocation should only
+	 * happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.
+	 */
+	__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
+	__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
+	__le16	s_reserved_gdt_blocks;	/* Per group desc for online growth */
+	/*
+	 * Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.
+	 */
+/*D0*/	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
+/*E0*/	__le32	s_journal_inum;		/* inode number of journal file */
+	__le32	s_journal_dev;		/* device number of journal file */
+	__le32	s_last_orphan;		/* start of list of inodes to delete */
+	__le32	s_hash_seed[4];		/* HTREE hash seed */
+	__u8	s_def_hash_version;	/* Default hash version to use */
+	__u8	s_reserved_char_pad;
+	__le16  s_desc_size;		/* size of group descriptor */
+/*100*/	__le32	s_default_mount_opts;
+	__le32	s_first_meta_bg;	/* First metablock block group */
+	__le32	s_mkfs_time;		/* When the filesystem was created */
+	__le32	s_jnl_blocks[17];	/* Backup of the journal inode */
+	/* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
+/*150*/	__le32	s_blocks_count_hi;	/* Blocks count */
+	__le32	s_r_blocks_count_hi;	/* Reserved blocks count */
+	__le32	s_free_blocks_count_hi;	/* Free blocks count */
+	__le16	s_min_extra_isize;	/* All inodes have at least # bytes */
+	__le16	s_want_extra_isize; 	/* New inodes should reserve # bytes */
+	__le32	s_flags;		/* Miscellaneous flags */
+	__le16  s_raid_stride;		/* RAID stride */
+	__le16  s_mmp_interval;         /* # seconds to wait in MMP checking */
+	__le64  s_mmp_block;            /* Block for multi-mount protection */
+	__le32  s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
+	__u8	s_log_groups_per_flex;  /* FLEX_BG group size */
+	__u8	s_reserved_char_pad2;
+	__le16  s_reserved_pad;
+	__u32   s_reserved[162];        /* Padding to the end of the block */
+};
+
+char	lost_found_dir[PATH_MAX + 1];
+int	block_size;
+int	extents_before_defrag;
+int	extents_after_defrag;
+int	mode_flag;
+unsigned int	current_uid;
+unsigned int	defraged_file_count;
+unsigned int	frag_files_before_defrag;
+unsigned int	frag_files_after_defrag;
+unsigned int	regular_count;
+unsigned int	succeed_cnt;
+unsigned int	total_count;
+__u8 log_groups_per_flex;
+__le32 blocks_per_group;
+__le32 feature_incompat;
+ext4_fsblk_t	files_block_count;
+struct frag_statistic_ino	frag_rank[SHOW_FRAG_FILES];
+
+/*
+ * ext2fs_swab32() -	Change endian.
+ *
+ * @val:		the entry used for change.
+ */
+__u32 ext2fs_swab32(__u32 val)
+{
+#if BYTE_ORDER == BIG_ENDIAN
+	return (val >> 24) | ((val >> 8) & 0xFF00) |
+		((val << 8) & 0xFF0000) | (val << 24);
+#else
+	return val;
+#endif
+}
+
+/*
+ * fadvise() -		Give advice about file access.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @offset:		file offset.
+ * @len:		area length.
+ * @advise:		process flag.
+ */
+int fadvise(int fd, loff_t offset, size_t len, int advise)
+{
+	return syscall(__NR_fadvise64, fd, offset, len, advise);
+}
+
+/*
+ * sync_file_range() -	Sync file region.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @offset:		file offset.
+ * @length:		area length.
+ * @flag:		process flag.
+ */
+int sync_file_range(int fd, loff_t offset, loff_t length, unsigned int flag)
+{
+	return syscall(__NR_sync_file_range, fd, offset, length, flag);
+}
+
+/*
+ * fallocate() -	Manipulate file space.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @mode:		process flag.
+ * @offset:		file offset.
+ * @len:		file size.
+ */
+int fallocate(int fd, int mode, loff_t offset, loff_t len)
+{
+	return syscall(__NR_fallocate, fd, mode, offset, len);
+}
+
+/*
+ * get_mount_point() -	Get device's mount point.
+ *
+ * @devname:		the device's name.
+ * @mount_point:	the mount point.
+ * @dir_path_len:	the length of directory.
+ */
+int get_mount_point(const char *devname, char *mount_point, int dir_path_len)
+{
+	/* Refer to /etc/mtab */
+	char	*mtab = MOUNTED;
+	FILE	*fp = NULL;
+	struct mntent	*mnt = NULL;
+
+	fp = setmntent(mtab, "r");
+	if (fp == NULL) {
+		perror("Couldn't access /etc/mtab");
+		return -1;
+	}
+
+	while ((mnt = getmntent(fp)) != NULL) {
+		if (strcmp(devname, mnt->mnt_fsname) != 0)
+			continue;
+
+		endmntent(fp);
+		if (strcmp(mnt->mnt_type, FS_EXT4) == 0) {
+			strncpy(mount_point, mnt->mnt_dir,
+				dir_path_len);
+			return 0;
+		}
+		PRINT_ERR_MSG(NGMSG_EXT4);
+		return -1;
+	}
+	endmntent(fp);
+	PRINT_ERR_MSG("Filesystem is not mounted");
+	return -1;
+}
+
+/*
+ * is_ext4() -		Whether on an ext4 filesystem.
+ *
+ * @file:		the file's name.
+ */
+int is_ext4(const char *file)
+{
+	int 	maxlen = 0;
+	int	len, ret;
+	FILE	*fp = NULL;
+	char	*mnt_type = NULL;
+	/* Refer to /etc/mtab */
+	char	*mtab = MOUNTED;
+	char	file_path[PATH_MAX + 1];
+	struct mntent	*mnt = NULL;
+	struct statfs64	fsbuf;
+
+	/* Get full path */
+	if (realpath(file, file_path) == NULL) {
+		perror("Couldn't get full path");
+		PRINT_FILE_NAME(file);
+		return -1;
+	}
+
+	if (statfs64(file_path, &fsbuf) < 0) {
+		perror("Failed to get filesystem information");
+		PRINT_FILE_NAME(file);
+		return -1;
+	}
+
+	if (fsbuf.f_type != EXT4_SUPER_MAGIC) {
+		PRINT_ERR_MSG(NGMSG_EXT4);
+		return -1;
+	}
+
+	fp = setmntent(mtab, "r");
+	if (fp == NULL) {
+		perror("Couldn't access /etc/mtab");
+		return -1;
+	}
+
+	while ((mnt = getmntent(fp)) != NULL) {
+		len = strlen(mnt->mnt_dir);
+		ret = memcmp(file_path, mnt->mnt_dir, len);
+		if (ret != 0)
+			continue;
+
+		if (maxlen >= len)
+			continue;
+
+		maxlen = len;
+
+		mnt_type = realloc(mnt_type, strlen(mnt->mnt_type) + 1);
+		if (mnt_type == NULL) {
+			endmntent(fp);
+			return -1;
+		}
+		memset(mnt_type, 0, strlen(mnt->mnt_type) + 1);
+		strncpy(mnt_type, mnt->mnt_type, strlen(mnt->mnt_type));
+		strncpy(lost_found_dir, mnt->mnt_dir, PATH_MAX);
+	}
+
+	endmntent(fp);
+	if (strcmp(mnt_type, FS_EXT4) == 0) {
+		FREE(mnt_type);
+		return 0;
+	} else {
+		FREE(mnt_type);
+		PRINT_ERR_MSG(NGMSG_EXT4);
+		return -1;
+	}
+}
+
+/*
+ * calc_entry_counts() -	Calculate file counts.
+ *
+ * @file:		file name.
+ * @buf:		file info.
+ * @flag:		file type.
+ * @ftwbuf:		the pointer of a struct FTW.
+ */
+int calc_entry_counts(const char *file EXT2FS_ATTR((unused)),
+		const struct stat64 *buf, int flag EXT2FS_ATTR((unused)),
+		struct FTW *ftwbuf EXT2FS_ATTR((unused)))
+{
+	if (S_ISREG(buf->st_mode))
+		regular_count++;
+
+	total_count++;
+
+	return 0;
+}
+
+/*
+ * page_in_core() -	Get information on whether pages are in core.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @defrag_data:	data used for defrag.
+ * @vec:		page state array.
+ * @page_num:		page number.
+ */
+int page_in_core(int fd, struct move_extent defrag_data,
+			unsigned char **vec, unsigned int *page_num)
+{
+	long	pagesize = sysconf(_SC_PAGESIZE);
+	void	*page = NULL;
+	loff_t	offset, end_offset, length;
+
+	if (vec == NULL || *vec != NULL)
+		return -1;
+
+	/* In mmap, offset should be a multiple of the page size */
+	offset = (loff_t)defrag_data.orig_start * block_size;
+	length = (loff_t)defrag_data.len * block_size;
+	end_offset = offset + length;
+	/* Round the offset down to the nearest multiple of pagesize */
+	offset = (offset / pagesize) * pagesize;
+	length = end_offset - offset;
+
+	page = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, offset);
+	if (page == MAP_FAILED)
+		return -1;
+
+	*page_num = 0;
+	*page_num = (length + pagesize - 1) / pagesize;
+	*vec = (unsigned char *)calloc(*page_num, 1);
+	if (*vec == NULL)
+		return -1;
+
+	/* Get information on whether pages are in core */
+	if (mincore(page, (size_t)length, *vec) == -1 ||
+		munmap(page, length) == -1) {
+		FREE(*vec);
+		return -1;
+	}
+
+	return 0;
+}
+
+/*
+ * defrag_fadvise() -	Predeclare an access pattern for file data.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @defrag_data:	data used for defrag.
+ * @vec:		page state array.
+ * @page_num:		page number.
+ */
+int defrag_fadvise(int fd, struct move_extent defrag_data,
+		   unsigned char *vec, unsigned int page_num)
+{
+	int	flag = 1;
+	long	pagesize = sysconf(_SC_PAGESIZE);
+	int	fadvise_flag = POSIX_FADV_DONTNEED;
+	int	sync_flag = SYNC_FILE_RANGE_WAIT_BEFORE |
+			    SYNC_FILE_RANGE_WRITE |
+			    SYNC_FILE_RANGE_WAIT_AFTER;
+	unsigned int	i;
+	loff_t	offset;
+
+	offset = (loff_t)defrag_data.orig_start * block_size;
+	offset = (offset / pagesize) * pagesize;
+
+	/* Sync file for fadvise process */
+	if (sync_file_range(fd, offset,
+		(loff_t)pagesize * page_num, sync_flag) < 0)
+		return -1;
+
+	/* Try to release buffer cache which this process used,
+	 * then other process can use the released buffer
+	 */
+	for (i = 0; i < page_num; i++) {
+		if ((vec[i] & 0x1) == 0) {
+			offset += pagesize;
+			continue;
+		}
+		if (fadvise(fd, offset, pagesize, fadvise_flag) < 0) {
+			if ((mode_flag & DETAIL) && flag) {
+				perror("\tFailed to fadvise");
+				flag = 0;
+			}
+		}
+		offset += pagesize;
+	}
+
+	return 0;
+}
+
+/*
+ * check_free_size() -	Check if there's enough disk space.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @file:		file name.
+ * @buf:		the pointer of the struct stat64.
+ */
+int check_free_size(int fd, const char *file, const struct stat64 *buf)
+{
+	ext4_fsblk_t	blk_count;
+	ext4_fsblk_t	free_blk_count;
+	struct statfs64	fsbuf;
+
+	if (fstatfs64(fd, &fsbuf) < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(
+				"Failed to get filesystem information");
+		}
+		return -1;
+	}
+
+	/* Target file size measured by filesystem IO blocksize */
+	blk_count = SECTOR_TO_BLOCK(buf->st_blocks, fsbuf.f_bsize);
+
+	/* Compute free space for root and normal user separately */
+	if (current_uid == ROOT_UID)
+		free_blk_count = fsbuf.f_bfree;
+	else
+		free_blk_count = fsbuf.f_bavail;
+
+	if (free_blk_count >= blk_count)
+		return 0;
+
+	return -ENOSPC;
+}
+
+/*
+ * file_frag_count() -	Get file fragment count.
+ *
+ * @fd:			defrag target file's descriptor.
+ */
+int file_frag_count(int fd)
+{
+	int	ret;
+	struct fiemap	fiemap_buf;
+
+	/* When fm_extent_count is 0,
+	 * ioctl just get file fragment count.
+	 */
+	memset(&fiemap_buf, 0, sizeof(struct fiemap));
+	fiemap_buf.fm_start = 0;
+	fiemap_buf.fm_length = FIEMAP_MAX_OFFSET;
+	fiemap_buf.fm_flags |= FIEMAP_FLAG_SYNC;
+
+	ret = ioctl(fd, FS_IOC_FIEMAP, &fiemap_buf);
+	if (ret < 0)
+		return ret;
+
+	return fiemap_buf.fm_mapped_extents;
+}
+
+/*
+ * file_check() -	Check file's attributes.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @buf:		a pointer of the struct stat64.
+ * @file:		the file's name.
+ * @extents:		the file's extents.
+ */
+int file_check(int fd, const struct stat64 *buf, const char *file,
+		int extents)
+{
+	int	ret;
+	struct flock	lock;
+
+	/* Write-lock check is more reliable */
+	lock.l_type = F_WRLCK;
+	lock.l_start = 0;
+	lock.l_whence = SEEK_SET;
+	lock.l_len = 0;
+
+	/* Free space */
+	ret = check_free_size(fd, file, buf);
+	if (ret < 0) {
+		if ((mode_flag & DETAIL) && ret == -ENOSPC) {
+			printf("\033[79;0H\033[K[%u/%u] \"%s\"\t\t"
+				"  extents: %d -> %d\n", defraged_file_count,
+				total_count, file, extents, extents);
+			IN_FTW_PRINT_ERR_MSG(
+			"Defrag size is larger than filesystem's free space");
+		}
+		return -1;
+	}
+
+	/* Access authority */
+	if (current_uid != ROOT_UID &&
+		buf->st_uid != current_uid) {
+		if (mode_flag & DETAIL) {
+			printf("\033[79;0H\033[K[%u/%u] \"%s\"\t\t"
+				"  extents: %d -> %d\n", defraged_file_count,
+				total_count, file, extents, extents);
+			IN_FTW_PRINT_ERR_MSG(
+				"File is not current user's file"
+				" or current user is not root");
+		}
+		return -1;
+	}
+
+	/* Lock status */
+	if (fcntl(fd, F_GETLK, &lock) < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(
+				"Failed to get lock information");
+		}
+		return -1;
+	} else if (lock.l_type != F_UNLCK) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			IN_FTW_PRINT_ERR_MSG("File has been locked");
+		}
+		return -1;
+	}
+
+	return 0;
+}
+
+/*
+ * insert_extent_by_logical() -	Sequentially insert extent by logical.
+ *
+ * @ext_list_head:	the head of logical extent list.
+ * @ext:		the extent element which will be inserted.
+ */
+int insert_extent_by_logical(struct fiemap_extent_list **ext_list_head,
+			struct fiemap_extent_list *ext)
+{
+	struct fiemap_extent_list	*ext_list_tmp = *ext_list_head;
+
+	if (ext == NULL)
+		goto out;
+
+	/* First element */
+	if (*ext_list_head == NULL) {
+		(*ext_list_head) = ext;
+		(*ext_list_head)->prev = *ext_list_head;
+		(*ext_list_head)->next = *ext_list_head;
+		return 0;
+	}
+
+	if (ext->data.logical <= ext_list_tmp->data.logical) {
+		/* Insert before head */
+		if (ext_list_tmp->data.logical <
+			ext->data.logical + ext->data.len)
+			/* Overlap */
+			goto out;
+		/* Adjust head */
+		*ext_list_head = ext;
+	} else {
+		/* Insert into the middle or last of the list */
+		do {
+			if (ext->data.logical < ext_list_tmp->data.logical)
+				break;
+			ext_list_tmp = ext_list_tmp->next;
+		} while (ext_list_tmp != (*ext_list_head));
+		if (ext->data.logical <
+		    ext_list_tmp->prev->data.logical +
+			ext_list_tmp->prev->data.len)
+			/* Overlap */
+			goto out;
+
+		if (ext_list_tmp != *ext_list_head &&
+		    ext_list_tmp->data.logical <
+		    ext->data.logical + ext->data.len)
+			/* Overlap */
+			goto out;
+	}
+	ext_list_tmp = ext_list_tmp->prev;
+	/* Insert "ext" after "ext_list_tmp" */
+	insert(ext_list_tmp, ext);
+	return 0;
+out:
+	errno = EINVAL;
+	return -1;
+}
+
+/*
+ * insert_extent_by_physical() -	Sequentially insert extent by physical.
+ *
+ * @ext_list_head:	the head of physical extent list.
+ * @ext:		the extent element which will be inserted.
+ */
+int insert_extent_by_physical(struct fiemap_extent_list **ext_list_head,
+			struct fiemap_extent_list *ext)
+{
+	struct fiemap_extent_list	*ext_list_tmp = *ext_list_head;
+
+	if (ext == NULL)
+		goto out;
+
+	/* First element */
+	if (*ext_list_head == NULL) {
+		(*ext_list_head) = ext;
+		(*ext_list_head)->prev = *ext_list_head;
+		(*ext_list_head)->next = *ext_list_head;
+		return 0;
+	}
+
+	if (ext->data.physical <= ext_list_tmp->data.physical) {
+		/* Insert before head */
+		if (ext_list_tmp->data.physical <
+					ext->data.physical + ext->data.len)
+			/* Overlap */
+			goto out;
+		/* Adjust head */
+		*ext_list_head = ext;
+	} else {
+		/* Insert into the middle or last of the list */
+		do {
+			if (ext->data.physical < ext_list_tmp->data.physical)
+				break;
+			ext_list_tmp = ext_list_tmp->next;
+		} while (ext_list_tmp != (*ext_list_head));
+		if (ext->data.physical <
+		    ext_list_tmp->prev->data.physical +
+				ext_list_tmp->prev->data.len)
+			/* Overlap */
+			goto out;
+
+		if (ext_list_tmp != *ext_list_head &&
+		    ext_list_tmp->data.physical <
+				ext->data.physical + ext->data.len)
+			/* Overlap */
+			goto out;
+	}
+	ext_list_tmp = ext_list_tmp->prev;
+	/* Insert "ext" after "ext_list_tmp" */
+	insert(ext_list_tmp, ext);
+	return 0;
+out:
+	errno = EINVAL;
+	return -1;
+}
+
+/*
+ * insert_exts_group() -	Insert a exts_group.
+ *
+ * @ext_group_head:		the head of a exts_group list.
+ * @exts_group:			the exts_group element which will be inserted.
+ */
+int insert_exts_group(struct fiemap_extent_group **ext_group_head,
+				struct fiemap_extent_group *exts_group)
+{
+	struct fiemap_extent_group	*ext_group_tmp = NULL;
+
+	if (exts_group == NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	/* Initialize list */
+	if (*ext_group_head == NULL) {
+		(*ext_group_head) = exts_group;
+		(*ext_group_head)->prev = *ext_group_head;
+		(*ext_group_head)->next = *ext_group_head;
+		return 0;
+	}
+
+	ext_group_tmp = (*ext_group_head)->prev;
+	insert(ext_group_tmp, exts_group);
+
+	return 0;
+}
+
+/*
+ * join_extents() -		Find continuous region(exts_group).
+ *
+ * @ext_list_head:		the head of the extent list.
+ * @ext_group_head:		the head of the target exts_group list.
+ */
+int join_extents(struct fiemap_extent_list *ext_list_head,
+		struct fiemap_extent_group **ext_group_head)
+{
+	__u64	len = ext_list_head->data.len;
+	struct fiemap_extent_list *ext_list_start = ext_list_head;
+	struct fiemap_extent_list *ext_list_tmp = ext_list_head->next;
+
+	do {
+		struct fiemap_extent_group	*ext_group_tmp = NULL;
+
+		/* This extent and previous extent are not continuous,
+		 * so, all previous extents are treated as an extent group.
+		 */
+		if ((ext_list_tmp->prev->data.logical +
+			ext_list_tmp->prev->data.len)
+				!= ext_list_tmp->data.logical) {
+			ext_group_tmp =
+				malloc(sizeof(struct fiemap_extent_group));
+			if (ext_group_tmp == NULL)
+				return -1;
+
+			memset(ext_group_tmp, 0,
+				sizeof(struct fiemap_extent_group));
+			ext_group_tmp->len = len;
+			ext_group_tmp->start = ext_list_start;
+			ext_group_tmp->end = ext_list_tmp->prev;
+
+			if (insert_exts_group(ext_group_head,
+				ext_group_tmp) < 0) {
+				FREE(ext_group_tmp);
+				return -1;
+			}
+			ext_list_start = ext_list_tmp;
+			len = ext_list_tmp->data.len;
+			ext_list_tmp = ext_list_tmp->next;
+			continue;
+		}
+
+		/* This extent and previous extent are continuous,
+		 * so, they belong to the same extent group, and we check
+		 * if the next extent belongs to the same extent group.
+		 */
+		len += ext_list_tmp->data.len;
+		ext_list_tmp = ext_list_tmp->next;
+	} while (ext_list_tmp != ext_list_head->next);
+
+	return 0;
+}
+
+/*
+ * get_file_extents() -	Get file's extent list.
+ *
+ * @fd:			defrag target file's descriptor.
+ * @ext_list_head:	the head of the extent list.
+ */
+int get_file_extents(int fd, struct fiemap_extent_list **ext_list_head)
+{
+	__u32	i;
+	int	ret;
+	int	ext_buf_size, fie_buf_size;
+	__u64	pos = 0;
+	struct fiemap	*fiemap_buf = NULL;
+	struct fiemap_extent	*ext_buf = NULL;
+	struct fiemap_extent_list	*ext_list = NULL;
+
+	/* Convert units, in bytes.
+	 * Be careful : now, physical block number in extent is 48bit,
+	 * and the maximum blocksize for ext4 is 4K(12bit),
+	 * so there is no overflow, but in future it may be changed.
+	 */
+
+	/* Alloc space for fiemap */
+	ext_buf_size = EXTENT_MAX_COUNT * sizeof(struct fiemap_extent);
+	fie_buf_size = sizeof(struct fiemap) + ext_buf_size;
+
+	fiemap_buf = malloc(fie_buf_size);
+	if (fiemap_buf == NULL)
+		return -1;
+
+	ext_buf = fiemap_buf->fm_extents;
+	memset(fiemap_buf, 0, fie_buf_size);
+	fiemap_buf->fm_length = FIEMAP_MAX_OFFSET;
+	fiemap_buf->fm_flags |= FIEMAP_FLAG_SYNC;
+	fiemap_buf->fm_extent_count = EXTENT_MAX_COUNT;
+
+	do {
+		fiemap_buf->fm_start = pos;
+		memset(ext_buf, 0, ext_buf_size);
+		ret = ioctl(fd, FS_IOC_FIEMAP, fiemap_buf);
+		if (ret < 0)
+			goto out;
+		for (i = 0; i < fiemap_buf->fm_mapped_extents; i++) {
+			ext_list = NULL;
+			ext_list = malloc(sizeof(struct fiemap_extent_list));
+			if (ext_list == NULL)
+				goto out;
+
+			ext_list->data.physical = ext_buf[i].fe_physical
+						/ block_size;
+			ext_list->data.logical = ext_buf[i].fe_logical
+						/ block_size;
+			ext_list->data.len = ext_buf[i].fe_length
+						/ block_size;
+
+			ret = insert_extent_by_physical(
+					ext_list_head, ext_list);
+			if (ret < 0) {
+				FREE(ext_list);
+				goto out;
+			}
+		}
+		/* Record file's logical offset this time */
+		pos = ext_buf[EXTENT_MAX_COUNT-1].fe_logical +
+			ext_buf[EXTENT_MAX_COUNT-1].fe_length;
+		/*
+		 * If fm_extents array has been filled and
+		 * there are extents left, continue to cycle.
+		 */
+	} while (fiemap_buf->fm_mapped_extents
+					== EXTENT_MAX_COUNT &&
+		!(ext_buf[EXTENT_MAX_COUNT-1].fe_flags
+					& FIEMAP_EXTENT_LAST));
+
+	FREE(fiemap_buf);
+	return 0;
+out:
+	FREE(fiemap_buf);
+	return -1;
+}
+
+/*
+ * get_logical_count() -	Get the file logical extents count.
+ *
+ * @logical_list_head:	the head of the logical extent list.
+ */
+int get_logical_count(struct fiemap_extent_list *logical_list_head)
+{
+	int ret = 0;
+	struct fiemap_extent_list *ext_list_tmp  = logical_list_head;
+
+	do {
+		ret++;
+		ext_list_tmp = ext_list_tmp->next;
+	} while (ext_list_tmp != logical_list_head);
+
+	return ret;
+}
+
+/*
+ * get_physical_count() -	Get the file physical extents count.
+ *
+ * @physical_list_head:	the head of the physical extent list.
+ */
+int get_physical_count(struct fiemap_extent_list *physical_list_head)
+{
+	int ret = 0;
+	struct fiemap_extent_list *ext_list_tmp = physical_list_head;
+
+	do {
+		if ((ext_list_tmp->data.physical + ext_list_tmp->data.len)
+				!= ext_list_tmp->next->data.physical) {
+			/* This extent and next extent are not continuous. */
+			ret++;
+		}
+
+		ext_list_tmp = ext_list_tmp->next;
+	} while (ext_list_tmp != physical_list_head);
+
+	return ret;
+}
+
+/*
+ * change_physical_to_logical() -	Change list from physical to logical.
+ *
+ * @physical_list_head:	the head of physical extent list.
+ * @logical_list_head:	the head of logical extent list.
+ */
+int change_physical_to_logical(struct fiemap_extent_list **physical_list_head,
+				struct fiemap_extent_list **logical_list_head)
+{
+	int ret;
+	struct fiemap_extent_list *ext_list_tmp = *physical_list_head;
+	struct fiemap_extent_list *ext_list_next = ext_list_tmp->next;
+
+	while (1) {
+		if (ext_list_tmp == ext_list_next) {
+			ret = insert_extent_by_logical(
+				logical_list_head, ext_list_tmp);
+			if (ret < 0)
+				return -1;
+
+			*physical_list_head = NULL;
+			break;
+		}
+
+		ext_list_tmp->prev->next = ext_list_tmp->next;
+		ext_list_tmp->next->prev = ext_list_tmp->prev;
+		*physical_list_head = ext_list_next;
+
+		ret = insert_extent_by_logical(
+			logical_list_head, ext_list_tmp);
+		if (ret < 0) {
+			FREE(ext_list_tmp);
+			return -1;
+		}
+		ext_list_tmp = ext_list_next;
+		ext_list_next = ext_list_next->next;
+	}
+
+	return 0;
+}
+
+/*
+ * free_ext() -		Free the extent list.
+ *
+ * @ext_list_head:	the extent list head of which will be free.
+ */
+void free_ext(struct fiemap_extent_list *ext_list_head)
+{
+	struct fiemap_extent_list	*ext_list_tmp = NULL;
+
+	if (ext_list_head == NULL)
+		return;
+
+	while (ext_list_head->next != ext_list_head) {
+		ext_list_tmp = ext_list_head;
+		ext_list_head->prev->next = ext_list_head->next;
+		ext_list_head->next->prev = ext_list_head->prev;
+		ext_list_head = ext_list_head->next;
+		free(ext_list_tmp);
+	}
+	free(ext_list_head);
+}
+
+/*
+ * free_exts_group() -		Free the exts_group.
+ *
+ * @*ext_group_head:	the exts_group list head which will be free.
+ */
+ void free_exts_group(struct fiemap_extent_group *ext_group_head)
+{
+	struct fiemap_extent_group	*ext_group_tmp = NULL;
+
+	if (ext_group_head == NULL)
+		return;
+
+	while (ext_group_head->next != ext_group_head) {
+		ext_group_tmp = ext_group_head;
+		ext_group_head->prev->next = ext_group_head->next;
+		ext_group_head->next->prev = ext_group_head->prev;
+		ext_group_head = ext_group_head->next;
+		free(ext_group_tmp);
+	}
+	free(ext_group_head);
+}
+
+/*
+ * get_superblock_info() -	Get superblock info by the file name.
+ *
+ * @file:		the file's name.
+ * @sb:		the pointer of the struct ext4_super_block.
+ */
+int get_superblock_info(const char *file, struct ext4_super_block *sb)
+{
+	/* Refer to /etc/mtab */
+	char	*mtab = MOUNTED;
+	FILE	*fp = NULL;
+
+	int	fd = -1;
+	int	ret;
+	size_t maxlen = 0;
+	size_t len;
+	char	dev_name[PATH_MAX + 1];
+	struct mntent	*mnt = NULL;
+
+	fp = setmntent(mtab, "r");
+	if (fp == NULL)
+		return -1;
+
+	while ((mnt = getmntent(fp)) != NULL) {
+		len = strlen(mnt->mnt_dir);
+		ret = memcmp(file, mnt->mnt_dir, len);
+		if (ret != 0)
+			continue;
+
+		if (len < maxlen)
+			continue;
+
+		maxlen = len;
+
+		memset(dev_name, 0, PATH_MAX + 1);
+		strncpy(dev_name, mnt->mnt_fsname,
+				strnlen(mnt->mnt_fsname, PATH_MAX));
+	}
+
+	fd = open64(dev_name, O_RDONLY);
+	if (fd < 0) {
+		ret = -1;
+		goto out;
+	}
+
+	/* Set offset to read superblock */
+	ret = lseek64(fd, SUPERBLOCK_OFFSET, SEEK_SET);
+	if (ret < 0)
+		goto out;
+
+	ret = read(fd, sb, sizeof(struct ext4_super_block));
+	if (ret < 0)
+		goto out;
+
+out:
+	if (fd != -1)
+		close(fd);
+	endmntent(fp);
+	return ret;
+}
+
+/*
+ * get_best_count() -	Get the file best extents count.
+ *
+ * @block_count:		the file's physical block count.
+ */
+int get_best_count(ext4_fsblk_t block_count)
+{
+	int ret;
+	unsigned int flex_bg_num;
+
+	/* Calcuate best extents count */
+	if (feature_incompat & EXT4_FEATURE_INCOMPAT_FLEX_BG) {
+		flex_bg_num = 1 << log_groups_per_flex;
+		ret = ((block_count - 1) /
+			((ext4_fsblk_t)blocks_per_group *
+				flex_bg_num)) + 1;
+	} else
+		ret = ((block_count - 1) / blocks_per_group) + 1;
+
+	return ret;
+}
+
+
+/*
+ * file_statistic() -	Get statistic info of the file's fragments.
+ *
+ * @file:		the file's name.
+ * @buf:		the pointer of the struct stat64.
+ * @flag:		file type.
+ * @ftwbuf:		the pointer of a struct FTW.
+ */
+int file_statistic(const char *file, const struct stat64 *buf,
+			int flag EXT2FS_ATTR((unused)),
+			struct FTW *ftwbuf EXT2FS_ATTR((unused)))
+{
+	int	fd;
+	int	ret;
+	int	now_ext_count, best_ext_count, physical_ext_count;
+	int	i, j;
+	float	ratio = 0.0;
+	ext4_fsblk_t	blk_count = 0;
+	char	msg_buffer[PATH_MAX + 24];
+	struct fiemap_extent_list *physical_list_head = NULL;
+	struct fiemap_extent_list *logical_list_head = NULL;
+
+	defraged_file_count++;
+
+	if (mode_flag & DETAIL) {
+		if (total_count == 1 && regular_count == 1)
+			printf("<File>\n");
+		else {
+			printf("[%u/%u]", defraged_file_count, total_count);
+			fflush(stdout);
+		}
+	}
+	if (lost_found_dir[0] != '\0' &&
+	    !memcmp(file, lost_found_dir, strnlen(lost_found_dir, PATH_MAX))) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG(NGMSG_LOST_FOUND);
+		}
+			return 0;
+	}
+
+	if (!S_ISREG(buf->st_mode)) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG(NGMSG_FILE_UNREG);
+		}
+		return 0;
+	}
+
+	/* Access authority */
+	if (current_uid != ROOT_UID &&
+		buf->st_uid != current_uid) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG(
+				"File is not current user's file"
+				" or current user is not root");
+		}
+		return 0;
+	}
+
+	/* Empty file */
+	if (buf->st_size == 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG("File size is 0");
+		}
+		return 0;
+	}
+
+	fd = open64(file, O_RDONLY);
+	if (fd < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG_WITH_ERRNO(NGMSG_FILE_OPEN);
+		}
+		return 0;
+	}
+
+	/* Get file's physical extents  */
+	ret = get_file_extents(fd, &physical_list_head);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Get the count of file's continuous physical region */
+	physical_ext_count = get_physical_count(physical_list_head);
+
+	/* Change list from physical to logical */
+	ret = change_physical_to_logical(&physical_list_head,
+							&logical_list_head);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			STATISTIC_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Count file fragments before defrag */
+	now_ext_count = get_logical_count(logical_list_head);
+
+	if (current_uid == ROOT_UID) {
+		/* Calculate fragment ratio  */
+		blk_count =
+				SECTOR_TO_BLOCK(buf->st_blocks, block_size);
+
+		best_ext_count = get_best_count(blk_count);
+
+		ratio = (float)(physical_ext_count - best_ext_count) * 100 /
+							blk_count;
+
+		extents_before_defrag += now_ext_count;
+		extents_after_defrag += best_ext_count;
+		files_block_count += blk_count;
+	}
+
+	if (total_count == 1 && regular_count == 1) {
+		/* File only */
+		if (mode_flag & DETAIL) {
+			int count = 0;
+			struct fiemap_extent_list *ext_list_tmp =
+						logical_list_head;
+
+			/* Print extents info */
+			do {
+				count++;
+				printf("[ext %d]:\tstart %llu:\tlogical "
+						"%llu:\tlen %llu\n", count,
+						ext_list_tmp->data.physical,
+						ext_list_tmp->data.logical,
+						ext_list_tmp->data.len);
+				ext_list_tmp = ext_list_tmp->next;
+			} while (ext_list_tmp != logical_list_head);
+
+		} else {
+			printf("%-40s%10s/%-10s%9s\n",
+					"<File>", "now", "best", "ratio");
+			if (current_uid == ROOT_UID) {
+				if (strlen(file) > 40)
+					printf("%s\n%50d/%-10d%8.2f%%\n",
+						file, now_ext_count,
+						best_ext_count, ratio);
+				else
+					printf("%-40s%10d/%-10d%8.2f%%\n",
+						file, now_ext_count,
+						best_ext_count, ratio);
+			} else {
+				if (strlen(file) > 40)
+					printf("%s\n%50d/%-10s%7s\n",
+							file, now_ext_count,
+							"-", "-");
+				else
+					printf("%-40s%10d/%-10s%7s\n",
+							file, now_ext_count,
+							"-", "-");
+			}
+		}
+		succeed_cnt++;
+		goto out;
+	}
+
+	if (mode_flag & DETAIL) {
+		/* Print statistic info */
+		sprintf(msg_buffer, "[%u/%u]%s",
+				defraged_file_count, total_count, file);
+		if (current_uid == ROOT_UID) {
+			if (strlen(msg_buffer) > 40)
+				printf("\033[79;0H\033[K%s\n"
+						"%50d/%-10d%8.2f%%\n",
+						msg_buffer, now_ext_count,
+						best_ext_count, ratio);
+			else
+				printf("\033[79;0H\033[K%-40s"
+						"%10d/%-10d%8.2f%%\n",
+						msg_buffer, now_ext_count,
+						best_ext_count, ratio);
+		} else {
+			if (strlen(msg_buffer) > 40)
+				printf("\033[79;0H\033[K%s\n%50d/%-10s%7s\n",
+						msg_buffer, now_ext_count,
+							"-", "-");
+			else
+				printf("\033[79;0H\033[K%-40s%10d/%-10s%7s\n",
+						msg_buffer, now_ext_count,
+							"-", "-");
+		}
+	}
+
+	for (i = 0; i < SHOW_FRAG_FILES; i++) {
+		if (ratio >= frag_rank[i].ratio) {
+			for (j = SHOW_FRAG_FILES - 1; j > i; j--) {
+				memcpy(&frag_rank[j], &frag_rank[j - 1],
+					sizeof(struct frag_statistic_ino));
+			}
+			memset(&frag_rank[i], 0,
+					sizeof(struct frag_statistic_ino));
+			strncpy(frag_rank[i].msg_buffer, file,
+						strnlen(file, PATH_MAX));
+			frag_rank[i].now_count = now_ext_count;
+			frag_rank[i].best_count = best_ext_count;
+			frag_rank[i].ratio = ratio;
+			break;
+		}
+	}
+
+	succeed_cnt++;
+
+out:
+	close(fd);
+	free_ext(physical_list_head);
+	free_ext(logical_list_head);
+	return 0;
+}
+
+/*
+ * print_progress -	Print defrag progress
+ *
+ * @file:		file name.
+ * @start:		logical offset for defrag target file
+ * @file_size:		defrag target filesize
+ */
+void print_progress(const char *file, loff_t start, loff_t file_size)
+{
+	int percent = (start * 100) / file_size;
+	printf("\033[79;0H\033[K[%u/%u]%s:\t%3d%%",
+		defraged_file_count, total_count, file, min(percent, 100));
+	fflush(stdout);
+
+	return;
+}
+
+/*
+ * call_defrag() -	Execute the defrag program.
+ *
+ * @fd:			target file descriptor.
+ * @donor_fd:		donor file descriptor.
+ * @file:			target file name.
+ * @buf:			pointer of the struct stat64.
+ * @ext_list_head:	head of the extent list.
+ */
+int call_defrag(int fd, int donor_fd, const char *file,
+	const struct stat64 *buf, struct fiemap_extent_list *ext_list_head)
+{
+	loff_t	start = 0;
+	unsigned int	page_num;
+	unsigned char	*vec = NULL;
+	int	defraged_ret = 0;
+	int	ret;
+	struct move_extent	move_data;
+	struct fiemap_extent_list	*ext_list_tmp = NULL;
+
+	memset(&move_data, 0, sizeof(struct move_extent));
+	move_data.donor_fd = donor_fd;
+
+	/* Print defrag progress */
+	print_progress(file, start, buf->st_size);
+
+	ext_list_tmp = ext_list_head;
+	do {
+		move_data.orig_start = ext_list_tmp->data.logical;
+		/* Logical offset of orig and donor should be same */
+		move_data.donor_start = move_data.orig_start;
+		move_data.len = ext_list_tmp->data.len;
+		move_data.moved_len = 0;
+
+		ret = page_in_core(fd, move_data, &vec, &page_num);
+		if (ret < 0) {
+			if (mode_flag & DETAIL) {
+				printf("\n");
+				PRINT_ERR_MSG_WITH_ERRNO(
+						"Failed to get file map");
+			} else {
+				printf("\t[ NG ]\n");
+			}
+			return -1;
+		}
+
+		/* EXT4_IOC_MOVE_EXT */
+		defraged_ret =
+			ioctl(fd, EXT4_IOC_MOVE_EXT, &move_data);
+
+		/* Free pages */
+		ret = defrag_fadvise(fd, move_data, vec, page_num);
+		if (vec) {
+			free(vec);
+			vec = NULL;
+		}
+		if (ret < 0) {
+			if (mode_flag & DETAIL) {
+				printf("\n");
+				PRINT_ERR_MSG_WITH_ERRNO(
+					"Failed to free page");
+			} else {
+				printf("\t[ NG ]\n");
+			}
+			return -1;
+		}
+
+		if (defraged_ret < 0) {
+			if (mode_flag & DETAIL) {
+				printf("\n");
+				PRINT_ERR_MSG_WITH_ERRNO(
+						"Failed to defrag");
+			} else {
+				printf("\t[ NG ]\n");
+			}
+			return -1;
+		}
+		/* Adjust logical offset for next ioctl */
+		move_data.orig_start += move_data.moved_len;
+		move_data.donor_start = move_data.orig_start;
+
+		start = move_data.orig_start * buf->st_blksize;
+
+		/* Print defrag progress */
+		print_progress(file, start, buf->st_size);
+
+		/* End of file */
+		if (start >= buf->st_size)
+			break;
+
+		ext_list_tmp = ext_list_tmp->next;
+	} while (ext_list_tmp != ext_list_head);
+
+	return 0;
+}
+
+/*
+ * file_defrag() -		Check file attributes and call ioctl to defrag.
+ *
+ * @file:		the file's name.
+ * @buf:		the pointer of the struct stat64.
+ * @flag:		file type.
+ * @ftwbuf:		the pointer of a struct FTW.
+ */
+int file_defrag(const char *file, const struct stat64 *buf,
+			int flag EXT2FS_ATTR((unused)),
+			struct FTW *ftwbuf EXT2FS_ATTR((unused)))
+{
+	int	fd;
+	int	donor_fd = -1;
+	int	ret;
+	int	best;
+	int	file_frags_start, file_frags_end;
+	int	orig_physical_cnt, donor_physical_cnt;
+	char	tmp_inode_name[PATH_MAX + 8];
+	struct fiemap_extent_list	*orig_list_physical = NULL;
+	struct fiemap_extent_list	*orig_list_logical = NULL;
+	struct fiemap_extent_list	*donor_list_physical = NULL;
+	struct fiemap_extent_list	*donor_list_logical = NULL;
+	struct fiemap_extent_group	*orig_group_head = NULL;
+	struct fiemap_extent_group	*orig_group_tmp = NULL;
+
+	defraged_file_count++;
+
+	if (mode_flag & DETAIL) {
+		printf("[%u/%u]", defraged_file_count, total_count);
+		fflush(stdout);
+	}
+
+	if (lost_found_dir[0] != '\0' &&
+	    !memcmp(file, lost_found_dir, strnlen(lost_found_dir, PATH_MAX))) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			IN_FTW_PRINT_ERR_MSG(NGMSG_LOST_FOUND);
+		}
+		return 0;
+	}
+
+	if (!S_ISREG(buf->st_mode)) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			IN_FTW_PRINT_ERR_MSG(NGMSG_FILE_UNREG);
+		}
+		return 0;
+	}
+
+	/* Empty file */
+	if (buf->st_size == 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			IN_FTW_PRINT_ERR_MSG("File size is 0");
+		}
+		return 0;
+	}
+
+	fd = open64(file, O_RDONLY);
+	if (fd < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_OPEN);
+		}
+		return 0;
+	}
+
+	/* Get file's extents */
+	ret = get_file_extents(fd, &orig_list_physical);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Get the count of file's continuous physical region */
+	orig_physical_cnt = get_physical_count(orig_list_physical);
+
+	/* Change list from physical to logical */
+	ret = change_physical_to_logical(&orig_list_physical,
+							&orig_list_logical);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Count file fragments before defrag */
+	file_frags_start = get_logical_count(orig_list_logical);
+
+	if (file_check(fd, buf, file, file_frags_start) < 0)
+		goto out;
+
+	if (fsync(fd) < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO("Failed to sync(fsync)");
+		}
+		goto out;
+	}
+
+	if (current_uid == ROOT_UID)
+		best =
+		get_best_count(SECTOR_TO_BLOCK(buf->st_blocks, block_size));
+	else
+		best = 1;
+
+	if (file_frags_start <= best)
+		goto check_improvement;
+
+	/* Combine extents to group */
+	ret = join_extents(orig_list_logical, &orig_group_head);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Create donor inode */
+	memset(tmp_inode_name, 0, PATH_MAX + 8);
+	sprintf(tmp_inode_name, "%.*s.defrag",  strnlen(file, PATH_MAX), file);
+	donor_fd = open64(tmp_inode_name, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR);
+	if (donor_fd < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			if (errno == EEXIST)
+				PRINT_ERR_MSG_WITH_ERRNO(
+				"File is being defraged by other program");
+			else
+				PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_OPEN);
+		}
+		goto out;
+	}
+
+	/* Unlink donor inode */
+	ret = unlink(tmp_inode_name);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO("Failed to unlink");
+		}
+		goto out;
+	}
+
+	/* Allocate space for donor inode */
+	orig_group_tmp = orig_group_head;
+	do {
+		ret = fallocate(donor_fd, 0,
+		  (loff_t)orig_group_tmp->start->data.logical * block_size,
+		  (loff_t)orig_group_tmp->len * block_size);
+		if (ret < 0) {
+			if (mode_flag & DETAIL) {
+				PRINT_FILE_NAME(file);
+				PRINT_ERR_MSG_WITH_ERRNO("Failed to fallocate");
+			}
+			goto out;
+		}
+
+		orig_group_tmp = orig_group_tmp->next;
+	} while (orig_group_tmp != orig_group_head);
+
+	/* Get donor inode's extents */
+	ret = get_file_extents(donor_fd, &donor_list_physical);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+	/* Calcuate donor inode's continuous physical region */
+	donor_physical_cnt = get_physical_count(donor_list_physical);
+
+	/* Change donor extent list from physical to logical */
+	ret = change_physical_to_logical(&donor_list_physical,
+							&donor_list_logical);
+	if (ret < 0) {
+		if (mode_flag & DETAIL) {
+			PRINT_FILE_NAME(file);
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_EXTENT);
+		}
+		goto out;
+	}
+
+check_improvement:
+	if (mode_flag & DETAIL) {
+		if (file_frags_start != 1)
+			frag_files_before_defrag++;
+
+		extents_before_defrag += file_frags_start;
+	}
+
+	if (file_frags_start <= best ||
+			orig_physical_cnt <= donor_physical_cnt) {
+		printf("\033[79;0H\033[K[%u/%u]%s:\t%3d%%",
+			defraged_file_count, total_count, file, 100);
+		if (mode_flag & DETAIL)
+			printf("  extents: %d -> %d",
+				file_frags_start, file_frags_start);
+
+		printf("\t[ OK ]\n");
+		succeed_cnt++;
+
+		if (file_frags_start != 1)
+			frag_files_after_defrag++;
+
+		extents_after_defrag += file_frags_start;
+		goto out;
+	}
+
+	/* Defrag the file */
+	ret = call_defrag(fd, donor_fd, file, buf, donor_list_logical);
+
+	/* Count file fragments after defrag and print extents info */
+	if (mode_flag & DETAIL) {
+		file_frags_end = file_frag_count(fd);
+		if (file_frags_end < 0) {
+			printf("\n");
+			PRINT_ERR_MSG_WITH_ERRNO(NGMSG_FILE_INFO);
+			goto out;
+		}
+
+		if (file_frags_end != 1)
+			frag_files_after_defrag++;
+
+		extents_after_defrag += file_frags_end;
+
+		if (ret < 0)
+			goto out;
+
+		printf("  extents: %d -> %d",
+			file_frags_start, file_frags_end);
+		fflush(stdout);
+	}
+
+	if (ret < 0)
+		goto out;
+
+	printf("\t[ OK ]\n");
+	fflush(stdout);
+	succeed_cnt++;
+
+out:
+	close(fd);
+	if (donor_fd != -1)
+		close(donor_fd);
+	free_ext(orig_list_physical);
+	free_ext(orig_list_logical);
+	free_ext(donor_list_physical);
+	free_exts_group(orig_group_head);
+	return 0;
+}
+
+/*
+ * main() -		Ext4 online defrag.
+ *
+ * @argc:		the number of parameter.
+ * @argv[]:		the pointer array of parameter.
+ */
+int main(int argc, char *argv[])
+{
+	int	opt;
+	int	i, j;
+	int	flags = FTW_PHYS | FTW_MOUNT;
+	int	arg_type = -1;
+	int	success_flag = 0;
+	char	dir_name[PATH_MAX + 1];
+	struct stat64	buf;
+	struct ext4_super_block sb;
+
+	/* Parse arguments */
+	if (argc == 1)
+		goto out;
+
+	while ((opt = getopt(argc, argv, "vc")) != EOF) {
+		switch (opt) {
+		case 'v':
+			mode_flag |= DETAIL;
+			break;
+		case 'c':
+			mode_flag |= STATISTIC;
+			break;
+		default:
+			goto out;
+		}
+	}
+
+	if (argc == optind)
+		goto out;
+
+	current_uid = getuid();
+
+	/* Main process */
+	for (i = optind; i < argc; i++) {
+		succeed_cnt = 0;
+		regular_count = 0;
+		total_count = 0;
+		frag_files_before_defrag = 0;
+		frag_files_after_defrag = 0;
+		extents_before_defrag = 0;
+		extents_after_defrag = 0;
+		defraged_file_count = 0;
+		files_block_count = 0;
+		blocks_per_group = 0;
+		feature_incompat = 0;
+		log_groups_per_flex = 0;
+
+		memset(dir_name, 0, PATH_MAX + 1);
+		memset(lost_found_dir, 0, PATH_MAX + 1);
+		memset(frag_rank, 0,
+			sizeof(struct frag_statistic_ino) * SHOW_FRAG_FILES);
+
+		if ((mode_flag & STATISTIC) && i > optind)
+			printf("\n");
+
+#if BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN
+		PRINT_ERR_MSG("Endian's type is not big/little endian");
+		PRINT_FILE_NAME(argv[i]);
+		continue;
+#endif
+
+		if (lstat64(argv[i], &buf) < 0) {
+			perror(NGMSG_FILE_INFO);
+			PRINT_FILE_NAME(argv[i]);
+			continue;
+		}
+
+		if (S_ISBLK(buf.st_mode)) {
+			/* Block device */
+			if (get_mount_point(argv[i], dir_name, PATH_MAX) < 0)
+				continue;
+			if (lstat64(dir_name, &buf) < 0) {
+				perror(NGMSG_FILE_INFO);
+				PRINT_FILE_NAME(argv[i]);
+				continue;
+			}
+			arg_type = DEVNAME;
+			if (!(mode_flag & STATISTIC))
+				printf("ext4 defragmentation for device(%s)\n",
+					argv[i]);
+		} else if (S_ISDIR(buf.st_mode)) {
+			/* Directory */
+			if (access(argv[i], R_OK) < 0) {
+				perror(argv[i]);
+				continue;
+			}
+			arg_type = DIRNAME;
+			strncpy(dir_name, argv[i], strnlen(argv[i], PATH_MAX));
+		} else if (S_ISREG(buf.st_mode)) {
+			/* Regular file */
+			arg_type = FILENAME;
+		} else {
+			/* Irregular file */
+			PRINT_ERR_MSG(NGMSG_FILE_UNREG);
+			PRINT_FILE_NAME(argv[i]);
+			continue;
+		}
+
+		/* Set blocksize */
+		block_size = buf.st_blksize;
+
+		/* For device case,
+		 * filesystem type checked in get_mount_point()
+		 */
+		if (arg_type == FILENAME || arg_type == DIRNAME) {
+			if (is_ext4(argv[i]) < 0)
+				continue;
+			if (realpath(argv[i], dir_name) == NULL) {
+				perror("Couldn't get full path");
+				PRINT_FILE_NAME(argv[i]);
+				continue;
+			}
+		}
+
+		if (current_uid == ROOT_UID) {
+			/* Get super block info */
+			memset(&sb, 0, sizeof(struct ext4_super_block));
+			if (get_superblock_info(dir_name, &sb) < 0) {
+				if (mode_flag & DETAIL) {
+					perror("Can't get super block info");
+					PRINT_FILE_NAME(argv[i]);
+				}
+				continue;
+			}
+
+			blocks_per_group = ext2fs_swab32(sb.s_blocks_per_group);
+			feature_incompat = ext2fs_swab32(sb.s_feature_incompat);
+			log_groups_per_flex = sb.s_log_groups_per_flex;
+		}
+
+		switch (arg_type) {
+		case DIRNAME:
+			if (!(mode_flag & STATISTIC))
+				printf("ext4 defragmentation "
+					"for directory(%s)\n", argv[i]);
+
+			int mount_dir_len = 0;
+			mount_dir_len = strnlen(lost_found_dir, PATH_MAX);
+
+			strncat(lost_found_dir, "/lost+found",
+				PATH_MAX - strnlen(lost_found_dir, PATH_MAX));
+
+			/* Not the case("e4defrag  mount_piont_dir") */
+			if (dir_name[mount_dir_len] != '\0') {
+				/*
+				 * "e4defrag mount_piont_dir/lost+found"
+				 * or "e4defrag mount_piont_dir/lost+found/"
+				 */
+				if (strncmp(lost_found_dir, dir_name,
+					    strnlen(lost_found_dir,
+						    PATH_MAX)) == 0 &&
+				    (dir_name[strnlen(lost_found_dir,
+						      PATH_MAX)] == '\0' ||
+				     dir_name[strnlen(lost_found_dir,
+						      PATH_MAX)] == '/')) {
+					PRINT_ERR_MSG(NGMSG_LOST_FOUND);
+					PRINT_FILE_NAME(argv[i]);
+					continue;
+				}
+
+				/* "e4defrag mount_piont_dir/else_dir" */
+				memset(lost_found_dir, 0, PATH_MAX + 1);
+			}
+		case DEVNAME:
+			if (arg_type == DEVNAME) {
+				strncpy(lost_found_dir, dir_name,
+					strnlen(dir_name, PATH_MAX));
+				strncat(lost_found_dir, "/lost+found/",
+					PATH_MAX - strnlen(lost_found_dir,
+							   PATH_MAX));
+			}
+
+			nftw64(dir_name, calc_entry_counts, FTW_OPEN_FD, flags);
+
+			if (mode_flag & STATISTIC) {
+				if (mode_flag & DETAIL)
+					printf("%-40s%10s/%-10s%9s\n",
+					"<File>", "now", "best", "ratio");
+
+				if (!(mode_flag & DETAIL) &&
+						current_uid != ROOT_UID) {
+					printf(" Done.\n");
+					continue;
+				}
+
+				nftw64(dir_name, file_statistic,
+							FTW_OPEN_FD, flags);
+
+				if (succeed_cnt != 0 &&
+					current_uid == ROOT_UID) {
+					if (mode_flag & DETAIL)
+						printf("\n");
+					printf("%-40s%10s/%-10s%9s\n",
+						"<Fragmented files>", "now",
+						"best", "ratio");
+					for (j = 0; j < SHOW_FRAG_FILES; j++) {
+						if (strlen(frag_rank[j].
+							msg_buffer) > 37) {
+							printf("%d. %s\n%50d/"
+							"%-10d%8.2f%%\n", j + 1,
+							frag_rank[j].msg_buffer,
+							frag_rank[j].now_count,
+							frag_rank[j].best_count,
+							frag_rank[j].ratio);
+						} else if (strlen(frag_rank[j].
+							msg_buffer) > 0) {
+							printf("%d. %-37s%10d/"
+							"%-10d%8.2f%%\n", j + 1,
+							frag_rank[j].msg_buffer,
+							frag_rank[j].now_count,
+							frag_rank[j].best_count,
+							frag_rank[j].ratio);
+						} else
+							break;
+					}
+				}
+				break;
+			}
+			/* File tree walk */
+			nftw64(dir_name, file_defrag, FTW_OPEN_FD, flags);
+			printf("\n\tSuccess:\t\t\t[ %u/%u ]\n", succeed_cnt,
+				total_count);
+			printf("\tFailure:\t\t\t[ %u/%u ]\n",
+				total_count - succeed_cnt, total_count);
+			if (mode_flag & DETAIL) {
+				printf("\tTotal extents:\t\t\t%4d->%d\n",
+					extents_before_defrag,
+					extents_after_defrag);
+				printf("\tFragmented percentage:\t\t"
+					"%3llu%%->%llu%%\n",
+					!regular_count ? 0 :
+					((unsigned long long)
+					frag_files_before_defrag * 100) /
+					regular_count,
+					!regular_count ? 0 :
+					((unsigned long long)
+					frag_files_after_defrag * 100) /
+					regular_count);
+			}
+			break;
+		case FILENAME:
+			total_count = 1;
+			regular_count = 1;
+			strncat(lost_found_dir, "/lost+found/",
+				PATH_MAX - strnlen(lost_found_dir,
+						   PATH_MAX));
+			if (strncmp(lost_found_dir, dir_name,
+				    strnlen(lost_found_dir,
+					    PATH_MAX)) == 0) {
+				PRINT_ERR_MSG(NGMSG_LOST_FOUND);
+				PRINT_FILE_NAME(argv[i]);
+				continue;
+			}
+
+			if (mode_flag & STATISTIC) {
+				file_statistic(argv[i], &buf, FTW_F, NULL);
+				break;
+			} else
+				printf("ext4 defragmentation for %s\n",
+								 argv[i]);
+			/* Defrag single file process */
+			file_defrag(argv[i], &buf, FTW_F, NULL);
+			if (succeed_cnt != 0)
+				printf(" Success:\t\t\t[1/1]\n");
+			else
+				printf(" Success:\t\t\t[0/1]\n");
+
+			break;
+		}
+
+		if (succeed_cnt != 0)
+			success_flag = 1;
+		if (mode_flag & STATISTIC) {
+			if (current_uid != ROOT_UID) {
+				printf(" Done.\n");
+				continue;
+			}
+
+			if (!succeed_cnt) {
+				if (mode_flag & DETAIL)
+					printf("\n");
+
+				if (arg_type == DEVNAME)
+					printf(" In this device(%s), "
+					"none can be defragmented.\n", argv[i]);
+				else if (arg_type == DIRNAME)
+					printf(" In this directory(%s), "
+					"none can be defragmented.\n", argv[i]);
+				else
+					printf(" This file(%s) "
+					"can't be defragmented.\n", argv[i]);
+			} else {
+				float files_ratio = 0.0;
+				float score = 0.0;
+				files_ratio = (float)(extents_before_defrag -
+						extents_after_defrag) *
+						100 / files_block_count;
+				score = CALC_SCORE(files_ratio);
+				printf("\n Total/best extents\t\t\t\t%d/%d\n"
+					" Fragmentation ratio\t\t\t\t%.2f%%\n"
+					" Fragmentation score\t\t\t\t%.2f\n",
+						extents_before_defrag,
+						extents_after_defrag,
+						files_ratio, score);
+				printf(" [0-30 no problem:"
+					" 31-55 a little bit fragmented:"
+					" 55- needs defrag]\n");
+
+				if (arg_type == DEVNAME)
+					printf(" This device(%s) ", argv[i]);
+				else if (arg_type == DIRNAME)
+					printf(" This directory(%s) ", argv[i]);
+				else
+					printf(" This file(%s) ", argv[i]);
+
+				if (score > BOUND_SCORE)
+					printf("needs defragmentation.\n");
+				else
+					printf("does not need "
+							"defragmentation.\n");
+			}
+			printf(" Done.\n");
+		}
+
+	}
+
+	if (success_flag)
+		return 0;
+
+	exit(1);
+
+out:
+	printf(MSG_USAGE);
+	exit(1);
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/ext4_online_defrag_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/ext4_online_defrag_test.sh
new file mode 100755
index 0000000..84613c8
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-online-defrag/ext4_online_defrag_test.sh
@@ -0,0 +1,192 @@
+#!/bin/bash
+
+################################################################################
+#                                                                              #
+# Copyright (c) 2009 FUJITSU LIMITED                                           #
+#                                                                              #
+# This program is free software;  you can redistribute it and#or modify        #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation; either version 2 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful, but          #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   #
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     #
+# for more details.                                                            #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program;  if not, write to the Free Software                 #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA      #
+#                                                                              #
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-online-defrag"
+export TST_TOTAL=18
+export TST_COUNT=1
+
+export TEST_DIR=$PWD
+
+# $1: the test config
+read_config $1
+
+# How to age filesystem
+EMPTY=1
+SMALL=2
+LARGE=3
+
+# Defrag what
+FILE=1
+DIR=2
+FILESYSTEM=3
+
+age_filesystem()
+{
+	local dirId=
+	local idx=
+	rm -rf mnt_point/*
+	if [ $1 -eq $EMPTY ]; then
+		if [ $2 -eq $FILE -o $2 -eq $FILESYSTEM ]; then
+			touch mnt_point/tmp_file
+			echo "abc" > mnt_point/tmp_file
+		elif [ $2 -eq $DIR ]; then
+			mkdir mnt_point/tmp_dir
+			echo "abc" > mnt_point/tmp_dir/tmp_file
+		fi
+	elif [ $1 -eq $SMALL ]; then
+
+		dd if=/dev/zero of=mnt_point/occupy bs=1M count=40
+
+		# age filesystem from 0.0 to 0.2 -> 0.4 -> 0.6 -> 0.8 -> 1.0
+		for ((idx = 3; idx < 8; idx++))
+		{
+			./ffsb ffsb-config$idx > /dev/null
+			dirId=$((idx - 3))
+			mv mnt_point/data mnt_point/data$dirId
+		}
+
+		rm mnt_point/occupy
+
+		df
+	else
+		rm -rf mnt_point/*
+		if [ $2 -eq $DIR ]; then
+			mkdir mnt_point/tmp_dir
+			dest=mnt_point/tmp_dir/tmp_file
+		else
+			dest=mnt_point/tmp_file
+		fi
+
+		bsize=`dumpe2fs -h $EXT4_DEV | grep 'Block size'`
+		bsize=`echo $bsize | awk '{ print $NF }'`
+		bcount=`dumpe2fs -h $EXT4_DEV | grep 'Free blocks'`
+		bcount=`echo $bcount | awk '{ print $NF }'`
+		bcount=$(( $bcount / 2 - 100 ))
+		dd if=/dev/zero of=$dest bs=$bsize count=$bcount
+
+	fi
+}
+
+my_e4defrag()
+{
+	if [ $1 -eq $FILE ]; then
+		if [ $2 -eq $SMALL ]; then
+			./e4defrag mnt_point/data0/
+			return $?
+		# EMPTY or LARGE
+		else
+			./e4defrag mnt_point/tmp_file
+			return $?
+		fi
+	elif [ $1 -eq $DIR ]; then
+		if [ $2 -eq $SMALL ]; then
+			./e4defrag mnt_point/data0/
+			return $?
+		else
+			./e4defrag mnt_point/tmp_dir
+			return $?
+		fi
+	else
+		./e4defrag $EXT4_DEV
+		return $?
+	fi
+}
+
+# Test online defragmentation feature
+# $1: defrag type
+# $2: 1 - empty, 2 - full with small files, 3 - full with large files
+# $3: block size
+ext4_test_online_defrag()
+{
+	tst_resm TINFO "defrag type: $1, defrag obj: $2, block size: $3"
+
+	mkfs.ext4 -m 0 -b $3 -O ^flex_bg $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	tune2fs -E test_fs -O extents $EXT4_DEV
+
+	mount -t ext4 -o nodelalloc $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL"failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	age_filesystem $2 $1
+
+	my_e4defrag $1 $2 >> $LTPROOT/output/ext4_online_defrag_result.txt
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "e4defrag returned failure"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	e2fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "ext4 online defrag test pass(defrag type: $1, Aging: $2, block size: $3)"
+}
+
+# main
+ext4_setup
+
+DEFRAG=( $FILE $DIR $FILESYSTEM )
+AGING=( $EMPTY $SMALL $LARGE )
+BLOCK_SIZE=( 1024 4096 )
+
+RET=0
+
+for ((i = 0; i < 2; i++))
+{
+	for ((j = 0; j < 3; j++))
+	{
+		for ((k = 0; k < 3; k++))
+		{
+			ext4_test_online_defrag ${DEFRAG[$j]} ${AGING[$k]} \
+						${BLOCK_SIZE[$i]}
+			if [ $? -ne 0 ]; then
+				RET=1
+			fi
+			: $((TST_COUNT++))
+		}
+	}
+}
+
+ext4_cleanup
+
+exit $RET
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/Makefile
new file mode 100644
index 0000000..1980349
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, Fujitsu LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+MAKE_TARGETS		:=
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/ext4_persist_prealloc_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/ext4_persist_prealloc_test.sh
new file mode 100755
index 0000000..0d293e8
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-persist-prealloc/ext4_persist_prealloc_test.sh
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-persistent-preallocation"
+export TST_TOTAL=2
+export TST_COUNT=1
+
+export TEST_DIR=$PWD
+
+# $1: the test config
+read_config $1
+
+# The test path of fallocate
+export TDIRECTORY=$PWD/mnt_point/
+
+# Use ltp's syscall/fallocate to test this feature
+# $1: 1024 or 4096
+ext4_test_persist_prealloc()
+{
+	mkfs.ext4 -I 256 -b $1 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	ret=1
+
+	for ((i = 1; i <= 3; i++))
+	{
+		if [ ! -f fallocate0${i} ];  then
+			tst_resm TFAIL "file - fallocate0${i} doesn't exist. Please \
+				check whether it was compiled and installed.\
+				(Path: LTPROOT/testcases/kernel/syscalls/fallocate)"
+			umount mnt_point
+			return 1
+		fi
+
+		./fallocate0${i} | grep -q "CONF"
+		if [ $? -ne $ret ]; then
+			tst_resm TFAIL "fallocate's return value is not expected"
+			umount mnt_point
+			return 1
+		fi
+	}
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	e2fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "ext4 persistent preallocation test pass"
+}
+
+# main
+ext4_setup
+
+RET=0
+
+ext4_test_persist_prealloc 1024
+if [ $? -ne 0 ]; then
+	RET=1;
+fi
+: $((TST_COUNT++))
+
+ext4_test_persist_prealloc 4096
+if [ $? -ne 0 ]; then
+	RET=1;
+fi
+: $((TST_COUNT++))
+
+ext4_cleanup
+
+exit $RET
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/Makefile
new file mode 100644
index 0000000..6b8aabb
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, FUJITSU LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+LDLIBS += -lm
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_long_dirs.c b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_long_dirs.c
new file mode 100644
index 0000000..55c3d0a
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_long_dirs.c
@@ -0,0 +1,156 @@
+/******************************************************************************/
+/*                                                                            */
+/* Copyright (c) 2009 FUJITSU LIMITED                                         */
+/*                                                                            */
+/* This program is free software;  you can redistribute it and/or modify      */
+/* it under the terms of the GNU General Public License as published by       */
+/* the Free Software Foundation; either version 2 of the License, or          */
+/* (at your option) any later version.                                        */
+/*                                                                            */
+/* This program is distributed in the hope that it will be useful,            */
+/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
+/* the GNU General Public License for more details.                           */
+/*                                                                            */
+/* You should have received a copy of the GNU General Public License          */
+/* along with this program;  if not, write to the Free Software               */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
+/*                                                                            */
+/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
+/*                                                                            */
+/******************************************************************************/
+
+#define _ATFILE_SOURCE
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <fcntl.h>
+#include <sys/types.h>
+//#define __USE_ATFILE
+#include <sys/stat.h>
+
+#define NAME_LEN	255
+#define NCHARS		62
+#define MAX_LEN1	62
+#define MAX_LEN2	(62 * 62)
+#define MAX_LEN3	(62 * 62 * 62)
+
+/* valid characters for the directory name */
+char chars[NCHARS + 1] =
+	"0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
+
+/* to store the generated directory name */
+char name[NAME_LEN + 1];
+int names;
+int parent_fd;
+
+/*
+ * init_name - initialize the directory name
+ *
+ * Generate a randomized directory name, and then we generate more
+ * directory names based on it.
+ */
+void init_name(void)
+{
+	int i;
+
+	srand(time(NULL));
+
+	for (i = 0; i < NAME_LEN; i++)
+		name[i] = chars[rand() % 62];
+}
+
+void create_dir(void)
+{
+	if (mkdirat(parent_fd, name, S_IRWXU)) {
+		perror("mkdir");
+		exit(1);
+	}
+}
+
+/*
+ * create_dirs - create @names directory names
+ * @n: how many names to be created
+ *
+ * if n <= 62,       we need to modify 1 char of the name
+ * if n <= 62*62,    we need to modify 2 chars
+ * if n <= 62*62*62, we need to modify 3 chars
+ */
+void create_dirs(int n)
+{
+	int i, j, k;
+	int depth;
+
+	if (n <= MAX_LEN1)
+		depth = 1;
+	else if (n <= MAX_LEN2)
+		depth = 2;
+	else
+		depth = 3;
+
+	for (i = 0; i < NCHARS; i++) {
+		name[0] = chars[i];
+		if (depth == 1) {
+			create_dir();
+			if (--n == 0)
+				return;
+			continue;
+		}
+
+		for (j = 0; j < NCHARS; j++) {
+			name[1] = chars[j];
+			if (depth == 2) {
+				create_dir();
+				if (--n == 0)
+					return;
+				continue;
+			}
+
+			for (k = 0; k < NCHARS; k++) {
+				name[2] = chars[k];
+				create_dir();
+				if (--n == 0)
+					return;
+			}
+		}
+	}
+}
+
+void usage()
+{
+	fprintf(stderr, "Usage: create_long_dirs nr_dirs parent_dir\n");
+}
+
+/*
+ * Create long-name directories
+ * @argv[1]: directory number
+ * @argv[2]: parent directory
+ */
+int main(int argc, char *argv[])
+{
+	if (argc != 3) {
+		usage();
+		return 1;
+	}
+
+	names = atoi(argv[1]);
+	if (names > MAX_LEN3 || names <= 0) {
+		usage();
+		return 1;
+	}
+
+	parent_fd = open(argv[2], O_RDONLY);
+	if (parent_fd == -1) {
+		perror("open parent dir failed");
+		return 1;
+	}
+
+	init_name();
+
+	create_dirs(names);
+
+	return 0;
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_short_dirs.c b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_short_dirs.c
new file mode 100644
index 0000000..328daa2
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/create_short_dirs.c
@@ -0,0 +1,158 @@
+/******************************************************************************/
+/*                                                                            */
+/* Copyright (c) 2009 FUJITSU LIMITED                                         */
+/*                                                                            */
+/* This program is free software;  you can redistribute it and/or modify      */
+/* it under the terms of the GNU General Public License as published by       */
+/* the Free Software Foundation; either version 2 of the License, or          */
+/* (at your option) any later version.                                        */
+/*                                                                            */
+/* This program is distributed in the hope that it will be useful,            */
+/* but WITHOUT ANY WARRANTY;  without even the implied warranty of            */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See                  */
+/* the GNU General Public License for more details.                           */
+/*                                                                            */
+/* You should have received a copy of the GNU General Public License          */
+/* along with this program;  if not, write to the Free Software               */
+/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    */
+/*                                                                            */
+/* Author: Li Zefan <lizf@cn.fujitsu.com>                                     */
+/*                                                                            */
+/******************************************************************************/
+
+#define _ATFILE_SOURCE
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+/* valid characters for a directory name */
+char chars[] = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
+
+/* to store the generated directory name */
+char name[10];
+int names;
+int parent_fd;
+
+/* NCHARS = 10 + 26 + 26 = 62 */
+#define NCHARS		62
+#define MAX_LEN1	62
+#define MAX_LEN2	(62 * 62)
+#define MAX_LEN3	(62 * 62 * 62)
+#define MAX_NAMES	(MAX_LEN1 + MAX_LEN2 + MAX_LEN3)
+
+void create_dir(void)
+{
+	if (mkdirat(parent_fd, name, S_IRWXU)) {
+		perror("mkdir");
+		exit(1);
+	}
+}
+
+/*
+ * create_1 - create length-1 directory names
+ * @n: how name names to be created
+ */
+void create_1(int n)
+{
+	int i;
+
+	name[1] = '\0';
+	for (i = 0; i < NCHARS; i++) {
+		name[0] = chars[i];
+		create_dir();
+		if (--n == 0)
+			return ;
+	}
+}
+
+/*
+ * create_2 - generate length-2 directory names
+ * @n: how many names to be created
+ */
+void create_2(int n)
+{
+	int i, j;
+
+	name[2] = '\0';
+	for (i = 0; i < NCHARS; i++) {
+		name[0] = chars[i];
+		for (j = 0; j < NCHARS; j++) {
+			name[1] = chars[j];
+			create_dir();
+			if (--n == 0)
+				return ;
+		}
+	}
+}
+
+/*
+ * create_3 - generate length-3 directory names
+ * @n: how many names to be created
+ */
+void create_3(int n)
+{
+	int i, j, k;
+
+	name[3] = '\0';
+	for (i = 0; i < NCHARS; i++) {
+		name[0] = chars[i];
+		for (j = 0; j < NCHARS; j++) {
+			name[1] = chars[j];
+			for (k = 0; k < NCHARS; k++) {
+				name[2] = chars[k];
+				create_dir();
+				if (--n == 0)
+					return ;
+			}
+		}
+	}
+}
+
+void usage()
+{
+	fprintf(stderr, "Usage: create_short_dirs nr_dirs parent_dir\n");
+}
+
+/*
+ * Create short-name directoriess
+ * @argv[1]: director number
+ * @argv[2]: the parent directory
+ */
+int main(int argc, char *argv[])
+{
+	if (argc != 3) {
+		usage();
+		return 1;
+	}
+
+	names = atoi(argv[1]);
+	if (names > MAX_NAMES || names <= 0) {
+		usage();
+		return 1;
+	}
+
+	parent_fd = open(argv[2], O_RDONLY);
+	if (parent_fd == -1) {
+		perror("open parent dir");
+		return 1;
+	}
+
+	create_1(names);
+	if (names <= MAX_LEN1)
+		return 0;
+
+	names -= MAX_LEN1;
+	create_2(names);
+	if (names <= MAX_LEN2)
+		return 0;
+
+	names -= MAX_LEN2;
+	create_3(names);
+
+	return 0;
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/ext4_subdir_limit_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/ext4_subdir_limit_test.sh
new file mode 100755
index 0000000..42c4336
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-subdir-limit/ext4_subdir_limit_test.sh
@@ -0,0 +1,167 @@
+#!/bin/bash
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-subdir-limit"
+export TST_TOTAL=12
+export TST_COUNT=1
+
+# $1: the test config
+read_config $1
+
+TEST_DIR=$PWD
+SHORT_DIR=1
+LONG_DIR=2
+
+FAIL=1
+PASS=0
+
+prev_block_size=-1
+prev_result=$FAIL
+
+# Run a test case
+# $1: Number of directories to create
+# $2: create short dir or long dir
+# $3: parent directory
+# $4: filesystem block size
+ext4_run_case()
+{
+	local dir_name_len=
+
+	if [ $2 -eq $SHORT_DIR ]; then
+		dir_name_len="short name"
+	else
+		dir_name_len="long name"
+	fi
+
+	tst_resm TINFO "Num of dirs to create: $1, Dir name len: $dir_name_len \
+			Parent dir: $3, Block size: $4"
+
+	# only mkfs if block size has been changed,
+	# or previous case failed
+	if [ $prev_result -ne $PASS -o $4 -ne $prev_block_size ]; then
+		mkfs.ext4 -b $4 -I 256 $EXT4_DEV > /dev/null
+		if [ $? -ne 0 ]; then
+			tst_resm TFAIL "failed to create ext4 filesystem"
+			return 1
+		fi
+		prev_block_size=$4
+
+		tune2fs -E test_fs -O extents $EXT4_DEV
+	fi
+
+	prev_result=$FAIL
+
+	# mount ext4 filesystem
+	mount -t ext4 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	# create directories
+	mkdir -p $3 2> /dev/null
+
+	if [ $2 -eq $SHORT_DIR ]; then
+		./create_short_dirs $1 $3
+	else
+		./create_long_dirs $1 $3
+	fi
+
+	if [ $? -ne 0 ]; then
+		nr_dirs=`ls $3 | wc -l`
+		tst_resm TFAIL "failed to create directories - $nr_dirs"
+		umount mnt_point
+		return 1
+	fi
+
+	# delete directories
+	cd $3
+	ls | xargs rmdir
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to remove directories"
+
+		cd $TEST_DIR
+		umount mnt_point
+		return 1
+	fi
+	cd $TEST_DIR
+
+	# unmount ext4 filesystem
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	# run fsck to make sure the filesystem has no errors
+	e2fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck: the filesystem has errors"
+		return 1
+	fi
+
+	# check dir_nlink is set
+	dumpe2fs $EXT4_DEV | grep '^Filesystem features' | grep -q dir_nlink
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "feature dir_nlink is not set"
+		return 1
+	fi
+
+	prev_result=$PASS
+	tst_resm TPASS "ext4 subdir limit test pass"
+}
+
+# main
+ext4_setup
+
+DIR_LEN=( $SHORT_DIR $LONG_DIR )
+PARENT_DIR=( "mnt_point" "mnt_point/sub" )
+BLOCK_SIZE=( 1024 2048 4096 )
+
+RET=0
+
+for ((i = 0; i < 3; i++))
+{
+	for ((j = 0; j < 2; j++))
+	{
+		for ((k = 0; k < 2; k++))
+		{
+			ext4_run_case 65537 ${DIR_LEN[$k]} ${PARENT_DIR[$j]} \
+					${BLOCK_SIZE[$i]}
+			if [ $? -ne 0 ]; then
+				RET=1
+			fi
+			: $((TST_COUNT++))
+		}
+	}
+}
+
+ext4_cleanup
+
+exit $RET
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/Makefile b/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/Makefile
new file mode 100644
index 0000000..1980349
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/Makefile
@@ -0,0 +1,25 @@
+#    Copyright (C) 2009, Fujitsu LIMITED
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License along
+#    with this program; if not, write to the Free Software Foundation, Inc.,
+#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+top_srcdir              ?= ../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+MAKE_TARGETS		:=
+INSTALL_TARGETS		?= *.sh
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/ext4_uninit_groups_test.sh b/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/ext4_uninit_groups_test.sh
new file mode 100755
index 0000000..27cbb5f
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4-uninit-groups/ext4_uninit_groups_test.sh
@@ -0,0 +1,161 @@
+#!/bin/bash
+
+################################################################################
+#                                                                              #
+# Copyright (c) 2009 FUJITSU LIMITED                                           #
+#                                                                              #
+# This program is free software;  you can redistribute it and#or modify        #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation; either version 2 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful, but          #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   #
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     #
+# for more details.                                                            #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program;  if not, write to the Free Software                 #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA      #
+#                                                                              #
+################################################################################
+
+cd $LTPROOT/testcases/bin
+
+. ./ext4_funcs.sh
+
+export TCID="ext4-uninit-groups"
+export TST_TOTAL=24
+export TST_COUNT=1
+
+export TEST_DIR=$PWD
+# $1: the test config
+read_config $1
+
+# How to age filesystem
+EMPTY=1
+SMALL=2
+LARGE=3
+
+# filesystem free size in bytes: blocks_size * free_blocks
+filesystem_free_size()
+{
+	bsize=`dumpe2fs -h $EXT4_DEV | grep 'Block size' | awk '{ print $2 }'`
+	blocks=`dumpe2fs -h $EXT4_DEV | grep 'Free blocks'| awk '{ print $2 }'`
+
+	echo $bsize * $blocks
+}
+
+age_filesystem()
+{
+	if [ $1 -eq $EMPTY ]; then
+		# aging, then del
+		./ffsb ffsb-config3 > /dev/null
+		rm -rf mnt_point/*
+	elif [ $1 -eq $SMALL ]; then
+		# age filesystem from 0.0 to 0.2 -> 0.4 -> 0.6 -> 0.8 -> 1.0
+		for ((n = 3; n < 8; n++))
+		{
+			./ffsb ffsb-config$n > /dev/null
+			mv mnt_point/data mnt_point/data$n
+		}
+	elif [ $1 -eq $LARGE ]; then
+		rm -rf mnt_point/*
+		bsize=`dumpe2fs -h $EXT4_DEV | grep 'Block size'`
+		bsize=`echo $bsize | awk '{ print $3 }'`
+		bcount=`dumpe2fs -h $EXT4_DEV | grep 'Free blocks'`
+		bcount=`echo $bcount | awk '{ print $3 }'`
+		dd if=/dev/zero of=mnt_point/tmp_dir bs=$bsize count=$bcount
+	else
+		return 1
+	fi
+
+	return 0
+}
+
+# Test uninitialized groups
+# $1: orlov, oldalloc
+# $2: delalloc
+# $3: flex_bg
+# $4: age filesystem: $EMPTY, $SMALL, $LARGE
+ext4_test_uninit_groups()
+{
+	mkfs.ext4 -I 256 -m 0 $EXT4_DEV > /dev/null
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to create ext4 filesystem"
+		return 1
+	fi
+
+	if [ $3 == "no_flex_bg" ]; then
+		flag=""
+	else
+		flag=$3
+	fi
+
+	tune2fs -E test_fs -O extents,uninit_groups,$flag $EXT4_DEV
+
+	# Must run fsck after setting uninit_groups
+	fsck -p $EXT4_DEV > /dev/null
+
+	mount -t ext4 -o $1,$2 $EXT4_DEV mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to mount ext4 filesystem"
+		return 1
+	fi
+
+	age_filesystem $4
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "age filesystem failed"
+		umount mnt_point
+		return 1
+	fi
+
+	umount mnt_point
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "failed to umount ext4 filesystem"
+		return 1
+	fi
+
+	fsck -p $EXT4_DEV
+	if [ $? -ne 0 ]; then
+		tst_resm TFAIL "fsck returned failure"
+		return 1
+	fi
+
+	tst_resm TPASS "ext4 uninit groups test pass"
+}
+
+# main
+ext4_setup
+
+ORLOV=( "orlov" "oldalloc" )
+DELALLOC=( "delalloc" "nodelalloc" )
+FLEX_BG=( "flex_bg" "no_flex_bg" )
+AGING=( $EMPTY $SMALL $LARGE )
+
+RET=0
+
+for ((i = 0; i < 2; i++))
+{
+	for ((j = 0; j < 2; j++))
+	{
+		for ((k = 0; k < 2; k++))
+		{
+			for ((l = 0; l < 3; l++))
+			{
+				ext4_test_uninit_groups ${ORLOV[$i]} \
+							${DELALLOC[$j]} \
+							${FLEX_BG[$k]} \
+							${AGING[$l]}
+				if [ $? -ne 0 ]; then
+					RET=1
+				fi
+				: $((TST_COUNT++))
+			}
+		}
+	}
+}
+
+ext4_cleanup
+
+exit $RET
diff --git a/testcases/kernel/fs/ext4-new-features/ext4_funcs.sh b/testcases/kernel/fs/ext4-new-features/ext4_funcs.sh
new file mode 100755
index 0000000..34fb65c
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ext4_funcs.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+################################################################################
+##                                                                            ##
+## Copyright (c) 2009 FUJITSU LIMITED                                         ##
+##                                                                            ##
+## This program is free software;  you can redistribute it and#or modify      ##
+## it under the terms of the GNU General Public License as published by       ##
+## the Free Software Foundation; either version 2 of the License, or          ##
+## (at your option) any later version.                                        ##
+##                                                                            ##
+## This program is distributed in the hope that it will be useful, but        ##
+## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
+## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
+## for more details.                                                          ##
+##                                                                            ##
+## You should have received a copy of the GNU General Public License          ##
+## along with this program;  if not, write to the Free Software               ##
+## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA    ##
+##                                                                            ##
+## Author: Li Zefan <lizf@cn.fujitsu.com>                                     ##
+##         Miao Xie <miaox@cn.fujitsu.com>                                    ##
+##                                                                            ##
+################################################################################
+
+ext4_setup()
+{
+	mkdir mnt_point
+}
+
+ext4_cleanup()
+{
+	rmdir mnt_point
+}
+
+# $1: the config file
+read_config()
+{
+	while read config
+	do
+		echo $config | grep -q -E ".*=.*"
+		if [ $? -eq 0 ]; then
+			export $config
+		fi
+	done < $1
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/AUTHORS b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/AUTHORS
new file mode 100644
index 0000000..85d037d
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/AUTHORS
@@ -0,0 +1,7 @@
+Dominique Heger (dheger@us.ibm.com)
+Josh Jacobs (josh@mit.edu)
+
+-> up to Version 3.0 of FFSB
+
+Sonny Rao (raosanth@us.ibm.com)
+versions 3.1 and beyond
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/COPYING b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/COPYING
new file mode 100644
index 0000000..e90dfed
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/INSTALL b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/INSTALL
new file mode 100644
index 0000000..b42a17a
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/LICENSE b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/LICENSE
new file mode 100644
index 0000000..76d9f61
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/LICENSE
@@ -0,0 +1,347 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+The Free Software Foundation has exempted Bash from the requirement of
+Paragraph 2c of the General Public License.  This is to say, there is
+no requirement for Bash to print a notice when it is started
+interactively in the usual way.  We made this exception because users
+and standards expect shells not to print such messages.  This
+exception applies to any program that serves as a shell and that is
+based primarily on Bash as opposed to other GNU software.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.am b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.am
new file mode 100644
index 0000000..9ed678b
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.am
@@ -0,0 +1,46 @@
+bin_PROGRAMS = ffsb #ffsb_test
+ffsb_SOURCES = \
+	fileops.c \
+	rand.c \
+	config.h \
+	fileops.h \
+	ffsb.h \
+	rand.h \
+	main.c \
+	fh.h \
+	fh.c \
+	filelist.c \
+	filelist.h \
+	metaops.c \
+	metaops.h \
+	rwlock.h \
+	rwlock.c \
+	cirlist.c \
+	cirlist.h \
+	rbt.c \
+	rbt.h \
+	ffsb_tg.h \
+	ffsb_tg.c \
+	ffsb_fs.h \
+	ffsb_fs.c \
+	ffsb_thread.c \
+	ffsb_thread.h \
+	ffsb_op.h \
+	ffsb_op.c \
+	util.h \
+	util.c \
+	parser.c \
+	parser.h \
+	ffsb_fc.c \
+	ffsb_stats.c \
+	list.c
+
+#ffsb_test_SOURCES = config.h fileops.h ffsb.h rand.h fh.h filelist.h metaops.h rwlock.h cirlist.h rbt.h ffsb_tg.h ffsb_fs.h ffsb_thread.h ffsb_op.h util.h parser.c parser.h ffsb_test.c
+
+EXTRA_DIST = *.txt *.tex
+
+AM_CFLAGS = -D_GNU_SOURCE
+
+#CFLAGS += -Wall -Werror -g -Wconversion -ansi
+#LDFLAGS += -lefence
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.in b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.in
new file mode 100644
index 0000000..131dd5f
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/Makefile.in
@@ -0,0 +1,628 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = ffsb$(EXEEXT)
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+	config.guess config.sub depcomp install-sh missing \
+	mkinstalldirs
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ffsb_OBJECTS = fileops.$(OBJEXT) rand.$(OBJEXT) main.$(OBJEXT) \
+	fh.$(OBJEXT) filelist.$(OBJEXT) metaops.$(OBJEXT) \
+	rwlock.$(OBJEXT) cirlist.$(OBJEXT) rbt.$(OBJEXT) \
+	ffsb_tg.$(OBJEXT) ffsb_fs.$(OBJEXT) ffsb_thread.$(OBJEXT) \
+	ffsb_op.$(OBJEXT) util.$(OBJEXT) parser.$(OBJEXT) \
+	ffsb_fc.$(OBJEXT) ffsb_stats.$(OBJEXT) list.$(OBJEXT)
+ffsb_OBJECTS = $(am_ffsb_OBJECTS)
+ffsb_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ffsb_SOURCES)
+DIST_SOURCES = $(ffsb_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ffsb_SOURCES = \
+	fileops.c \
+	rand.c \
+	config.h \
+	fileops.h \
+	ffsb.h \
+	rand.h \
+	main.c \
+	fh.h \
+	fh.c \
+	filelist.c \
+	filelist.h \
+	metaops.c \
+	metaops.h \
+	rwlock.h \
+	rwlock.c \
+	cirlist.c \
+	cirlist.h \
+	rbt.c \
+	rbt.h \
+	ffsb_tg.h \
+	ffsb_tg.c \
+	ffsb_fs.h \
+	ffsb_fs.c \
+	ffsb_thread.c \
+	ffsb_thread.h \
+	ffsb_op.h \
+	ffsb_op.c \
+	util.h \
+	util.c \
+	parser.c \
+	parser.h \
+	ffsb_fc.c \
+	ffsb_stats.c \
+	list.c
+
+
+#ffsb_test_SOURCES = config.h fileops.h ffsb.h rand.h fh.h filelist.h metaops.h rwlock.h cirlist.h rbt.h ffsb_tg.h ffsb_fs.h ffsb_thread.h ffsb_op.h util.h parser.c parser.h ffsb_test.c
+EXTRA_DIST = *.txt *.tex
+AM_CFLAGS = -D_GNU_SOURCE
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh:
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+	@if test ! -f $@; then \
+	  rm -f stamp-h1; \
+	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+	else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in:  $(am__configure_deps)
+	cd $(top_srcdir) && $(AUTOHEADER)
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+ffsb$(EXEEXT): $(ffsb_OBJECTS) $(ffsb_DEPENDENCIES)
+	@rm -f ffsb$(EXEEXT)
+	$(LINK) $(ffsb_OBJECTS) $(ffsb_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cirlist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_fc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_fs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_op.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_stats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_tg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ffsb_thread.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fh.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filelist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileops.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metaops.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rand.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rbt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rwlock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	here=`pwd`; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	    $$tags $$unique; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	tags=; \
+	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+	unique=`for i in $$list; do \
+	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+	  done | \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$tags$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$tags $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && cd $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d $(distdir) || mkdir $(distdir)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r $(distdir)
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && cd $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@cd $(distuninstallcheck_dir) \
+	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) config.h
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
+	clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
+	dist-gzip dist-lzma dist-shar dist-tarZ dist-zip distcheck \
+	distclean distclean-compile distclean-generic distclean-hdr \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-binPROGRAMS
+
+
+#CFLAGS += -Wall -Werror -g -Wconversion -ansi
+#LDFLAGS += -lefence
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/README b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/README
new file mode 100644
index 0000000..746f0f5
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/README
@@ -0,0 +1,413 @@
+Introduction:
+
+The Flexible Filesystem Benchmark (FFSB) is a filesystem performance
+measurement tool.  It is a multi-threaded application (using
+pthreads), written entirely in C with cross-platform portability in
+mind.  It differs from other filesystem benchmarks in that the user
+may supply a profile to create custom workloads, while most other
+filesystem benchmarks use a fixed set of workloads.
+
+As of version 5.1, it supports seven different basic operations, support
+for multiple groups of threads with different operation mixtures,
+support for operation across multiple filesystems, and support for
+filesystem aging prior to benchmarking.
+
+
+Differences from version 4.0 and older:
+
+Version 5.0 and above represent almost a total re-write and many
+things have changed.  In version 5.0 and above FFSB moved to a
+time-regulated run versus doing a set number of different operations
+and timing the whole thing.  This is primarily to better deal with the
+use of multiple threadgroups which would otherwise not be synchronized
+at termination time.
+
+Additionally, the FFSB configuration file format has changed in
+version 5.0, although we do support old-style configuration files
+along with a run-time passed on the command line.  In this mode,
+version 5.0 and above ignores the iterations parameter, and simply
+uses the time specified on the command line.
+
+Behaviorally, most of the old operations are the same -- sequential
+reads and sequential writes work as they did before.  One change in
+version 5.0 is the skip-read behavior of reading then seeking forward
+a fixed amount then reading again is removed, we now support fully
+randomized reads and writes from random offsets within the file.
+
+Version 4.0 didn't support overwrites (only appends) so we interpret
+writes in old config files to be append operations.
+
+On Linux, CPU utilization information will only be accurate for
+systems using NPTL, older Linuxthreads systems will probably only see
+zeros for CPU utilization because Linuxthreads is non-compliant to
+POSIX. Version 4.0 and older could be recompiled to work on
+Linuxthreads, but in 5.0 and later we no longer support this.
+
+We no longer support the "outputfile" on the command line.
+
+One should simply use tee or similar to capture the output.  FFSB
+unbuffers standard out for this purpose, and errors are sent on
+standard error.
+
+Global options:
+
+There are eight valid global options placed at the beginning of the
+profile.  Three of them are required: num_filesystems (number of
+filesystems), num_threadgroups (number of threadgroups), and time
+(running time of the benchmark).  The other five options are:
+
+directio   - each call to open will be made using O_DIRECT
+alignio    - aligns all block operations for random reads and writes
+             on 4k boundaries.
+bufferedio - currently ignorred: it is intended to use libc
+             fread,rwrite, instead of just unix read and write calls
+verbose    - currently ignored
+
+callout    - calls and external command and waits for its termination
+	     before FFSB begins the benchmark phase.
+	     This is useful for synchronizing distributed clients,
+	     starting profilers, etc.
+
+They must be specified in the above order (num_filesystems,
+num_threadgroups, time, directio, alignio, bufferedio, verbose,
+callout).
+
+
+
+Filesystems:
+
+Filesystems are specified to FFSB in the form of a directory.  FFSB
+assumes that the filesystem is mounted at this directory and will not
+do any verification of this fact beyond ensuring it can read/write to
+the location.  So be careful to ensure something with enough space to
+handle the dataset is in fact mounted at the specified location.
+
+In the filesystem clause of the profile, one may set the starting
+number of files and directories as well as a minimum and maximum
+filesize for the filesystem.  One may also specify the blocksize
+used for creating the files separately in the filesystem clause.
+
+Also, if a filesystem is to be aged, a special threadgroup clause may
+be embedded in a filesystem clause to specify the operation mixture
+and number of threads used to age the filesystem.  This threadgroup is
+run until filesystem utilization reaches the specified amount.
+
+Inheritance --  if you are using multiple filesystems, all attributes
+except the location should be inherited from the previous filesystem.
+This is done to make it easier to add groups of similar filesystems.
+In this case, only the location is required in the filesystem clause.
+
+As of version 5.1, filesystem re-use is supported if a given
+filesystem hasn't been modified beyond it's orginal specifications
+(number of files and directories is correct, and file sizes are within
+specifications).  This can be a huge time saver if one wishes to do
+multiple runs on the same data-set without altering it during a run,
+because the fileset doesn't need to be recreated before each run.
+
+To do this, specify "reuse=1" in the filesystem clause, and FFSB will
+verify the fileset first, and if it checks out it will use it.
+Otherwise, it will remove everything and re-create the filesets for
+that filesystem.
+
+Threadgroups:
+
+An arbitrary number of threadgroups with differing numbers of threads
+and operation mixes can be specified.  The operations are specified
+using a weighting for each operation, if an operation isn't specified
+it's weighting is assumed to be zero (not used).
+
+"Think-time" for a threadgroup may also be specified in millisecond
+amounts using the "op_delay" parameter, where every thread will wait
+for the specified amount between each operation.
+
+Operations:
+
+All operations begin by randomly selecting a filesystem from the list
+of filesystems specified in the profile.  The distribution aims to be
+uniform across all filesystems.
+
+
+The seven operations are:
+
+reads  - read() calls with an overall amount and a blocksize
+         operates on existing files.  Care must be taken to ensure
+         that the read amount is smaller than the size of any possible
+         file.
+
+	 If random_read is specified, then the each individual blocks
+         will be read starting from a random point with the file, and
+         this will continune until the entire amount specifed has been
+         read.  This offset of each random block will be totally
+         random to the byte level, unless the "alignio" global parameter
+         is on, and then the reads will be 4096 byte aligned.  This is
+         generally recommended.
+
+
+readall - Very similar to read above, except it doesn't take an
+          amount; it simply reads the entire file sequentially using the
+          read_blocksize.   This is useful for situations where
+	  different filesystems have differently sized files, and sequential
+	  read patterns across all filesystems are desired.
+
+writes - write() calls with an overall amount and blocksize
+         this is an overwrite operation and will not enlarge an existing
+         file, again one must be careful not to specify a write amount
+         that is larger than any possible file in the data set.
+
+	 If random_write is specified, then the each individual blocks
+         will be written starting from a random point with the file, and
+         this will continune until the entire amount specifed has been
+         written out.  This offset of each random block will be totally
+         random to the byte level, unless the "alignio" global parameter
+         is on, and then the writes will be 4096 byte aligned.  This
+         is generally recommended.
+
+	 If the fsync_flag parameter for the threadgroup is non-zero,
+	 then after all of the write calls are finished, fsync() will
+	 be called on the file descriptor before the file is closed.
+
+
+creates - creates a file using open() call and determines the size
+          randomly between on the constraints (min_filesize and
+          max_filesize) for the selected filesystem. Write operations will
+          be done using the same blocksize as is specified for the
+          write operation.
+deletes - calls unlink() on a filename and removes it from the
+          internal data-structures.  One must be careful to ensure
+          there are enough files to delete at all times or else the benchmark
+          will terminate.
+appends - calls write() using the append flag with an overall amount
+          and a blocksize to be appended onto a randomly chosen file.
+metas   - this is actually a mix of several different directory
+          operations.  Each "meta" operation consists of two directory
+          creates, one directory remove, and a directory rename.
+          These operations are all carried out separately from the
+          other 5 operations.
+
+Operation accounting:
+
+Each operation which uses a blocksize counts each read/write of a
+blocksize as an operation (reads,writes,creates, and appends) whereas
+deletes and metas are considered single operations.
+
+Running the benchmark:
+
+There are three phases to running the benchmark, aging, fileset
+creates, and the benchmark phase.
+
+The create phase is carried out across all filesystems simultanously
+with one dedicated thread per filesystem.
+
+After the create phase, sync() is called to ensure all dirty data gets
+written out before the benchmark phase begins, and sync() is again
+called at the end of the benchmark phase.  The time in sync() at the
+end of the benchmark phase is counted as part of the benchmark phase.
+
+Caveats/Holes/Bugs:
+
+Aging and aging across multiple filesystems simultaneously hasn't been tested
+very much.
+
+If *any* i/o operation or system call/libc call fails, the benchmark
+will terminate immediately.
+
+The parser doesn't handle mal-formed or incorrect profiles very well
+(or at all).
+
+The parser doesn't check to make sure all of the appropriate options
+have been specified.  For example, if writes are specified in a
+threadgroup but write_blocksize isn't specified, the parse won't catch
+it, but the benchmark run will fail later on.
+
+
+Configuration Files (new style):
+
+New Style Configuration allows for arbitrary newlines between lines,
+and comments using '#' at the start of a line.  Also it allows tabs,
+whitespace before and after configuration parameters.
+
+The new style configuration file is broken up into three main parts:
+
+global parameters, filesystems, and threadgroups
+
+The sections must be in the above order.
+
+Global parameters:
+
+Global Paramters are described above, the first three are always
+required. Example:
+
+----------
+
+num_filesystems=1
+num_threadgroups=1
+time=30 		# time is in seconds
+
+directio=0 		# don't use direct io
+alignio=1  		# align random IOs to 4k
+bufferedio=0		# this does nothing right now
+verbose=0		# this does nothing right now
+
+			# calls and external command and waits
+			# everything until the newline is taken
+			# so you can have abritrary parmeters
+callout=synchronize.sh myhostname
+
+---------
+
+All of these must appear in this order, though you can leave out the
+optional ones.
+
+Filesystems:
+
+Filesystems describe differnt logical sets of files residing in
+different directorys.  There is no strict requirement that they
+actually be on different filesystems, only that the directory
+specified already exists.
+
+Filesystems are specified by a clause with a filesystem number like
+this:
+
+[filesystem0]
+	location=/mnt/testing/
+	num_files=10
+	num_dirs=1
+	max_filesize=4096
+	min_filesize=4096
+[end0]
+
+
+The clause must always begin with [filesystemX] and end with [endX]
+where X is the number of that filesystem.
+
+You should start wiht X = 0, and increment by one for each following
+filesystem.  If they are out of order, things will likely break.
+
+The required information for each filesystem is: location, num_files,
+num_dirs, max_filesize, and min_filesize.  Beyond those the following
+four options are supported:
+
+
+
+reuse=1 # check the filesystem to see if it is reusable
+
+	# filesystem aging, three components required
+	# takes agefs=1 to turn it on
+	# then a valid threadgroup specification
+	# then a desired utilization percentage
+
+agefs=1 # age the filesystem according to the following threadgroup
+	[threadgroup0]
+		num_threads=10
+		write_size=40960
+		write_blocksize=4096
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+desired_util=0.20	# In this case, age until the fs is 20% full
+
+create_blocksize=4096   # specify the blocksize to write()
+		        # for creating the fileset, defaults to 4096
+
+age_blocksize=4096      # specify the blocksize to write() for aging
+
+
+Also, to allow lazy people to use lots of filesystems, we support
+filesystem inheritance, which simply copies all options but the
+location from the previous filesystem clause if nothing is specified.
+Obviously, this doesn't work for filesystem0. (May not work for aging
+either?)
+
+Full blown filesystem clause example:
+
+----
+
+[filesystem0]
+
+	# required parts
+
+	location=/home/sonny/tmp
+	num_files=100
+	num_dirs=100
+	max_filesize=65536
+	min_filesize=4096
+
+	# aging part
+	agefs=0
+	[threadgroup0]
+		num_threads=10
+		write_size=40960
+		write_blocksize=4096
+		create_weight=10
+		append_weight=10
+		delete_weight=1
+	[end0]
+		desired_util=0.02	# age until 2% full
+
+	# other optional commands
+
+	create_blocksize=1024		# use a small create blocksize
+	age_blocksize=1024		# and smaller age create blocksize
+	reuse=0	                        # don't reuse it
+[end0]
+
+
+
+--
+
+Threadgroups:
+
+Threadgropus are very similar to filesystems in that any number of
+them can be specified in clauses, and they must be in order starting
+with threadgroup0.
+
+Example:
+
+---
+
+[threadgroup0]
+	num_threads=32
+	read_weight=4
+	append_weight=1
+
+	write_size=4096
+	write_blocksize=4096
+
+	read_size=4096
+	read_blocksize=4096
+[end0]
+
+---
+
+In a threadgroup clause, num_threads is required and must be at least
+1.  Then, at least one operation must be given a weight greater than 0
+to be a valid threadgroup.  Operations can be given a weighting of 0,
+and in this case they are ignored.
+
+Certain operations will also require other commands, for example, if
+read_weight is greater than zero, then one must also include a
+read_size and a read_blocksize.  Here's the table of requirements and
+options:
+
+
+Operation		Requirements			Options
+--			--				--
+read_weight		read_size, read_blocksize	read_random
+readall_weight		read_blocksize			none
+write_weight		write_size, write_blocksize	write_random,fsync_file
+create_weight		write_blocksize or create_blocksize	none
+append_weight		write_blocksize, write_size	none
+delete_weight		none				none
+meta_weight		none				none
+
+
+
+Other threadgroup options:
+
+op_delay=10  # specify a wait between operations in milli-seconds
+
+bindfs=3     # This allows you to restrict a threadgroup's operation
+             # to a specific filesystem number.  Currently only
+	     # binding to one specific filesystem is supported
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/aclocal.m4 b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/aclocal.m4
new file mode 100644
index 0000000..19b0c2d
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/aclocal.m4
@@ -0,0 +1,880 @@
+# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(AC_AUTOCONF_VERSION, [2.61],,
+[m4_warning([this file was generated for autoconf 2.61.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.10.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 13
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.60])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+				[_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                  [_AM_DEPENDENCIES(OBJC)],
+                  [define([AC_PROG_OBJC],
+                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.c
new file mode 100644
index 0000000..799ae44
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.c
@@ -0,0 +1,107 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdlib.h>
+#include <assert.h>
+
+#include "cirlist.h"
+#include "util.h"
+
+
+void init_cirlist(struct cirlist *cl)
+{
+	cl->count = 0;
+	cl->head  = NULL;
+}
+
+int cl_empty(struct cirlist *cl)
+{
+	return !(cl->count);
+}
+
+void cl_insert_tail(struct cirlist *cl , cldatatype object)
+{
+	struct cnode *new = ffsb_malloc(sizeof(struct cnode));
+	new->obj = object;
+	if (cl->count == 0) {
+		assert(cl->head == NULL);
+		cl->head = new;
+		cl->head->next = cl->head;
+		cl->head->prev = cl->head;
+		cl->count = 1;
+	} else {
+		if (cl->count == 1) {
+			assert(cl->head->next == cl->head);
+			assert(cl->head->prev == cl->head);
+			cl->head->next = new;
+			cl->head->prev = new;
+			new->next = cl->head;
+			new->prev = cl->head;
+		} else {
+			assert(cl->head->next != cl->head);
+			assert(cl->head->prev != cl->head);
+
+			new->next = cl->head;
+			new->prev = (cl->head)->prev;
+			cl->head->prev->next = new;
+			cl->head->prev = new;
+		}
+		cl->count++;
+	}
+}
+
+cldatatype cl_remove_head(struct cirlist *cl)
+{
+	struct cnode *oldhead = NULL;
+	struct cnode *newhead = NULL;
+	cldatatype ret = NULL;
+
+	if (cl->count == 0) {
+		assert(cl->head == NULL);
+		return NULL;
+	}
+	if (cl->count == 1) {
+		assert(cl->head->next == cl->head);
+		assert(cl->head->prev == cl->head);
+		oldhead = cl->head;
+		cl->head = NULL;
+		cl->count = 0;
+	} else if (cl->count == 2) {
+		oldhead = cl->head;
+		newhead = oldhead->next;
+		newhead->next = newhead;
+		newhead->prev = newhead;
+		cl->head = newhead;
+		cl->count = 1;
+	} else {
+		assert(cl->head->next != cl->head);
+		assert(cl->head->prev != cl->head);
+		oldhead = cl->head;
+		newhead = oldhead->next;
+		newhead->prev = oldhead->prev;
+		newhead->prev->next = newhead;
+		cl->head = newhead;
+		cl->count--;
+	}
+	ret = oldhead->obj;
+	oldhead->obj = (void *)(-1);
+	oldhead->next = (void *)(-1);
+	oldhead->prev = (void *)(-1);
+	free(oldhead);
+
+	return ret;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.h
new file mode 100644
index 0000000..565578c
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/cirlist.h
@@ -0,0 +1,41 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _CIRLIST_H
+#define _CIRLIST_H
+
+#include "filelist.h"
+
+typedef struct ffsb_file *cldatatype;
+
+struct cnode {
+	cldatatype obj;
+	struct cnode *next;
+	struct cnode *prev;
+};
+
+struct cirlist {
+	int count;
+	struct cnode *head;
+};
+
+void init_cirlist(struct cirlist *cl);
+int cl_empty(struct cirlist *cl);
+void cl_insert_tail(struct cirlist *cl , cldatatype object);
+cldatatype cl_remove_head(struct cirlist *cl);
+
+#endif /* _CIRLIST_H */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.guess b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.guess
new file mode 100755
index 0000000..14990d1
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.guess
@@ -0,0 +1,1450 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-02-16'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    amd64:OpenBSD:*:*)
+	echo x86_64-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    amiga:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    arc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    cats:OpenBSD:*:*)
+	echo arm-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    macppc:OpenBSD:*:*)
+	echo powerpc-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+	echo m88k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+	echo powerpc-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pegasos:OpenBSD:*:*)
+	echo powerpc-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    pmax:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sgi:OpenBSD:*:*)
+	echo mipseb-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+	echo mipsel-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit 0 ;;
+    macppc:MirBSD:*:*)
+	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+	exit 0 ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	if test $UNAME_RELEASE = "V4.0"; then
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+	fi
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit 0 ;;
+    Alpha*:OpenVMS:*:*)
+	echo alpha-hp-vms
+	exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit 0 ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit 0 ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit 0 ;;
+    DRS?6000:UNIX_SV:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7 && exit 0 ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c \
+	  && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && exit 0
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit 0 ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit 0 ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+              	{
+		case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+		case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+		case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+              	    switch (bits)
+              		{
+              		case 64: puts ("hppa2.0w"); break;
+              		case 32: puts ("hppa2.0n"); break;
+              		default: puts ("hppa2.0"); break;
+              		} break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+              	    puts ("hppa2.0"); break;
+              #endif
+              	default: puts ("hppa1.0"); break;
+              	}
+                  exit (0);
+              }
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    # avoid double evaluation of $set_cc_for_build
+	    test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    *:UNICOS/mp:*:*)
+	echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	# Determine whether the default compiler uses glibc.
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#if __GLIBC__ >= 2
+	LIBC=gnu
+	#else
+	LIBC=
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+	# GNU/KFreeBSD systems have a "k" prefix to indicate we are using
+	# FreeBSD's kernel, but not the complete OS.
+	case ${LIBC} in gnu) kernel_only='k' ;; esac
+	echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit 0 ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit 0 ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit 0 ;;
+    x86:Interix*:[34]*)
+	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+	exit 0 ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit 0 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit 0 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us. cd to the root directory to prevent
+	# problems with other programs or directories called `ld' in the path.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#ifdef __INTEL_COMPILER
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit 0 ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit 0 ;;
+	i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit 0 ;;
+    i*86:*:5:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit 0 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+	echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit 0 ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit 0 ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit 0 ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit 0 ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit 0 ;;
+    *:Darwin:*:*)
+	case `uname -p` in
+	    *86) UNAME_PROCESSOR=i686 ;;
+	    powerpc) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit 0 ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit 0 ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.h.in b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.h.in
new file mode 100644
index 0000000..8e1aa84
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.h.in
@@ -0,0 +1,130 @@
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fseeko64' function. */
+#undef HAVE_FSEEKO64
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `m' library (-lm). */
+#undef HAVE_LIBM
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `lrand48_r' function. */
+#undef HAVE_LRAND48_R
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mkdir' function. */
+#undef HAVE_MKDIR
+
+/* Define to 1 if you have the `open64' function. */
+#undef HAVE_OPEN64
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the `srand48_r' function. */
+#undef HAVE_SRAND48_R
+
+/* Define to 1 if you have the `stat64' function. */
+#undef HAVE_STAT64
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `system' function. */
+#undef HAVE_SYSTEM
+
+/* Define to 1 if you have the <sys/limits.h> header file. */
+#undef HAVE_SYS_LIMITS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#undef HAVE_SYS_VFS_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if the C compiler supports function prototypes. */
+#undef PROTOTYPES
+
+/* Define to 1 if the `setvbuf' function takes the buffering type as its
+   second argument and the buffer pointer as the third, as on System V before
+   release 3. */
+#undef SETVBUF_REVERSED
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+
+/* Define like PROTOTYPES; this can be used by system headers. */
+#undef __PROTOTYPES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.sub b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.sub
new file mode 100755
index 0000000..d2e3557
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/config.sub
@@ -0,0 +1,1545 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2004-02-16'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32r | m68000 | m68k | m88k | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| msp430 \
+	| ns16k | ns32k \
+	| openrisc | or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+	| strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* \
+	| bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32r-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| msp430-* \
+	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+	| xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	mmix*)
+		basic_machine=mmix-knuth
+		os=-mmixware
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nv1)
+		basic_machine=nv1-cray
+		os=-unicosmp
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	or32 | or32-*)
+		basic_machine=or32-unknown
+		os=-coff
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+		;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparc | sparcv9 | sparcv9b)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure
new file mode 100755
index 0000000..12d5202
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure
@@ -0,0 +1,7000 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.61.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes && 	 (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+	   done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+	 # Try only shells that exist, to save several forks.
+	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		{ ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+	       as_have_required=yes
+	       if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="main.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+CPP
+GREP
+EGREP
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)	ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$0" : 'X\(//\)[^/]' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+			  [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+			  [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+configure
+generated by GNU Autoconf 2.61
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+	"$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+	ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.10'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	    break 3
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+if test -z "$MKDIR_P"; then
+  if test "${ac_cv_path_mkdir+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+done
+IFS=$as_save_IFS
+
+fi
+
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    test -d ./--version && rmdir ./--version
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+echo "${ECHO_T}$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=ffsb
+ VERSION=6.0-RC2
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+{ echo "$as_me:$LINENO: checking for AIX" >&5
+echo $ECHO_N "checking for AIX... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef _AIX
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+cat >>confdefs.h <<\_ACEOF
+#define _ALL_SOURCE 1
+_ACEOF
+
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+rm -f conftest*
+
+
+
+case "${host}" in
+  *aix*)
+    CFLAGS="${CFLAGS} -D_THREAD_SAFE"
+    ;;
+  *linux*)
+    CFLAGS="${CFLAGS} -D_REENTRANT"
+    ;;
+  *)
+    echo "detected unknown platform : ${host} : compiles may fail"
+    CFLAGS="${CFLAGS} -D_REENTRANT"
+    ;;
+esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+
+{ echo "$as_me:$LINENO: checking for main in -lm" >&5
+echo $ECHO_N "checking for main in -lm... $ECHO_C" >&6; }
+if test "${ac_cv_lib_m_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+return main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_m_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_m_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_m_main" >&5
+echo "${ECHO_T}$ac_cv_lib_m_main" >&6; }
+if test $ac_cv_lib_m_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+  LIBS="-lm $LIBS"
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for main in -lpthread" >&5
+echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6; }
+if test "${ac_cv_lib_pthread_main+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+int
+main ()
+{
+return main ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  ac_cv_lib_pthread_main=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_lib_pthread_main=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5
+echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6; }
+if test $ac_cv_lib_pthread_main = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6; }
+if test "${ac_cv_header_sys_wait_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+  int s;
+  wait (&s);
+  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_sys_wait_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_header_sys_wait_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SYS_WAIT_H 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+for ac_header in pthread.h fcntl.h limits.h stdint.h sys/time.h unistd.h sys/vfs.h sys/limits.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6; }
+if test "${ac_cv_header_time+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_header_time=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_header_time=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for function prototypes" >&5
+echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6; }
+if test "$ac_cv_prog_cc_c89" != no; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define PROTOTYPES 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define __PROTOTYPES 1
+_ACEOF
+
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+{ echo "$as_me:$LINENO: checking whether setvbuf arguments are reversed" >&5
+echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6; }
+if test "${ac_cv_func_setvbuf_reversed+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_func_setvbuf_reversed=no
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+#	  ifdef PROTOTYPES
+	   int (setvbuf) (FILE *, int, char *, size_t);
+#	  endif
+int
+main ()
+{
+char buf; return setvbuf (stdout, _IOLBF, &buf, 1);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+#	     ifdef PROTOTYPES
+	      int (setvbuf) (FILE *, int, char *, size_t);
+#	     endif
+int
+main ()
+{
+char buf; return setvbuf (stdout, &buf, _IOLBF, 1);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  # It compiles and links either way, so it must not be declared
+	 # with a prototype and most likely this is a K&R C compiler.
+	 # Try running it.
+	 if test "$cross_compiling" = yes; then
+  : # Assume setvbuf is not reversed when cross-compiling.
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+/* This call has the arguments reversed.
+		   A reversed system may check and see that the address of buf
+		   is not _IOLBF, _IONBF, or _IOFBF, and return nonzero.  */
+		char buf;
+		if (setvbuf (stdout, _IOLBF, &buf, 1) != 0)
+		  return 1;
+		putchar ('\r');
+		return 0; /* Non-reversed systems SEGV here.  */
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_setvbuf_reversed=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+	ac_cv_func_setvbuf_reversed=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_setvbuf_reversed" >&5
+echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6; }
+if test $ac_cv_func_setvbuf_reversed = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define SETVBUF_REVERSED 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+
+for ac_func in system gettimeofday mkdir strerror open64 stat64 fseeko64 lrand48_r srand48_r
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+	       { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+ac_config_files="$ac_config_files Makefile"
+
+ac_config_commands="$ac_config_commands default"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in
+  *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+        test -d "$1/.";
+      else
+	case $1 in
+        -*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.61.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+		   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+		   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.61,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+am__isrc!$am__isrc$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+CPP!$CPP$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 88; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[	 ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
+ac_dB='\\)[	 (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+	t rset
+	:rset
+	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
+	t ok
+	d
+	:ok
+	s/[\\&,]/\\&/g
+	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[	 #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
+/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_arg=$ac_file
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # Grep'ing the whole file is not good either: AIX grep has a line
+  # limit of 2048, but all sed's we know have understand at least 4000.
+  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+    "default":C) echo timestamp > stamp-h ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure.in b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure.in
new file mode 100644
index 0000000..9ce49d2
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/configure.in
@@ -0,0 +1,49 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(main.c)
+AM_INIT_AUTOMAKE(ffsb, 6.0-RC2)
+
+AM_CONFIG_HEADER(config.h)
+AC_CANONICAL_HOST
+
+dnl need to define _ALL_SOURCE and _THREAD_SAFE on AIX
+AC_AIX
+
+case "${host}" in
+  *aix*)
+    CFLAGS="${CFLAGS} -D_THREAD_SAFE"
+    ;;
+  *linux*)
+    CFLAGS="${CFLAGS} -D_REENTRANT"
+    ;;
+  *)
+    echo "detected unknown platform : ${host} : compiles may fail"
+    CFLAGS="${CFLAGS} -D_REENTRANT"
+    ;;
+esac
+
+dnl Checks for programs.
+AC_PROG_CC
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lm:
+AC_CHECK_LIB(m, main)
+dnl Replace `main' with a function in -lpthread:
+AC_CHECK_LIB(pthread, main)
+
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS(pthread.h fcntl.h limits.h stdint.h sys/time.h unistd.h sys/vfs.h sys/limits.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_HEADER_TIME
+
+dnl Checks for library functions.
+AC_FUNC_SETVBUF_REVERSED
+AC_CHECK_FUNCS(system gettimeofday mkdir strerror open64 stat64 fseeko64 lrand48_r srand48_r)
+
+AC_SUBST(CFLAGS)
+AC_SUBST(CC)
+AC_OUTPUT(Makefile, echo timestamp > stamp-h)
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/depcomp b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/depcomp
new file mode 100755
index 0000000..aea3d00
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/depcomp
@@ -0,0 +1,472 @@
+#! /bin/sh
+
+# depcomp - compile a program generating dependencies as side-effects
+# Copyright 1999, 2000 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+# `libtool' can also be set to `yes' or `no'.
+
+if test -z "$depfile"; then
+   base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
+   dir=`echo "$object" | sed 's,/.*$,/,'`
+   if test "$dir" = "$object"; then
+      dir=
+   fi
+   # FIXME: should be _deps on DOS.
+   depfile="$dir.deps/$base"
+fi
+
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  This file always lives in the current directory.
+  # Also, the AIX compiler puts `$object:' at the start of each line;
+  # $object doesn't have directory information.
+  stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  outname="$stripped.o"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      tmpdepfile1="$dir.libs/$base.lo.d"
+      tmpdepfile2="$dir.libs/$base.d"
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1="$dir$base.o.d"
+      tmpdepfile2="$dir$base.d"
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   else
+      tmpdepfile="$tmpdepfile2"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a space and a tab in the [].
+      sed -e 's,^.*\.[a-z]*:[ 	]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the proprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/examples/profile_everything b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/examples/profile_everything
new file mode 100644
index 0000000..67972e1
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/examples/profile_everything
@@ -0,0 +1,119 @@
+directio	= 0
+time		= 10
+
+[filesystem]
+	location	= /mnt/test1
+
+	num_dirs	= 100
+
+	size_weight	4k	33
+	size_weight	8k	21
+	size_weight	16k	13
+	size_weight	32k	10
+	size_weight	64k	8
+	size_weight	128k	5
+	size_weight	256k	4
+	size_weight	512k	3
+	size_weight	8m	2
+	size_weight	32m	1
+#	size_weight	1g	1
+
+#	min_filesize	= 4k
+#	max_filesize	= 10m
+
+#	num_files	= 0
+	init_size	= 100m
+#	init_size	= 6GB
+#	init_size	= 1gb
+#	init_util	= 0.002
+
+	agefs		= 0
+	[threadgroup]
+		num_threads	= 10
+		write_size	= 400
+		write_blocksize	= 1024
+		create_weight	= 10
+		append_weight	= 10
+		delete_weight	= 1
+	[end]
+	desired_util	= 0.005
+
+
+[end]
+
+#[filesystem]
+#	location	= /mnt/test1
+#	clone		= /mnt/test2
+#[end]
+
+[threadgroup]
+	num_threads	= 4
+
+#	bindfs		= /mnt/test1
+
+	append_weight		= 1
+	append_fsync_weight	= 1
+	stat_weight		= 1
+#	write_weight		= 1
+#	write_fsync_weight	= 1
+#	read_weight		= 1
+	create_weight		= 1
+	create_fsync_weight	= 1
+	delete_weight		= 1
+	readall_weight		= 1
+	writeall_weight		= 1
+	writeall_fsync_weight	= 1
+	open_close_weight	= 1
+
+	read_random	= 0
+	write_random	= 0
+
+	write_size	= 40k
+	write_blocksize	= 4k
+	read_size	= 40k
+	read_blocksize	= 4k
+
+	op_delay	= 0
+
+	[stats]
+		enable_stats	= 1
+		enable_range	= 0
+
+#		ignore		= close
+#		ignore		= open
+#		ignore		= lseek
+#		ignore		= write
+#		ignore		= read
+
+		msec_range	0.00 0.01
+		msec_range	0.01 0.02
+		msec_range	0.02 0.03
+		msec_range	0.03 0.04
+		msec_range	0.04 0.05
+		msec_range	0.05 0.1
+		msec_range	0.1 0.2
+		msec_range	0.2 0.5
+		msec_range	0.5 1.0
+		msec_range	1.0 2.0
+		msec_range	2.0 3.0
+		msec_range	3.0 4.0
+		msec_range	4.0 5.0
+		msec_range	5.0 10.0
+		msec_range	10.0 10000.0
+	[end]
+[end]
+
+#[threadgroup]
+#	num_threads	= 1
+#
+#	readall_weight  = 0
+#	writeall_weight = 0
+#	createdir_weight = 0
+#
+#	write_size      = 4096
+#	write_blocksize = 4096
+#	read_size       = 4096
+#	read_blocksize  = 4096
+#
+#	op_delay	= 12
+#[end]
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb.h
new file mode 100644
index 0000000..ad9fcad
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb.h
@@ -0,0 +1,105 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_H_
+#define _FFSB_H_
+
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "config.h"
+
+#include "ffsb_op.h"
+#include "ffsb_tg.h"
+#include "ffsb_fs.h"
+
+/*
+ * The main thread wakes up once in so many seconds to check elapsed
+ * time this is a tunable for that sleep interval in seconds
+ */
+
+#define FFSB_TG_WAIT_TIME (1)
+
+#define MARK printf("MARK FUNC: %s() @ %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
+
+struct results {
+	struct rusage before;
+	struct rusage after;
+	double runtime;
+	double cputime;
+	double cpu_before;
+	double cpu_after;
+	double cpu_total;
+};
+
+struct ffsb_tg;
+struct ffsb_fs;
+
+typedef struct profile_config {
+	struct config_options *global;
+	struct container *fs_container;
+	struct container *tg_container;
+} profile_config_t;
+
+typedef struct ffsb_config {
+	unsigned time;
+
+	unsigned num_filesys;
+	unsigned num_threadgroups;
+
+	int num_totalthreads;		/* gets calculated after init() */
+
+	struct ffsb_tg *groups;
+	struct ffsb_fs *filesystems;
+
+	struct profile_config *profile_conf;
+	char *callout;			/* we will try and exec this */
+
+	struct results results;
+} ffsb_config_t;
+
+void init_ffsb_config(ffsb_config_t *fc, unsigned num_fs, unsigned num_tg);
+
+/*
+ * this is kind of like a special case "constructor" which is only
+ * used by fs-aging code to build a fake config for the aging tg
+ */
+void init_ffsb_config_1fs(ffsb_config_t *fc, struct ffsb_fs *fs,
+			   struct ffsb_tg *tg);
+
+void destroy_ffsb_config(ffsb_config_t *fc);
+
+/* getters/setters, parser only should use setters */
+
+void fc_set_time(ffsb_config_t *fc, unsigned time);
+
+void fc_set_num_totalthreads(ffsb_config_t *fc, int num);
+
+/* num is zero-based */
+/* get a particular threadgroup object */
+struct ffsb_tg *fc_get_tg(ffsb_config_t *fc, unsigned num);
+
+/* get a particular filesystem object */
+struct ffsb_fs *fc_get_fs(ffsb_config_t *fc, unsigned num);
+
+void fc_set_callout(ffsb_config_t *fc, char *callout);
+char *fc_get_callout(ffsb_config_t *fc);
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fc.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fc.c
new file mode 100644
index 0000000..99de871
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fc.c
@@ -0,0 +1,112 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+#include <assert.h>
+
+#include "config.h"
+
+#include "ffsb.h"
+#include "util.h"
+#include "parser.h"
+
+void init_ffsb_config(ffsb_config_t *fc, unsigned num_fs, unsigned num_tg)
+{
+	memset(fc, 0, sizeof(ffsb_config_t));
+
+	fc->num_totalthreads = -1;
+	fc->num_threadgroups = num_tg;
+	fc->num_filesys = num_fs;
+
+	fc->groups = ffsb_malloc(sizeof(ffsb_tg_t) * num_tg);
+	fc->filesystems = ffsb_malloc(sizeof(ffsb_fs_t) * num_fs);
+}
+
+void init_ffsb_config_1fs(ffsb_config_t *fc, ffsb_fs_t *fs, ffsb_tg_t *tg)
+{
+	memset(fc, 0, sizeof(*fc));
+
+	fc->num_totalthreads = tg_get_numthreads(tg);
+	fc->num_threadgroups = 1;
+	fc->num_filesys = 1;
+
+	fc->groups = tg;
+	fc->filesystems = fs;
+}
+
+void destroy_ffsb_config(ffsb_config_t *fc)
+{
+	int i;
+	for (i = 0; i < fc->num_filesys; i++)
+		destroy_ffsb_fs(&fc->filesystems[i]);
+
+	for (i = 0; i < fc->num_threadgroups; i++)
+		destroy_ffsb_tg(&fc->groups[i]);
+
+	free(fc->groups);
+	free(fc->filesystems);
+}
+
+void fc_set_time(ffsb_config_t *fc, unsigned time)
+{
+	fc->time = time;
+}
+
+unsigned fc_get_num_filesys(ffsb_config_t *fc)
+{
+	return fc->num_filesys;
+}
+
+
+
+struct ffsb_tg *fc_get_tg(ffsb_config_t *fc, unsigned num)
+{
+	assert(num < fc->num_threadgroups);
+	return &fc->groups[num];
+}
+
+struct ffsb_fs *fc_get_fs(ffsb_config_t *fc, unsigned num)
+{
+	assert(num < fc->num_filesys);
+	return &fc->filesystems[num];
+}
+
+void fc_set_num_totalthreads(ffsb_config_t *fc, int num)
+{
+	assert(num > 0);
+	fc->num_totalthreads = num;
+}
+
+void fc_set_callout(ffsb_config_t *fc, char *callout)
+{
+	if (fc->callout)
+		free(fc->callout);
+	fc->callout = ffsb_strdup(callout);
+}
+
+char *fc_get_callout(ffsb_config_t *fc)
+{
+	return fc->callout;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.c
new file mode 100644
index 0000000..9715406
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.c
@@ -0,0 +1,634 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <fcntl.h>
+
+#include "ffsb_fs.h"
+#include "util.h"
+#include "fh.h"
+
+/* First zero out struct, set num_dirs, and strdups basedir */
+void init_ffsb_fs(ffsb_fs_t *fs, char *basedir, uint32_t num_data_dirs,
+		  uint32_t numstartfiles, unsigned flags)
+{
+	memset(fs, 0, sizeof(ffsb_fs_t));
+	fs->basedir = ffsb_strdup(basedir);
+	fs->num_dirs = num_data_dirs;
+	fs->num_start_files = numstartfiles;
+	fs->flags = flags;
+	fs->create_blocksize = FFSB_FS_DEFAULT_CREATE_BLOCKSIZE;
+	fs->age_blocksize = FFSB_FS_DEFAULT_AGE_BLOCKSIZE;
+	fs->age_fs = 0;
+}
+
+/*
+ * Does not remove files/dirs on disk, only frees up data
+ * structures
+*/
+void destroy_ffsb_fs(ffsb_fs_t *fs)
+{
+	free(fs->basedir);
+	destroy_filelist(&fs->files);
+	destroy_filelist(&fs->fill);
+	destroy_filelist(&fs->meta);
+}
+
+void clone_ffsb_fs(ffsb_fs_t *target, ffsb_fs_t *orig)
+{
+	target->basedir = orig->basedir;
+	target->flags = orig->flags;
+
+	/* !!!! hackish, write a filelist_clone() function later */
+	memcpy(&target->files, &orig->files, sizeof(orig->files));
+	memcpy(&target->fill, &orig->fill, sizeof(orig->fill));
+	memcpy(&target->meta, &orig->meta, sizeof(orig->meta));
+
+	target->num_dirs = orig->num_dirs;
+	target->num_start_files = orig->num_start_files;
+	target->minfilesize = orig->minfilesize;
+	target->maxfilesize = orig->maxfilesize;
+
+	target->start_fsutil = orig->start_fsutil;
+	target->desired_fsutil = orig->desired_fsutil;
+
+	target->age_fs = orig->age_fs;
+	target->num_age_dirs = orig->num_age_dirs;
+	target->aging_tg = orig->aging_tg;
+
+	target->create_blocksize = orig->create_blocksize;
+	target->age_blocksize = orig->age_blocksize;
+
+	memcpy(target->op_data, orig->op_data, sizeof(void *) * FFSB_NUMOPS);
+}
+
+static void add_files(ffsb_fs_t *fs, struct benchfiles *bf, int num,
+		      uint64_t minsize, uint64_t maxsize, unsigned blocksize)
+{
+	struct ffsb_file *cur;
+	int i, fd, condition = 0, has_directio = 0;
+	randdata_t rd;
+	char *buf = ffsb_malloc(blocksize);
+	uint64_t initial_free = getfsutil_size(fs->basedir);
+
+	if (fs_get_directio(fs)) {
+		has_directio = 1;
+		fs_set_directio(fs, 0);
+	}
+
+	assert(blocksize);
+
+	init_random(&rd, 0);
+
+	if (num)
+		condition = num;
+	else if (fs->init_size) {
+		if (getfsutil(fs->basedir) != initial_free ||
+		    fs->init_size > (getfsutil_size(fs->basedir) -
+		    initial_free))
+			condition = 1;
+		else
+			condition = 0;
+	}
+	else if (fs->init_fsutil) {
+		if (fs->init_fsutil > getfsutil(fs->basedir))
+			condition = 1;
+		else
+			condition = 0;
+	}
+
+	while (condition) {
+		uint64_t size;
+		if (fs->num_weights) {
+			int num = 1 + getrandom(&rd, fs->sum_weights);
+			int curop = 0;
+
+			while (fs->size_weights[curop].weight < num) {
+				num -= fs->size_weights[curop].weight;
+				curop++;
+			}
+			size = fs->size_weights[curop].size;
+		}
+		else
+			size = minsize + getllrandom(&rd, maxsize - minsize);
+
+		cur = add_file(bf, size, &rd);
+		fd = fhopencreate(cur->name, NULL, fs);
+		writefile_helper(fd, size, blocksize, buf, NULL, fs);
+		fhclose(fd, NULL, fs);
+		unlock_file_writer(cur);
+
+		if (num)
+			condition--;
+		else if (fs->init_size) {
+			if (fs->init_size > getfsutil_size(fs->basedir) -
+			    initial_free)
+				condition = 1;
+			else
+				condition = 0;
+		}
+		else if (fs->init_fsutil) {
+			if (fs->init_fsutil > getfsutil(fs->basedir))
+				condition = 1;
+			else
+				condition = 0;
+		}
+
+	}
+	free(buf);
+	if (has_directio)
+		fs_set_directio(fs, 1);
+}
+
+static void age_fs(ffsb_fs_t *fs, double utilization);
+static ffsb_fs_t *construct_new_fileset(ffsb_fs_t *fs);
+static ffsb_fs_t *check_existing_fileset(ffsb_fs_t *fs);
+
+void *construct_ffsb_fs(void *data)
+{
+	ffsb_fs_t *fs  = (ffsb_fs_t *)data;
+	ffsb_fs_t *ret = NULL;
+
+	if (fs_get_reuse_fs(fs)) {
+		printf("checking existing fs: %s\n", fs->basedir);
+		ret = check_existing_fileset(fs);
+		if (ret == NULL) {
+			printf("recreating new fileset\n");
+			ret = construct_new_fileset(fs);
+		}
+	} else {
+		printf("creating new fileset %s\n", fs->basedir);
+		ret = construct_new_fileset(fs);
+	}
+	if (ret == NULL) {
+		printf("fs setup on %s failed\n", fs->basedir);
+		exit(1);
+	}
+	return ret;
+}
+
+static int verify_file(struct benchfiles *bf, char *fname, void *fs_ptr)
+{
+	ffsb_fs_t *fs = (ffsb_fs_t *)fs_ptr;
+	uint64_t minsize = fs->minfilesize;
+	uint64_t maxsize = fs->maxfilesize;
+	uint64_t filesize = 0;
+	int fd = 0;
+	DIR *dirptr = NULL;
+
+	/* If it is a directory and it passed the name verification we
+	 * don't need to do anything here
+	 */
+	dirptr = opendir(fname);
+	if (dirptr) {
+		closedir(dirptr);
+		return 0;
+	}
+
+	fd = open(fname, O_RDONLY);
+	/* If we can't open it for read we're done */
+	if (fd < 0) {
+		printf("verify_file: error opening %s for readonly\n", fname);
+		perror(fname);
+		return 1;
+	}
+	close(fd);
+	filesize = ffsb_get_filesize(fname);
+
+	if (filesize < minsize || filesize > maxsize) {
+		printf("size %llu bytes for file %s is invalid\n",
+		       filesize, fname);
+		return 1;
+	}
+
+	return 0;
+}
+
+/* Record the number of files and directorys there are supposed to be
+ * grab (check and build the structures) the regular data fileset then
+ * check to make sure the number of directories and files in that
+ * filelist matches up.  Then grab the meta filelist and verify that
+ * the meta filelist is empty.  Set up the filelist for fill (aging)
+ * and setup the ops for the benchmark.
+*/
+static ffsb_fs_t *check_existing_fileset(ffsb_fs_t *fs)
+{
+	char buf[FILENAME_MAX * 3];
+	int retval = 0;
+	uint32_t num_dirs = fs->num_dirs;
+	uint32_t num_files = fs->num_start_files;
+
+	if (fs->age_fs) {
+		printf("Aging and reusing the fileset are mutually "
+		       "exclusive\n");
+		printf("aborting\n");
+		return NULL;
+	}
+
+	/* Set up bench/age dir */
+	if (FILENAME_MAX <=
+	    snprintf(buf, FILENAME_MAX, "%s/%s", fs->basedir, FILES_BASE)) {
+		printf("pathname \"%s\" is too long, aborting\n", buf);
+		return NULL;
+	}
+
+	/* Make a "dummy" filelist that has numsubdirs set to 0 and
+	 * numstartfiles set to 0
+	 */
+	init_filelist(&fs->files, buf, FILES_BASE, 0, 0);
+
+	retval = grab_old_fileset(&fs->files, buf, verify_file, fs);
+
+	if (retval)
+		return NULL;
+
+	if ((get_listsize(&fs->files) != num_files) ||
+	    (get_numsubdirs(&fs->files) != num_dirs)) {
+		printf("check_existing_fileset: number of files (%u)"
+		       " or directorys (%u) don't match up\n",
+		       get_listsize(&fs->files), get_numsubdirs(&fs->files));
+		destroy_filelist(&fs->files);
+		return NULL;
+	}
+
+	if (FILENAME_MAX <=
+	    snprintf(buf, FILENAME_MAX, "%s/%s", fs->basedir, META_BASE)) {
+		printf("pathname \"%s\" is too long, aborting\n", buf);
+		return NULL;
+	}
+
+	init_filelist(&fs->meta, buf, META_BASE, 0, 1);
+	retval = grab_old_fileset(&fs->meta, buf, verify_file, fs);
+
+	if (retval) {
+		destroy_filelist(&fs->files);
+		return NULL;
+	}
+
+	if ((get_listsize(&fs->meta) != 0) ||
+	    (get_numsubdirs(&fs->meta) != 0)) {
+		printf("check_existing_fileset: meta directory isn't empty\n"
+		       "aborting\n");
+		destroy_filelist(&fs->files);
+		destroy_filelist(&fs->meta);
+		return NULL;
+	}
+
+	/* Even though we won't use it, we still need to be consistent
+	 * here.
+	 */
+	init_filelist(&fs->fill,  buf, AGE_BASE, 0, 0);
+
+	/* Have to do this or everything else could break. */
+	ops_setup_bench(fs);
+
+	return fs;
+}
+
+/*
+ *  clean up fs, "rm -rf data meta"
+ *  record utilization
+ *  set up the dirs: files, meta
+ *  age filesystem
+ *  have ffsb_ops setup their data
+ *  create starting files in files
+ */
+static ffsb_fs_t *construct_new_fileset(ffsb_fs_t *fs)
+{
+	char buf[FILENAME_MAX * 3];
+
+	/* TODO: Convert this quick and dirty rm -rf to a "real"
+	 * programmatic version, that doesn't rely on the rm command.
+	 */
+	if (FILENAME_MAX * 3 <= snprintf(buf, FILENAME_MAX * 3,
+					 "rm -rf %s/data %s/meta",
+					 fs->basedir, fs->basedir)) {
+		printf("pathname too long for command \"%s\"\n", buf);
+		return NULL;
+	}
+
+	if (ffsb_system(buf) < 0) {
+		perror(buf);
+		return NULL;
+	}
+
+	fs->start_fsutil = getfsutil(fs->basedir);
+
+	/* Set up bench/age dir */
+	if (FILENAME_MAX <=
+	    snprintf(buf, FILENAME_MAX, "%s/%s", fs->basedir, FILES_BASE)) {
+		printf("pathname \"%s\" is too long, aborting\n", buf);
+		return NULL;
+	}
+
+	ffsb_mkdir(buf);
+
+	/* Regular files and aging share this directory */
+	init_filelist(&fs->files, buf, FILES_BASE, fs->num_dirs, 1);
+	init_filelist(&fs->fill, buf, AGE_BASE, fs->num_age_dirs, 1);
+
+	/* Set up meta dir */
+	snprintf(buf, FILENAME_MAX, "%s/%s", fs->basedir, META_BASE);
+
+	ffsb_mkdir(buf);
+
+	init_filelist(&fs->meta, buf, META_BASE, 0, 1);
+
+	/* Do aging */
+	if (fs->age_fs)
+		age_fs(fs, fs->desired_fsutil);
+
+	/* Call back into ops, set for benchmark */
+	ops_setup_bench(fs);
+
+	/* Create initial fileset */
+	add_files(fs, &fs->files, fs->num_start_files, fs->minfilesize,
+		  fs->maxfilesize, fs->create_blocksize);
+	return fs;
+}
+
+
+struct poll_data {
+	ffsb_fs_t *fs;
+	double    util;
+};
+
+static int fs_get_util(void *data)
+{
+	struct poll_data *pd = (struct poll_data *) data;
+	double fsutil = getfsutil(pd->fs->basedir);
+
+	if (fsutil >= pd->util)
+		return 1;
+
+	return 0;
+}
+
+static void age_fs(ffsb_fs_t *fs, double utilization)
+{
+	ffsb_barrier_t barrier;
+	pthread_t thread;
+	struct poll_data pdata;
+	ffsb_tg_t *tg = fs_get_aging_tg(fs);
+	tg_run_params_t params;
+	ffsb_config_t fc;
+
+	printf("aging fs %s from %.2lf to %.2lf\n", fs->basedir,
+	       fs->start_fsutil, utilization);
+	ffsb_barrier_init(&barrier, tg_get_numthreads(tg));
+
+	init_ffsb_config_1fs(&fc, fs, tg);
+
+	pdata.fs = fs;
+	pdata.util = utilization;
+
+	params.tg = tg;
+	params.poll_fn = fs_get_util;
+	params.poll_data = &pdata;
+	params.wait_time = 1;
+	params.fc = &fc;
+
+	params.tg_barrier = NULL;
+	params.thread_barrier = &barrier;
+
+	/* Call back into ops, setup for aging */
+	ops_setup_age(fs);
+
+	/* Throw in some files to start off, so there's something */
+	add_files(fs, &fs->fill, 10, 0, 0, fs->age_blocksize);
+
+	pthread_create(&thread, NULL, tg_run, &params);
+	pthread_join(thread, NULL);
+}
+
+void fs_set_create_blocksize(ffsb_fs_t *fs, uint32_t blocksize)
+{
+	fs->create_blocksize = blocksize;
+}
+
+void fs_set_age_blocksize(ffsb_fs_t *fs, uint32_t blocksize)
+{
+	fs->age_blocksize = blocksize;
+}
+
+uint32_t fs_get_create_blocksize(ffsb_fs_t *fs)
+{
+	return fs->create_blocksize;
+}
+
+uint32_t fs_get_age_blocksize(ffsb_fs_t *fs)
+{
+	return fs->age_blocksize;
+}
+
+char *fs_get_basedir(ffsb_fs_t *fs)
+{
+	return fs->basedir;
+}
+
+uint32_t fs_get_numstartfiles(ffsb_fs_t *fs)
+{
+	return fs->num_start_files;
+}
+
+uint32_t fs_get_numdirs(ffsb_fs_t *fs)
+{
+	return fs->num_dirs;
+}
+
+int fs_get_libcio(ffsb_fs_t *fs)
+{
+	return fs->flags & FFSB_FS_LIBCIO;
+}
+
+void fs_set_libcio(ffsb_fs_t *fs, int lio)
+{
+	if (lio)
+		fs->flags |= FFSB_FS_LIBCIO;
+	else
+		fs->flags &= ~0 & ~FFSB_FS_LIBCIO;
+}
+
+int fs_get_directio(ffsb_fs_t *fs)
+{
+	return fs->flags & FFSB_FS_DIRECTIO;
+}
+
+void fs_set_directio(ffsb_fs_t *fs, int dio)
+{
+	if (dio)
+		fs->flags |= FFSB_FS_DIRECTIO;
+	else
+		fs->flags &= ~0 & ~FFSB_FS_DIRECTIO;
+}
+
+int fs_get_alignio(ffsb_fs_t *fs)
+{
+	return fs->flags & FFSB_FS_ALIGNIO4K;
+}
+
+void fs_set_alignio(ffsb_fs_t *fs, int aio)
+{
+	if (aio)
+		fs->flags |= FFSB_FS_ALIGNIO4K;
+	else
+		fs->flags &= ~0 & ~FFSB_FS_ALIGNIO4K;
+}
+
+int fs_get_reuse_fs(ffsb_fs_t *fs)
+{
+	return fs->flags & FFSB_FS_REUSE_FS;
+}
+
+void fs_set_reuse_fs(ffsb_fs_t *fs, int rfs)
+{
+	if (rfs)
+		fs->flags |= FFSB_FS_REUSE_FS;
+	else
+		fs->flags &= ~0 & ~FFSB_FS_REUSE_FS;
+}
+
+struct benchfiles *fs_get_datafiles(ffsb_fs_t *fs)
+{
+	return &fs->files;
+}
+
+struct benchfiles *fs_get_metafiles(ffsb_fs_t *fs)
+{
+	return &fs->meta;
+}
+
+struct benchfiles *fs_get_agefiles(ffsb_fs_t *fs)
+{
+	return &fs->fill;
+}
+
+void fs_set_aging_tg(ffsb_fs_t *fs, struct ffsb_tg *tg, double util)
+{
+	fs->aging_tg = tg;
+	fs->age_fs = 1;
+	fs->desired_fsutil = util;
+}
+
+struct ffsb_tg *fs_get_aging_tg(ffsb_fs_t *fs)
+{
+	return fs->aging_tg;
+}
+
+int fs_get_agefs(ffsb_fs_t *fs)
+{
+	return fs->age_fs;
+}
+
+/* TODO: Implement this!!!*/
+void fs_set_num_age_dirs(ffsb_fs_t *fs, uint32_t numdirs)
+{
+	fs->num_age_dirs = numdirs;
+}
+
+void fs_set_opdata(ffsb_fs_t *fs, void *data, unsigned opnum)
+{
+	fs->op_data[opnum] = data;
+}
+
+void *fs_get_opdata(ffsb_fs_t *fs, unsigned opnum)
+{
+	return fs->op_data[opnum];
+}
+
+void fs_set_min_filesize(ffsb_fs_t *fs, uint64_t size)
+{
+	fs->minfilesize = size;
+}
+
+void fs_set_max_filesize(ffsb_fs_t *fs, uint64_t size)
+{
+	fs->maxfilesize = size;
+}
+
+uint64_t fs_get_min_filesize(ffsb_fs_t *fs)
+{
+	return fs->minfilesize;
+}
+
+uint64_t fs_get_max_filesize(ffsb_fs_t *fs)
+{
+	return fs->maxfilesize;
+}
+
+double fs_get_desired_fsutil(ffsb_fs_t *fs)
+{
+	return fs->desired_fsutil;
+}
+
+void fs_print_config(ffsb_fs_t *fs)
+{
+	char buf[256];
+
+	printf("FileSystem %s\n", fs->basedir);
+	printf("==========\n");
+	printf("\t num_dirs         = %u\n", fs->num_dirs);
+	printf("\t starting files   = %u\n", fs->num_start_files);
+	printf("\t\n");
+	if (fs->num_weights) {
+		int i;
+		printf("\t Fileset weight:\n");
+		for (i = 0; i < fs->num_weights; i++)
+			printf("\t\t %12llu (%6s) -> %u (%.2f\%)\n",
+			       fs->size_weights[i].size,
+			       ffsb_printsize(buf, fs->size_weights[i].size, 256),
+			       fs->size_weights[i].weight,
+			       ((float)fs->size_weights[i].weight /
+				(float)fs->sum_weights) * 100);
+	}
+	else {
+		printf("\t min file size    = %llu\t(%s)\n", fs->minfilesize,
+		       ffsb_printsize(buf, fs->minfilesize, 256));
+		printf("\t max file size    = %llu\t(%s)\n", fs->maxfilesize,
+		       ffsb_printsize(buf, fs->maxfilesize, 256));
+	}
+	printf("\t directio         = %s\n", (fs->flags & FFSB_FS_DIRECTIO) ?
+	       "on" : "off");
+	printf("\t alignedio        = %s\n", (fs->flags & FFSB_FS_ALIGNIO4K) ?
+	       "on" : "off");
+	printf("\t bufferedio       = %s\n", (fs->flags & FFSB_FS_LIBCIO) ?
+	       "on" : "off");
+	printf("\t\n");
+	printf("\t aging is %s\n", (fs->age_fs) ? "on" : "off");
+	printf("\t current utilization = %.2f\%\n", getfsutil(fs->basedir)*100);
+	if (fs->age_fs) {
+		printf("\t desired utilization = %.2lf%\n", fs->desired_fsutil * 100);
+		printf("\t \n");
+		tg_print_config_aging(fs->aging_tg, fs->basedir);
+	}
+	printf("\t\n");
+}
+
+int fs_needs_stats(ffsb_fs_t *fs, syscall_t sys)
+{
+	return (fs != NULL) ? (int)fs->fsd.config : 0;
+}
+
+void fs_add_stat(ffsb_fs_t *fs, syscall_t sys, uint32_t val)
+{
+	if (fs)
+		ffsb_add_data(&fs->fsd, sys, val);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.h
new file mode 100644
index 0000000..7b38104
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_fs.h
@@ -0,0 +1,184 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_FS_H_
+#define _FFSB_FS_H_
+
+#include "filelist.h"
+#include "ffsb_op.h"
+#include "ffsb_tg.h"
+#include "ffsb_stats.h"
+
+/* These are the base names for the different file types on a
+ * filesystem.
+*/
+#define FILES_BASE "data"
+#define META_BASE  "meta"
+#define AGE_BASE   "fill"
+
+struct ffsb_tg;
+
+typedef struct size_weight {
+	uint64_t size;
+	int weight;
+} size_weight_t;
+
+/* A filesystem object
+ * --
+ * represents a filesystem on disk, and maintains access to the different
+ * directories within it.  Currently there are two directories created in
+ * each filesystem: data and meta
+ * "data" contains the aging files and the working set files
+ * "meta" only contains directories for use in the metadata operation
+ *
+ * Aging
+ * This object contains methods for aging the filesystem if needed
+ * a properly set up threadgroup is supplied by the parser which is run
+ * until the filesystem reaches the desired utilization
+ *
+ * Operations
+ * The semantics of a ffsb operation are always such that they occur on
+ * a filesystem, so the filesystem also hold operation specific data as
+ * an opaque type
+ * One example of how this is useful is the aging process, where a different
+ * set of files is operated upon than in the regular benchmark and the
+ * op_data is pointing to the "fill" set rather than the "files" set
+ */
+
+typedef struct ffsb_fs {
+	char *basedir;
+
+	struct benchfiles files;
+	struct benchfiles meta;
+	struct benchfiles fill;
+
+	int flags;
+#define FFSB_FS_DIRECTIO   (1 << 0)
+#define FFSB_FS_ALIGNIO4K  (1 << 1)
+#define FFSB_FS_LIBCIO     (1 << 2)
+#define FFSB_FS_REUSE_FS   (1 << 3)
+
+	/* These pararmeters pertain to files in the files and fill
+	 * dirs.  Meta dir only contains directories, starting with 0.
+	 */
+	uint32_t num_dirs;
+	uint32_t num_start_files;
+	uint64_t minfilesize, maxfilesize;
+	double init_fsutil;
+	uint64_t init_size;
+
+	/* These two parameters specify the blocksize to use for
+	 * writes when creating and aging the fs.
+	 */
+	uint32_t create_blocksize, age_blocksize;
+#define FFSB_FS_DEFAULT_CREATE_BLOCKSIZE 4096
+#define FFSB_FS_DEFAULT_AGE_BLOCKSIZE    4096
+
+	double start_fsutil;
+
+	/* Aging data/parameters */
+	double desired_fsutil;
+	int age_fs;
+	uint32_t num_age_dirs;
+
+	/* Use an ffsb thread group to do the aging work */
+	struct ffsb_tg *aging_tg;
+
+	/* If a particular operation wants to maintain fs-specific
+	 * data, it should use this array.  Naturally, the ops must
+	 * synchonize access to the data for now, they are all just
+	 * putting pointers to a particular benchfiles struct here,
+	 * which is already sync'ed
+	 */
+	void *op_data[FFSB_NUMOPS];
+
+	/* per-fs stats */
+	ffsb_statsc_t fsc;
+	ffsb_statsd_t fsd;
+
+	size_weight_t *size_weights;
+	unsigned num_weights;
+	unsigned sum_weights;
+
+} ffsb_fs_t;
+
+/* Set up the structure, zeros everything out and dups the basedir
+ * string
+ */
+void init_ffsb_fs(ffsb_fs_t *fs, char *basedir, uint32_t num_data_dirs,
+		  uint32_t num_start_files, unsigned flags);
+
+/* Does not remove files/dirs on disk, only frees up data
+ * structures
+ */
+void destroy_ffsb_fs(ffsb_fs_t *fs);
+
+/* Set up the files and such on the disk including aging if requested.
+ * Should call back into each op, which initialize its op_data[]
+ * entry.  Aging is done by starting the aging_tg thread group, and
+ * waiting until the desired utilization is achieved.  It can (and is)
+ * be used with pthread_create().  Parameter should be a ffsb_fs_t * ,
+ * and it will return the same type
+ */
+void *construct_ffsb_fs(void *ffsb_fs_ptr);
+
+/* Shallow clone, original should simply be discarded (not destroyed).
+ * Generally should only be used by parser to write into the config
+ * object
+ */
+void clone_ffsb_fs(ffsb_fs_t *target, ffsb_fs_t *original);
+
+void fs_print_config(ffsb_fs_t *fs);
+
+char *fs_get_basedir(ffsb_fs_t *fs);
+int fs_get_directio(ffsb_fs_t *fs);
+void fs_set_directio(ffsb_fs_t *fs, int dio);
+int fs_get_alignio(ffsb_fs_t *fs);
+void fs_set_alignio(ffsb_fs_t *fs, int aio);
+int fs_get_libcio(ffsb_fs_t *fs);
+void fs_set_libcio(ffsb_fs_t *fs, int lio);
+int fs_get_reuse_fs(ffsb_fs_t *fs);
+void fs_set_reuse_fs(ffsb_fs_t *fs, int rfs);
+
+struct benchfiles *fs_get_datafiles(ffsb_fs_t *fs);
+struct benchfiles *fs_get_metafiles(ffsb_fs_t *fs);
+struct benchfiles *fs_get_agefiles(ffsb_fs_t *fs);
+
+void fs_set_aging_tg(ffsb_fs_t *fs, struct ffsb_tg *, double util);
+struct ffsb_tg *fs_get_aging_tg(ffsb_fs_t *fs);
+int fs_get_agefs(ffsb_fs_t *fs);
+
+void fs_set_opdata(ffsb_fs_t *fs, void *data, unsigned opnum);
+void *fs_get_opdata(ffsb_fs_t *fs, unsigned opnum);
+void fs_set_min_filesize(ffsb_fs_t *fs, uint64_t size);
+void fs_set_max_filesize(ffsb_fs_t *fs, uint64_t size);
+void fs_set_create_blocksize(ffsb_fs_t *fs, uint32_t blocksize);
+void fs_set_age_blocksize(ffsb_fs_t *fs, uint32_t blocksize);
+uint32_t fs_get_create_blocksize(ffsb_fs_t *fs);
+uint32_t fs_get_age_blocksize(ffsb_fs_t *fs);
+uint64_t fs_get_min_filesize(ffsb_fs_t *fs);
+uint64_t fs_get_max_filesize(ffsb_fs_t *fs);
+uint32_t fs_get_numstartfiles(ffsb_fs_t *fs);
+uint32_t fs_get_numdirs(ffsb_fs_t *fs);
+
+double fs_get_desired_fsutil(ffsb_fs_t *fs);
+
+/* For these two, fs == NULL is OK */
+int fs_needs_stats(ffsb_fs_t *fs, syscall_t s);
+void fs_add_stat(ffsb_fs_t *fs, syscall_t sys, uint32_t val);
+
+#endif /* _FFSB_FS_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.c
new file mode 100644
index 0000000..0cae599
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.c
@@ -0,0 +1,178 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "ffsb_op.h"
+#include "fileops.h"
+#include "metaops.h"
+
+ffsb_op_t ffsb_op_list[] =
+{{0, "read", ffsb_readfile, READ, fop_bench, NULL},
+ {1, "readall",	ffsb_readall, READ, fop_bench, NULL},
+ {2, "write", ffsb_writefile, WRITE, fop_bench, NULL},
+ {3, "create", ffsb_createfile, WRITE, fop_bench, fop_age},
+ {4, "append", ffsb_appendfile, WRITE, fop_bench, fop_age},
+ {5, "delete", ffsb_deletefile, NA, fop_bench, fop_age},
+ {6, "metaop", ffsb_metaops, NA, metaops_metadir, NULL},
+ {7, "createdir", ffsb_createdir, NA, fop_bench, NULL},
+ {8, "stat", ffsb_stat, NA, fop_bench, NULL},
+ {9, "writeall", ffsb_writeall, WRITE, fop_bench, NULL},
+ {10, "writeall_fsync", ffsb_writeall_fsync, WRITE, fop_bench, NULL},
+ {11, "open_close", ffsb_open_close, NA, fop_bench, NULL},
+ {12, "write_fsync", ffsb_writefile_fsync, WRITE, fop_bench, NULL},
+ {13, "create_fsync", ffsb_createfile_fsync, WRITE, fop_bench, fop_age},
+ {14, "append_fsync", ffsb_appendfile_fsync, WRITE, fop_bench, fop_age},
+};
+
+void init_ffsb_op_results(ffsb_op_results_t *results)
+{
+	memset(results, 0, sizeof(ffsb_op_results_t));
+}
+
+static int exclusive_op(ffsb_op_results_t *results, unsigned int op_num)
+{
+	int i;
+	int ret = 0;
+	for (i = 0; i < FFSB_NUMOPS ; i++) {
+		if (i == op_num)
+			continue;
+		ret += results->ops[i];
+	}
+
+	if (ret)
+		return 0;
+	return 1;
+}
+
+static void generic_op_print(char *name, unsigned num, double op_pcnt,
+			     double weigth_pcnt, double runtime, char *tput)
+{
+	printf("%20s : %12u\t%10.2lf\t%6.3lf%%\t\t%6.3lf%%\t  %11s\n",
+	       name, num, num/runtime, op_pcnt, weigth_pcnt, tput);
+}
+
+static void print_op_results(unsigned int op_num, ffsb_op_results_t *results,
+			     double runtime, unsigned total_ops,
+			     unsigned total_weight)
+{
+	char buf[256];
+
+	double op_pcnt = 100 * (double)results->ops[op_num] /
+		(double)total_ops;
+	double weight_pcnt = 100 * (double)results->op_weight[op_num] /
+		(double)total_weight;
+	if (ffsb_op_list[op_num].throughput) {
+		ffsb_printsize (buf, results->bytes[op_num] / runtime, 256);
+		sprintf(buf, "%s/sec\0", buf);
+	}
+	else
+		sprintf(buf, "NA\0");
+	generic_op_print(ffsb_op_list[op_num].op_name, results->ops[op_num],
+			 op_pcnt, weight_pcnt, runtime, buf);
+}
+
+#if 0
+static void print_op_throughput(unsigned int op_num, ffsb_op_results_t *results,
+				double runtime)
+{
+	if (ffsb_op_list[op_num].op_exl_print_fn != NULL)
+		ffsb_op_list[op_num].op_exl_print_fn(results, runtime, op_num);
+}
+#endif
+
+void print_results(struct ffsb_op_results *results, double runtime)
+{
+	int i;
+	uint64_t total_ops = 0;
+	uint64_t total_weight = 0;
+	char buf[256];
+
+	for (i = 0; i < FFSB_NUMOPS ; i++) {
+		total_ops += results->ops[i];
+		total_weight += results->op_weight[i];
+	}
+
+	printf("             Op Name   Transactions\t Trans/sec\t% Trans\t    % Op Weight\t   Throughput\n");
+	printf("             =======   ============\t =========\t=======\t    ===========\t   ==========\n");
+	for (i = 0; i < FFSB_NUMOPS ; i++)
+		if (results->ops[i] != 0)
+			print_op_results(i, results, runtime, total_ops,
+					 total_weight);
+	printf("-\n%.2lf Transactions per Second\n\n", (double)total_ops / runtime);
+
+	if (results->write_bytes || results->read_bytes)
+		printf("Throughput Results\n===================\n");
+	if (results->read_bytes) {
+		ffsb_printsize(buf, results->read_bytes / runtime, 256);
+		printf("Read Throughput: %s/sec\n", buf);
+	}
+	if (results->write_bytes) {
+		ffsb_printsize(buf, results->write_bytes / runtime, 256);
+		printf("Write Throughput: %s/sec\n", buf);
+	}
+}
+
+
+char *op_get_name(int opnum)
+{
+	return ffsb_op_list[opnum].op_name;
+}
+
+void ops_setup_bench(ffsb_fs_t *fs)
+{
+	int i;
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		ffsb_op_list[i].op_bench(fs, i);
+}
+
+void ops_setup_age(ffsb_fs_t *fs)
+{
+	int i;
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		if (ffsb_op_list[i].op_age)
+		    ffsb_op_list[i].op_age(fs, i);
+}
+
+int ops_find_op(char *opname)
+{
+	int i;
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		if (!strcmp(opname, ffsb_op_list[i].op_name))
+			return i;
+	return -1;
+}
+
+void add_results(struct ffsb_op_results *target, struct ffsb_op_results *src)
+{
+	int i;
+	target->read_bytes += src->read_bytes;
+	target->write_bytes += src->write_bytes;
+
+	for (i = 0; i < FFSB_NUMOPS; i++) {
+		target->ops[i] += src->ops[i];
+		target->op_weight[i] += src->op_weight[i];
+		target->bytes[i] += src->bytes[i];
+	}
+}
+
+void do_op(struct ffsb_thread *ft, struct ffsb_fs *fs, unsigned op_num)
+{
+	ffsb_op_list[op_num].op_fn(ft, fs, op_num);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.h
new file mode 100644
index 0000000..1b4509b
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_op.h
@@ -0,0 +1,102 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_OP_H_
+#define _FFSB_OP_H_
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <inttypes.h>
+
+struct ffsb_op_results;
+struct ffsb_thread;
+struct ffsb_fs;
+
+#define NA 0x00
+#define READ 0x01
+#define WRITE 0x02
+
+/* This file handles all of the operations FFSB supports.  It has
+ * tight interactions with the filesystem objects, but is otherwise
+ * pretty abstract.
+ */
+
+/* The op callback */
+typedef void (*ffsb_op_fn)(struct ffsb_thread *, struct ffsb_fs *,
+			     unsigned op_num);
+
+/* Operation results printing function */
+typedef void (*ffsb_op_print_fn)(struct ffsb_op_results *, double secs,
+				  unsigned int op_num);
+
+/* Operation specific initialization for a filesystem */
+typedef void (*ffsb_op_fs_fn)(struct ffsb_fs *, unsigned opnum);
+
+typedef struct ffsb_op {
+	unsigned int op_id;
+	char *op_name;
+	ffsb_op_fn op_fn;
+
+	unsigned int throughput;
+	/* The point of these two fields is to determine which set of
+	 * files are being worked on.  Currently either data, meta, or
+	 * aging.  Data and meta are mutually exclusive, so we only
+	 * need two funcs.
+	 */
+	ffsb_op_fs_fn op_bench;
+	ffsb_op_fs_fn op_age;
+} ffsb_op_t;
+
+/* List of all operations, located in ffsb_op.c */
+extern ffsb_op_t ffsb_op_list[];
+
+/* This *must* be updated when a new operation is added or one is
+ * removed several other structures use it for statically sized arrays
+ */
+#define FFSB_NUMOPS (15)
+
+/* Returns index of an op.
+ * Returns -1 if opname isn't found, and its case sensitive :)
+ */
+int ops_find_op(char *opname);
+
+typedef struct ffsb_op_results {
+	/* Count of how many times each op was run */
+	unsigned int ops[FFSB_NUMOPS];
+	unsigned int op_weight[FFSB_NUMOPS];
+	uint64_t bytes[FFSB_NUMOPS];
+
+	uint64_t read_bytes;
+	uint64_t write_bytes;
+} ffsb_op_results_t;
+
+void init_ffsb_op_results(struct ffsb_op_results *);
+void print_results(struct ffsb_op_results *results, double runtime);
+char *op_get_name(int opnum);
+
+/* Setup the ops for the benchmark */
+void ops_setup_bench(struct ffsb_fs *fs);
+
+/* setup the ops for aging the filesystem */
+void ops_setup_age(struct ffsb_fs *fs);
+
+void add_results(struct ffsb_op_results *target, struct ffsb_op_results *src);
+
+/* Run this op, using this thread state, on this filesystem */
+void do_op(struct ffsb_thread *ft, struct ffsb_fs *fs, unsigned op_num);
+
+#endif /* _FFSB_OP_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.c
new file mode 100644
index 0000000..d3e20fd
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.c
@@ -0,0 +1,241 @@
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include "ffsb_stats.h"
+#include "util.h"
+
+char *syscall_names[] = {
+	"open",
+	"read",
+	"write",
+	"create",
+	"lseek",
+	"unlink",
+	"close",
+	"stat",
+};
+
+/* yuck, just for the parser anyway.. */
+int ffsb_stats_str2syscall(char *str, syscall_t *sys)
+{
+	int i;
+	int ret;
+	for (i = 0; i < FFSB_NUM_SYSCALLS; i++) {
+		ret = strncasecmp(syscall_names[i], str,
+				  strlen(syscall_names[i]));
+		/* printf("%s = syscall_names[%d] vs %str ret = %d\n",
+		 * syscall_names[i],i,str,ret);
+		 */
+		if (0 == ret) {
+			*sys = (syscall_t)i; /* ewww */
+			/* printf("matched syscall %s\n",syscall_names[i]); */
+			return 1;
+		}
+	}
+	printf("warning: failed to get match for syscall %s\n", str);
+	return 0;
+}
+
+void  ffsb_statsc_init(ffsb_statsc_t *fsc)
+{
+	fsc->num_buckets = 0;
+	fsc->buckets = NULL;
+	fsc->ignore_stats = 0;
+}
+
+void ffsb_statsc_addbucket(ffsb_statsc_t *fsc, uint32_t min, uint32_t max)
+{
+	struct stat_bucket *temp;
+	fsc->num_buckets++;
+
+	/* printf("ffsb_realloc(): fsc_buckets = %d\n",fsc->num_buckets); */
+	temp = ffsb_realloc(fsc->buckets, sizeof(struct stat_bucket) *
+			    fsc->num_buckets);
+
+	fsc->buckets = temp;
+
+	/* Convert to micro-secs from milli-secs */
+	fsc->buckets[fsc->num_buckets-1].min = min ;
+	fsc->buckets[fsc->num_buckets-1].max = max ;
+}
+
+void ffsb_statsc_destroy(ffsb_statsc_t *fsc)
+{
+	free(fsc->buckets);
+}
+
+void ffsb_statsc_ignore_sys(ffsb_statsc_t *fsc, syscall_t s)
+{
+	/* printf("fsis: oring 0x%x with 0x%x\n",
+	 *      fsc->ignore_stats,
+	 *      (1 << s ) );
+	 */
+	fsc->ignore_stats |= (1 << s);
+}
+
+int fsc_ignore_sys(ffsb_statsc_t *fsc, syscall_t s)
+{
+	return fsc->ignore_stats & (1 << s);
+}
+
+void ffsb_statsd_init(ffsb_statsd_t *fsd, ffsb_statsc_t *fsc)
+{
+	int i;
+	memset(fsd, 0, sizeof(*fsd));
+
+	for (i = 0; i < FFSB_NUM_SYSCALLS; i++) {
+		fsd->totals[i] = 0;
+		fsd->mins[i] = UINT_MAX;
+		fsd->maxs[i] = 0;
+		fsd->buckets[i] = ffsb_malloc(sizeof(uint32_t) *
+					      fsc->num_buckets);
+		assert(fsd->buckets[i] != NULL);
+
+		memset(fsd->buckets[i], 0, sizeof(uint32_t) *
+		       fsc->num_buckets);
+	}
+	fsd->config = fsc;
+}
+
+void ffsb_statsd_destroy(ffsb_statsd_t *fsd)
+{
+	int i ;
+	for (i = 0 ; i < FFSB_NUM_SYSCALLS; i++)
+		free(fsd->buckets[i]);
+}
+
+void ffsb_add_data(ffsb_statsd_t *fsd, syscall_t s, uint32_t value)
+{
+	unsigned num_buckets, i;
+	struct stat_bucket *bucket_defs;
+
+	if (!fsd || fsc_ignore_sys(fsd->config, s))
+		return;
+
+	if (value < fsd->mins[s])
+		fsd->mins[s] = value;
+	if (value > fsd->maxs[s])
+		fsd->maxs[s] = value;
+
+	fsd->counts[s]++;
+	fsd->totals[s] += value;
+
+	if (fsd->config->num_buckets == 0)
+		return;
+
+	num_buckets = fsd->config->num_buckets;
+	bucket_defs = fsd->config->buckets;
+
+	for (i = 0; i < num_buckets; i++) {
+		struct stat_bucket *b = &bucket_defs[i];
+
+		if (value <= b->max && value >= b->min) {
+			fsd->buckets[s][i]++;
+			break;
+		}
+	}
+}
+
+void ffsb_statsc_copy(ffsb_statsc_t *dest, ffsb_statsc_t *src)
+{
+	memcpy(dest, src, sizeof(*src));
+}
+
+void ffsb_statsd_add(ffsb_statsd_t *dest, ffsb_statsd_t *src)
+{
+	int i, j;
+	unsigned num_buckets;
+	if (dest->config != src->config)
+		printf("ffsb_statsd_add: warning configs do not"
+		       "match for data being collected\n");
+
+	num_buckets = dest->config->num_buckets;
+
+	for (i = 0; i < FFSB_NUM_SYSCALLS; i++) {
+		dest->counts[i] += src->counts[i];
+		dest->totals[i] += src->totals[i];
+
+		if (src->mins[i] < dest->mins[i])
+			dest->mins[i] = src->mins[i];
+		if (src->maxs[i] > dest->maxs[i])
+			dest->maxs[i] = src->maxs[i];
+
+		for (j = 0; j < num_buckets; j++)
+			dest->buckets[i][j] += src->buckets[i][j];
+	}
+}
+
+static void print_buckets_helper(ffsb_statsc_t *fsc, uint32_t *buckets)
+{
+	int i;
+	if (fsc->num_buckets == 0) {
+		printf("   -\n");
+		return;
+	}
+	for (i = 0; i < fsc->num_buckets; i++) {
+		struct stat_bucket *sb = &fsc->buckets[i];
+		printf("\t\t msec_range[%d]\t%f - %f : %8u\n",
+		       i, (double)sb->min/1000.0f, (double)sb->max/1000.0f,
+		       buckets[i]);
+	}
+	printf("\n");
+}
+
+void ffsb_statsd_print(ffsb_statsd_t *fsd)
+{
+	int i;
+	printf("\nSystem Call Latency statistics in millisecs\n" "=====\n");
+	printf("\t\tMin\t\tAvg\t\tMax\t\tTotal Calls\n");
+	printf("\t\t========\t========\t========\t============\n");
+	for (i = 0; i < FFSB_NUM_SYSCALLS; i++)
+		if (fsd->counts[i]) {
+			printf("[%7s]\t%05f\t%05lf\t%05f\t%12u\n",
+			       syscall_names[i], (float)fsd->mins[i] / 1000.0f,
+			       (fsd->totals[i] / (1000.0f *
+						  (double)fsd->counts[i])),
+			       (float)fsd->maxs[i] / 1000.0f, fsd->counts[i]);
+			print_buckets_helper(fsd->config, fsd->buckets[i]);
+		}
+}
+
+#if 0 /* Testing */
+
+void *ffsb_malloc(size_t s)
+{
+	void *p = malloc(s);
+	assert(p != NULL);
+	return p;
+}
+
+int main(int arc, char *argv[])
+{
+	ffsb_statsc_t fsc;
+	ffsb_statsd_t fsd;
+	int i ;
+
+	printf("init\n");
+
+	ffsb_statsc_init(&fsc, 10);
+	ffsb_statsc_setbucket(&fsc, 0, 0.0f, 50.0f);
+	ffsb_statsc_setbucket(&fsc, 1, 50.0f, 10000.0f);
+	ffsb_statsc_setbucket(&fsc, 2, 0.1f, 0.2f);
+	ffsb_statsc_setbucket(&fsc, 3, 0.0f, 50.0f);
+	ffsb_statsc_setbucket(&fsc, 4, 50.0f, 10000.0f);
+	ffsb_statsc_setbucket(&fsc, 5, 0.1f, 0.2f);
+	ffsb_statsc_setbucket(&fsc, 6, 0.0f, 50.0f);
+	ffsb_statsc_setbucket(&fsc, 7, 50.0f, 10000.0f);
+	ffsb_statsc_setbucket(&fsc, 8, 0.1f, 0.2f);
+	ffsb_statsc_setbucket(&fsc, 9, 50.0f, 10000.0f);
+	ffsb_statsd_init(&fsd, &fsc);
+
+	printf("test\n");
+	for (i = 0; i < 50000000; i++)
+		ffsb_add_data(&fsd, SYS_READ, (float)i);
+
+	printf("cleanup\n");
+	ffsb_statsd_destroy(&fsd);
+	ffsb_statsc_destroy(&fsc);
+	return 0;
+}
+
+#endif /* Testing */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.h
new file mode 100644
index 0000000..8718eed
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_stats.h
@@ -0,0 +1,109 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2007
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_STATS_H_
+#define _FFSB_STATS_H_
+
+#include <inttypes.h>
+
+/* Latency statistics collection extension.
+ *
+ * For now, we are going to collect latency info on each (most)
+ * syscalls using gettimeofday. Unfortunately, it is the
+ * responsibility of each operation to collect this timing info.  We
+ * try to make this easier by providing a function that does the
+ * timing for supported syscalls.
+ *
+ * We want the ability to collect the average latency for a particular
+ * call, and also to collect latency info for user specified intervals
+ * -- called "buckets"
+ */
+
+struct stat_bucket {
+	uint32_t min;
+	uint32_t max;
+	/* max = 0 indicates uninitialized bucket */
+};
+
+/* These are all the syscalls we currently support */
+typedef enum { SYS_OPEN = 0,
+	       SYS_READ,
+	       SYS_WRITE,
+	       SYS_CREATE,
+	       SYS_LSEEK,
+	       SYS_UNLINK,
+	       SYS_CLOSE,
+	       SYS_STAT
+} syscall_t;
+
+/* ASCII versions of the syscall names */
+extern char *syscall_names[];
+
+/* Return 1 on success, 0 on error */
+int ffsb_stats_str2syscall(char *, syscall_t *);
+
+/* Keep it in sync with syscall_t */
+#define FFSB_NUM_SYSCALLS (8UL)
+
+/* What stats to collect, shared among all threads  */
+typedef struct ffsb_stats_config {
+	unsigned num_buckets;
+	struct stat_bucket *buckets;
+
+	/* Ignore stats collection for some syscalls.
+	 * Each bit corresponds to one syscall.
+	 */
+	uint32_t ignore_stats;
+} ffsb_statsc_t;
+
+void ffsb_statsc_init(ffsb_statsc_t *);
+void ffsb_statsc_addbucket(ffsb_statsc_t *, uint32_t min, uint32_t max);
+void ffsb_statsc_ignore_sys(ffsb_statsc_t *, syscall_t s);
+void ffsb_statsc_destroy(ffsb_statsc_t *);
+
+/* If we are collecting stats, then the config field is non-NULL */
+typedef struct ffsb_stats_data {
+	ffsb_statsc_t *config;
+	uint32_t counts[FFSB_NUM_SYSCALLS];
+	uint64_t totals[FFSB_NUM_SYSCALLS]; /* cumulative sums */
+	uint64_t mins[FFSB_NUM_SYSCALLS];
+	uint64_t maxs[FFSB_NUM_SYSCALLS];
+	uint32_t *buckets[FFSB_NUM_SYSCALLS]; /* bucket counters */
+} ffsb_statsd_t ;
+
+/* constructor/destructor */
+void ffsb_statsd_init(ffsb_statsd_t *, ffsb_statsc_t *);
+void ffsb_statsd_destroy(ffsb_statsd_t *);
+
+/* Add data to a stats data struct.  Value should be in microsecs
+ * _NOT_ milli-secs
+ */
+void ffsb_add_data(ffsb_statsd_t *, syscall_t, uint32_t);
+
+/* Make a copy of a stats config */
+void ffsb_statsc_copy(ffsb_statsc_t *, ffsb_statsc_t *);
+
+/* Add two statsd structs together */
+void ffsb_statsd_add(ffsb_statsd_t *, ffsb_statsd_t *);
+
+/* Print out statsd structure */
+void ffsb_statsd_print(ffsb_statsd_t *fsd);
+
+/* Do we want stats for the specified syscall */
+int fsc_ignore_sys(ffsb_statsc_t *fsc, syscall_t s);
+
+#endif /* _FFSB_STATS_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.c
new file mode 100644
index 0000000..908e89c
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.c
@@ -0,0 +1,369 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <pthread.h>
+
+#include "ffsb_tg.h"
+#include "util.h"
+
+void init_ffsb_tg(ffsb_tg_t *tg, unsigned num_threads, unsigned tg_num)
+{
+	int i;
+	memset(tg, 0, sizeof(ffsb_tg_t));
+
+	tg->threads = ffsb_malloc(sizeof(ffsb_thread_t) * num_threads);
+	tg->tg_num = tg_num;
+	tg->num_threads = num_threads;
+
+	tg->bindfs = -1; /* default is not bound */
+
+	tg->thread_bufsize = 0;
+	for (i = 0 ; i < num_threads ; i++)
+		init_ffsb_thread(tg->threads + i, tg, 0, tg_num, i);
+}
+
+void destroy_ffsb_tg(ffsb_tg_t *tg)
+{
+	int i;
+	for (i = 0; i < tg->num_threads; i++)
+		destroy_ffsb_thread(tg->threads + i);
+	free(tg->threads);
+	if (tg_needs_stats(tg))
+		ffsb_statsc_destroy(&tg->fsc);
+}
+
+void *tg_run(void *data)
+{
+	tg_run_params_t *params = (tg_run_params_t *)data;
+	ffsb_tg_t *tg = params->tg;
+	int i;
+	pthread_attr_t attr;
+
+	pthread_attr_init(&attr);
+	pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
+
+	tg->start_barrier = params->thread_barrier;
+
+	/* Sum up the weights for use later by tg_get_op() */
+	tg->sum_weights = 0;
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		tg->sum_weights += tg->op_weights[i];
+
+	tg->fc = params->fc;
+	tg->flagval = -1;
+	tg->stopval = 1;
+
+	/* spawn threads */
+	for (i = 0; i < tg->num_threads; i++) {
+		ffsb_thread_t *ft = &tg->threads[i];
+		pthread_create(&ft->ptid, &attr, ft_run, ft);
+	}
+
+	if (params->tg_barrier)
+		ffsb_barrier_wait(params->tg_barrier);
+
+	/* wait for termination condition to be true */
+	do {
+		ffsb_sleep(params->wait_time);
+	} while (params->poll_fn(params->poll_data) == 0);
+
+	/* set flag value */
+	tg->flagval = tg->stopval;
+
+	/* wait on theads to finish */
+	for (i = 0; i < tg->num_threads; i++)
+		pthread_join(tg->threads[i].ptid, NULL);
+
+	return NULL;
+}
+
+/* Needs to set params->opnum and params->fs */
+void tg_get_op(ffsb_tg_t *tg, randdata_t *rd, tg_op_params_t *params)
+{
+	unsigned curop;
+	int num;
+	int fsnum;
+
+	num = 1 + getrandom(rd, tg->sum_weights);
+	curop = 0;
+
+	while (tg->op_weights[curop] < num) {
+		num -= tg->op_weights[curop];
+		curop++;
+	}
+
+	params->opnum = curop;
+
+	/* If we're bound to a particular filesystem, use that,
+	 * otherwise, pick one at random.
+	 */
+	fsnum = tg->bindfs;
+	if (fsnum < 0)
+		fsnum = getrandom(rd, tg->fc->num_filesys);
+
+	params->fs = fc_get_fs(tg->fc, fsnum);
+}
+
+void tg_set_op_weight(ffsb_tg_t *tg, char *opname, unsigned weight)
+{
+	int opnum = ops_find_op(opname);
+	assert(opnum >= 0);
+	tg->op_weights[opnum] = weight;
+}
+
+unsigned tg_get_op_weight(ffsb_tg_t *tg, char *opname)
+{
+	int opnum = ops_find_op(opname);
+	assert(opnum >= 0);
+	return tg->op_weights[opnum];
+}
+
+void tg_set_bindfs(ffsb_tg_t *tg, int fsnum)
+{
+	tg->bindfs = fsnum;
+}
+
+int tg_get_bindfs(ffsb_tg_t *tg)
+{
+	return tg->bindfs;
+}
+
+unsigned tg_get_numthreads(ffsb_tg_t *tg)
+{
+	return tg->num_threads;
+}
+
+static void update_bufsize(ffsb_tg_t *tg)
+{
+	int i;
+	uint32_t newmax = max(tg->read_blocksize, tg->write_blocksize);
+
+	if (newmax == max(newmax, tg->thread_bufsize))
+		for (i = 0; i < tg->num_threads ; i++)
+			ft_alter_bufsize(tg->threads + i, newmax);
+}
+
+void tg_set_read_random(ffsb_tg_t *tg, int rr)
+{
+	tg->read_random = rr;
+}
+
+void tg_set_write_random(ffsb_tg_t *tg, int wr)
+{
+	tg->write_random = wr;
+}
+
+void tg_set_fsync_file(ffsb_tg_t *tg, int fsync)
+{
+	tg->fsync_file = fsync;
+}
+
+void tg_set_read_size(ffsb_tg_t *tg, uint64_t rs)
+{
+	tg->read_size = rs;
+}
+
+void tg_set_read_blocksize(ffsb_tg_t *tg, uint32_t rs)
+{
+	tg->read_blocksize = rs;
+	update_bufsize(tg);
+}
+
+void tg_set_read_skip(ffsb_tg_t *tg, int rs)
+{
+	tg->read_skip = rs;
+}
+
+void tg_set_read_skipsize(ffsb_tg_t *tg, uint32_t rs)
+{
+	tg->read_skipsize = rs;
+}
+
+void tg_set_write_size(ffsb_tg_t *tg, uint64_t ws)
+{
+	tg->write_size = ws;
+}
+
+void tg_set_write_blocksize(ffsb_tg_t *tg, uint32_t ws)
+{
+	tg->write_blocksize = ws;
+	update_bufsize(tg);
+}
+
+int tg_get_read_random(ffsb_tg_t *tg)
+{
+	return tg->read_random;
+}
+
+int tg_get_write_random(ffsb_tg_t *tg)
+{
+	return tg->write_random;
+}
+
+int tg_get_fsync_file(ffsb_tg_t *tg)
+{
+	return tg->fsync_file;
+}
+
+uint64_t tg_get_read_size(ffsb_tg_t *tg)
+{
+	return tg->read_size;
+}
+
+uint32_t tg_get_read_blocksize(ffsb_tg_t *tg)
+{
+	return tg->read_blocksize;
+}
+
+int tg_get_read_skip(ffsb_tg_t *tg)
+{
+	return tg->read_skip;
+}
+
+uint32_t tg_get_read_skipsize(ffsb_tg_t *tg)
+{
+	return tg->read_skipsize;
+}
+
+uint64_t tg_get_write_size(ffsb_tg_t *tg)
+{
+	return tg->write_size;
+}
+
+uint32_t tg_get_write_blocksize(ffsb_tg_t *tg)
+{
+	return tg->write_blocksize;
+}
+
+int tg_get_stopval(ffsb_tg_t *tg)
+{
+	return tg->stopval;
+}
+
+ffsb_barrier_t *tg_get_start_barrier(ffsb_tg_t *tg)
+{
+	return tg->start_barrier;
+}
+
+static void tg_print_config_helper(ffsb_tg_t *tg)
+{
+	int i;
+	int sumweights = 0;
+	char buf[256];
+
+	printf("\t num_threads      = %d\n", tg->num_threads);
+	printf("\t\n");
+	printf("\t read_random      = %s\n", (tg->read_random) ? "on" : "off");
+	printf("\t read_size        = %llu\t(%s)\n", tg->read_size,
+	       ffsb_printsize(buf, tg->read_size, 256));
+	printf("\t read_blocksize   = %u\t(%s)\n", tg->read_blocksize,
+	       ffsb_printsize(buf, tg->read_blocksize, 256));
+	printf("\t read_skip        = %s\n", (tg->read_skip) ? "on" : "off");
+	printf("\t read_skipsize    = %u\t(%s)\n", tg->read_skipsize,
+	       ffsb_printsize(buf, tg->read_skipsize, 256));
+	printf("\t\n");
+	printf("\t write_random     = %s\n", (tg->write_random) ? "on" : "off");
+	printf("\t write_size       = %llu\t(%s)\n", tg->write_size,
+	       ffsb_printsize(buf, tg->write_size, 256));
+	printf("\t fsync_file       = %d\n", tg->fsync_file);
+	printf("\t write_blocksize  = %u\t(%s)\n", tg->write_blocksize,
+	       ffsb_printsize(buf, tg->write_blocksize, 256));
+	printf("\t wait time        = %u\n", tg->wait_time);
+	if (tg->bindfs >= 0) {
+		printf("\t\n");
+		printf("\t bound to fs %d\n", tg->bindfs);
+	}
+	printf("\t\n");
+	printf("\t op weights\n");
+
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		sumweights += tg->op_weights[i];
+
+	for (i = 0; i < FFSB_NUMOPS; i++)
+		printf("\t %20s = %d (%.2f%%)\n", op_get_name(i),
+		       tg->op_weights[i], 100 * (float)tg->op_weights[i] /
+		       (float)sumweights);
+	printf("\t\n");
+}
+
+void tg_print_config(ffsb_tg_t *tg)
+{
+	printf("ThreadGroup %d\n", tg->tg_num);
+	printf("================\n");
+	tg_print_config_helper(tg);
+}
+
+void tg_print_config_aging(ffsb_tg_t *tg, char *fsname)
+{
+	printf("\t Aging ThreadGroup for fs %s\n", fsname);
+	printf("\t ================\n");
+	tg_print_config_helper(tg);
+}
+
+void tg_collect_results(ffsb_tg_t *tg, ffsb_op_results_t *r)
+{
+	int i;
+	for (i = 0; i < tg_get_numthreads(tg); i++)
+		add_results(r, ft_get_results(tg->threads + i));
+}
+
+void tg_set_waittime(ffsb_tg_t *tg, unsigned time)
+{
+	tg->wait_time = time;
+}
+
+unsigned tg_get_waittime(ffsb_tg_t *tg)
+{
+	return tg->wait_time;
+}
+
+int tg_get_flagval(ffsb_tg_t *tg)
+{
+	return tg->flagval;
+}
+
+void tg_set_statsc(ffsb_tg_t *tg, ffsb_statsc_t *fsc)
+{
+	if (fsc) {
+		int i;
+
+		tg->need_stats = 1;
+		ffsb_statsc_copy(&tg->fsc, fsc);
+
+		for (i = 0; i < tg->num_threads; i++)
+			ft_set_statsc(tg->threads + i, &tg->fsc);
+	}
+}
+
+void tg_collect_stats(ffsb_tg_t *tg, ffsb_statsd_t *fsd)
+{
+	int i;
+
+	assert(tg->need_stats);
+	ffsb_statsd_init(fsd, &tg->fsc);
+
+	for (i = 0; i < tg_get_numthreads(tg); i++)
+		ffsb_statsd_add(fsd, ft_get_stats_data(tg->threads+i));
+}
+
+int tg_needs_stats(ffsb_tg_t *tg)
+{
+	return tg->need_stats;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.h
new file mode 100644
index 0000000..2611e0a
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_tg.h
@@ -0,0 +1,206 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_TG_H_
+#define _FFSB_TG_H_
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include <pthread.h>
+
+#include "ffsb.h"
+#include "ffsb_op.h"
+#include "ffsb_thread.h"
+#include "ffsb_fs.h"
+#include "ffsb_stats.h"
+
+#include "util.h" /* for barrier obj */
+
+/* "Thread Group" object defs.
+ *
+ *  A thread group contains configuration information and can run its
+ *  "gang" of threads performing a particular mix of operations.
+ *
+ * The thread group is responsible for creating the ffsb_thread
+ * objects which must ask the thread group object to select an
+ * operation and a filesystem to run that operation on.  The thread
+ * objects don't contain any of the configuration information.
+ *
+ * Thread groups are also abstracted so they can be "run" arbitrarily
+ * which is useful because we can reuse them for aging.  The running
+ * is a bit complex, the thread group has to have a callback function
+ * which is runs at a specified interval to determine when to
+ * terminate.
+ *
+ * To synchronize starting across many thread groups there are two
+ * barriers used, the first one "tg_barrier" in the run_params is to
+ * synchronize multiple thread-groups being ready to start, meaning
+ * that all their threads have been spawned The second one
+ * "thread_barrier" synchronizes all threads across multiple thread
+ * groups, so that they all start at once.
+*/
+
+struct ffsb_thread;
+struct ffsb_config;
+
+typedef struct ffsb_tg {
+	unsigned tg_num;
+	unsigned num_threads;
+	unsigned op_weights[FFSB_NUMOPS];
+	struct ffsb_thread *threads;
+
+	/* A threadgroup can be bound to just one filesystem.
+	 * A value * < 0 , means we aren't bound to any.
+	*/
+	int bindfs;
+
+	int read_random;	/* boolean */
+	uint64_t read_size;
+	uint32_t read_blocksize;
+
+	int read_skip;		/* boolean */
+	uint32_t read_skipsize;
+
+	int write_random;	/* boolean */
+	uint64_t write_size;
+	uint32_t write_blocksize;
+
+	int fsync_file;		/* boolean */
+
+	/* Should be max(write_blocksize, read_blocksize) */
+	uint32_t thread_bufsize;
+
+	/* these fields are calculated/set by tg_run() */
+	unsigned sum_weights;
+	struct ffsb_config *fc;
+	ffsb_barrier_t *start_barrier;
+
+	/* Used for stopping the threads */
+	int flagval;
+	int stopval;
+
+	/* Delay between every operation, in milliseconds*/
+	unsigned wait_time;
+
+	/* stats configuration */
+	int need_stats;
+	ffsb_statsc_t fsc;
+} ffsb_tg_t;
+
+/* Init should be the very first thing called on the tg.  After that,
+ * the user can call the set methods and finally run.
+ */
+void init_ffsb_tg(ffsb_tg_t *tg, unsigned num_threads, unsigned tg_num);
+void destroy_ffsb_tg(ffsb_tg_t *tg);
+
+/* Parameters needed to fire off a thread group.  The main thread will
+ * evaluate poll_fn(poll_data) until it gets a nonzero return value.
+ * It will sleep for wait_time secs between calls The ffsb_config
+ * struct is needed for fs selection.  Barriers are to synchronize
+ * multiple tgs and all threads pt is for pthread_create()
+ */
+typedef struct tg_run_params {
+	ffsb_tg_t *tg;
+	int (*poll_fn)(void *);
+	void *poll_data;
+	unsigned wait_time; /* in sec */
+	struct ffsb_config *fc;
+	ffsb_barrier_t *tg_barrier;
+
+	/* Should be initialized by caller to tg_run() */
+	ffsb_barrier_t *thread_barrier;
+	pthread_t  pt;
+} tg_run_params_t;
+
+/* This function is meant to be called as a parameter to
+ * pthread_create()
+ */
+void *tg_run(void *);
+
+void tg_print_config(ffsb_tg_t *tg);
+void tg_print_config_aging(ffsb_tg_t *tg, char *fsname);
+
+/* Adds all of this tg's results to res */
+void tg_collect_results(ffsb_tg_t *tg, ffsb_op_results_t *res);
+
+/* Adds up all this tg's stats to totals */
+void tg_collect_stats(ffsb_tg_t *tg, ffsb_statsd_t *totals);
+
+/* getters/setters, setters should not be called after a run has begun */
+
+void tg_set_statsc(ffsb_tg_t *tg, ffsb_statsc_t *fsc);
+
+void tg_set_bindfs(ffsb_tg_t *tg, int fsnum);
+int  tg_get_bindfs(ffsb_tg_t *tg);
+
+unsigned tg_get_numthreads(ffsb_tg_t *tg);
+
+void tg_set_op_weight(ffsb_tg_t *tg, char *opname, unsigned weight);
+unsigned tg_get_op_weight(ffsb_tg_t *tg, char *opname);
+
+void tg_set_read_random(ffsb_tg_t *tg, int rr);
+void tg_set_write_random(ffsb_tg_t *tg, int wr);
+void tg_set_fsync_file(ffsb_tg_t *tg, int fsync);
+
+int tg_get_read_random(ffsb_tg_t *tg);
+int tg_get_write_random(ffsb_tg_t *tg);
+int tg_get_fsync_file(ffsb_tg_t *tg);
+
+void tg_set_read_size(ffsb_tg_t *tg, uint64_t rs);
+void tg_set_read_blocksize(ffsb_tg_t *tg, uint32_t rs);
+
+void tg_set_read_skipsize(ffsb_tg_t *tg, uint32_t rs);
+void tg_set_read_skip(ffsb_tg_t *tg, int rs);
+
+void tg_set_write_size(ffsb_tg_t *tg, uint64_t ws);
+void tg_set_write_blocksize(ffsb_tg_t *tg, uint32_t ws);
+
+uint64_t tg_get_read_size(ffsb_tg_t *tg);
+uint32_t tg_get_read_blocksize(ffsb_tg_t *tg);
+
+int tg_get_read_skip(ffsb_tg_t *tg);
+uint32_t tg_get_read_skipsize(ffsb_tg_t *tg);
+
+uint64_t tg_get_write_size(ffsb_tg_t *tg);
+uint32_t tg_get_write_blocksize(ffsb_tg_t *tg);
+
+void tg_set_waittime(ffsb_tg_t *tg, unsigned time);
+unsigned tg_get_waittime(ffsb_tg_t *tg);
+
+/* The threads in the tg should be the only ones using these (below)
+ * funcs.
+ */
+ffsb_barrier_t *tg_get_start_barrier(ffsb_tg_t *tg);
+int tg_get_stopval(ffsb_tg_t *tg);
+int tg_get_flagval(ffsb_tg_t *tg);
+
+/* The threads in this tg will use this function to get an op to run,
+ * so all configuration specific information is kept in this object.
+ */
+typedef struct tg_op_params {
+	struct ffsb_fs *fs;     /* out parameter */
+	unsigned opnum;         /* out parameter */
+} tg_op_params_t;
+
+/* tg and rd and in parameters, everything in params is out */
+void  tg_get_op(ffsb_tg_t *tg, randdata_t *rd, tg_op_params_t *params);
+
+/* want stats for this tg ? */
+int tg_needs_stats(ffsb_tg_t *tg);
+
+#endif /* _FFSB_TG_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.c
new file mode 100644
index 0000000..e3a2039
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.c
@@ -0,0 +1,171 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include "ffsb_tg.h"
+#include "ffsb_thread.h"
+#include "ffsb_op.h"
+#include "util.h"
+
+void init_ffsb_thread(ffsb_thread_t *ft, struct ffsb_tg *tg, unsigned bufsize,
+		      unsigned tg_num, unsigned thread_num)
+{
+	memset(ft, 0, sizeof(ffsb_thread_t));
+
+	ft->tg = tg;
+	ft->tg_num = tg_num;
+	ft->thread_num = thread_num;
+
+	if (bufsize)
+		ft_alter_bufsize(ft, bufsize);
+
+	init_random(&ft->rd, MAX_RANDBUF_SIZE);
+}
+
+void destroy_ffsb_thread(ffsb_thread_t *ft)
+{
+	free(ft->mallocbuf);
+	destroy_random(&ft->rd);
+	if (ft->fsd.config)
+		ffsb_statsd_destroy(&ft->fsd);
+}
+
+void ft_set_statsc(ffsb_thread_t *ft, ffsb_statsc_t *fsc)
+{
+	ffsb_statsd_init(&ft->fsd, fsc);
+}
+
+void *ft_run(void *data)
+{
+	ffsb_thread_t *ft = (ffsb_thread_t *)data;
+	tg_op_params_t params;
+	unsigned wait_time = tg_get_waittime(ft->tg);
+	int stopval = tg_get_stopval(ft->tg);
+
+	ffsb_barrier_wait(tg_get_start_barrier(ft->tg));
+
+	while (tg_get_flagval(ft->tg) != stopval) {
+		tg_get_op(ft->tg, &ft->rd, &params);
+		do_op(ft, params.fs, params.opnum);
+		ffsb_milli_sleep(wait_time);
+	}
+	return NULL;
+}
+
+void ft_alter_bufsize(ffsb_thread_t *ft, unsigned bufsize)
+{
+	if (ft->mallocbuf != NULL)
+		free(ft->mallocbuf);
+	ft->mallocbuf = ffsb_malloc(bufsize + 4096);
+	ft->alignedbuf = ffsb_align_4k(ft->mallocbuf + (4096 - 1));
+}
+
+char *ft_getbuf(ffsb_thread_t *ft)
+{
+	return ft->alignedbuf;
+}
+
+
+int ft_get_read_random(ffsb_thread_t *ft)
+{
+	return tg_get_read_random(ft->tg);
+}
+
+uint32_t ft_get_read_size(ffsb_thread_t *ft)
+{
+	return tg_get_read_size(ft->tg);
+}
+
+uint32_t ft_get_read_blocksize(ffsb_thread_t *ft)
+{
+	return tg_get_read_blocksize(ft->tg);
+}
+
+int ft_get_write_random(ffsb_thread_t *ft)
+{
+	return tg_get_write_random(ft->tg);
+}
+
+uint32_t ft_get_write_size(ffsb_thread_t *ft)
+{
+	return tg_get_write_size(ft->tg);
+}
+
+uint32_t ft_get_write_blocksize(ffsb_thread_t *ft)
+{
+	return tg_get_write_blocksize(ft->tg);
+}
+
+int ft_get_fsync_file(ffsb_thread_t *ft)
+{
+	return tg_get_fsync_file(ft->tg);
+}
+
+randdata_t *ft_get_randdata(ffsb_thread_t *ft)
+{
+	return &ft->rd;
+}
+
+void ft_incr_op(ffsb_thread_t *ft, unsigned opnum, unsigned increment, uint64_t bytes)
+{
+	ft->results.ops[opnum] += increment;
+	ft->results.op_weight[opnum]++;
+	ft->results.bytes[opnum] += bytes;
+}
+
+void ft_add_readbytes(ffsb_thread_t *ft, uint32_t bytes)
+{
+	ft->results.read_bytes += bytes;
+}
+
+void ft_add_writebytes(ffsb_thread_t *ft, uint32_t bytes)
+{
+	ft->results.write_bytes += bytes;
+}
+
+ffsb_op_results_t *ft_get_results(ffsb_thread_t *ft)
+{
+	return &ft->results;
+}
+
+int ft_get_read_skip(ffsb_thread_t *ft)
+{
+	return tg_get_read_skip(ft->tg);
+}
+
+uint32_t ft_get_read_skipsize(ffsb_thread_t *ft)
+{
+	return tg_get_read_skipsize(ft->tg);
+}
+
+int ft_needs_stats(ffsb_thread_t *ft, syscall_t sys)
+{
+	int ret = 0;
+	if (ft && ft->fsd.config && !fsc_ignore_sys(ft->fsd.config, sys))
+		ret = 1;
+	return ret;
+}
+
+void ft_add_stat(ffsb_thread_t *ft, syscall_t sys, uint32_t val)
+{
+	if (ft)
+		ffsb_add_data(&ft->fsd, sys, val);
+}
+
+ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t *ft)
+{
+	return &ft->fsd;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.h
new file mode 100644
index 0000000..c4315a5
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/ffsb_thread.h
@@ -0,0 +1,108 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FFSB_THREAD_H_
+#define _FFSB_THREAD_H_
+
+#include <pthread.h>
+#include <inttypes.h>
+
+#include "rand.h"
+#include "ffsb_op.h"
+#include "ffsb_tg.h"
+#include "ffsb_stats.h"
+
+#include "util.h" /* for barrier stuff */
+
+struct ffsb_tg;
+struct ffsb_op_results;
+
+/* FFSB thread object
+ *
+ * The thread object doesn't store any configuration information, it
+ * mostly just holds per-thread state information such as the random
+ * data store and the per-thread buffer to copy data to/from disk
+ */
+
+typedef struct ffsb_thread {
+	unsigned thread_num;
+	unsigned tg_num;
+	pthread_t ptid;
+	struct randdata rd;
+	struct ffsb_tg *tg; /* owning thread group */
+
+	/* If we are using Direct IO, then we must only use a 4k
+	 * aligned buffer so, alignedbuf_4k is a pointer into
+	 * "mallocbuf" which is what malloc gave us.
+	 */
+	char *alignedbuf;
+	char *mallocbuf;
+
+	struct ffsb_op_results results;
+
+	/* stats */
+	ffsb_statsd_t fsd;
+} ffsb_thread_t ;
+
+void init_ffsb_thread(ffsb_thread_t *, struct ffsb_tg *, unsigned,
+		       unsigned, unsigned);
+void destroy_ffsb_thread(ffsb_thread_t *);
+
+/* Owning thread group will start thread with this, thread runs until
+ * *ft->checkval == ft->stopval.  Yes this is not strictly
+ * synchronized, but that is okay for our purposes, and it limits (IMO
+ * expensive) bus-locking.
+ *
+ * pthread_create() is called by tg with this function as a parameter
+ * data is a (ffsb_thread_t*)
+ */
+void *ft_run(void *);
+
+void ft_alter_bufsize(ffsb_thread_t *, unsigned);
+char *ft_getbuf(ffsb_thread_t *);
+
+int ft_get_read_random(ffsb_thread_t *);
+uint32_t ft_get_read_size(ffsb_thread_t *);
+uint32_t ft_get_read_blocksize(ffsb_thread_t *);
+
+int ft_get_write_random(ffsb_thread_t *);
+uint32_t ft_get_write_size(ffsb_thread_t *);
+uint32_t ft_get_write_blocksize(ffsb_thread_t *);
+
+int ft_get_fsync_file(ffsb_thread_t *);
+
+randdata_t *ft_get_randdata(ffsb_thread_t *);
+
+void ft_incr_op(ffsb_thread_t *ft, unsigned opnum, unsigned increment, uint64_t bytes);
+
+void ft_add_readbytes(ffsb_thread_t *, uint32_t);
+void ft_add_writebytes(ffsb_thread_t *, uint32_t);
+
+int ft_get_read_skip(ffsb_thread_t *);
+uint32_t ft_get_read_skipsize(ffsb_thread_t *);
+
+ffsb_op_results_t *ft_get_results(ffsb_thread_t *);
+
+void ft_set_statsc(ffsb_thread_t *, ffsb_statsc_t *);
+
+/* for these two, ft == NULL is OK */
+int ft_needs_stats(ffsb_thread_t *, syscall_t);
+void ft_add_stat(ffsb_thread_t *, syscall_t, uint32_t);
+
+ffsb_statsd_t *ft_get_stats_data(ffsb_thread_t *);
+
+#endif /* _FFSB_THREAD_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.c
new file mode 100644
index 0000000..8a5aa0f
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.c
@@ -0,0 +1,278 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define FILE_OFFSET_BITS 64
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "ffsb.h"
+#include "fh.h"
+
+#include "config.h"
+
+/* !!! ugly */
+#ifndef HAVE_OPEN64
+#define open64 open
+#endif
+
+#ifndef HAVE_FSEEKO64
+#define lseek64 lseek
+#endif
+
+/* All these functions read the global mainconfig->bufferedio variable
+ * to determine if they are to do buffered i/o or normal.
+ *
+ * ha, well, they're supposed to anyway...!!! TODO -SR 2006/05/14
+ */
+
+static void do_stats(struct timeval *start, struct timeval *end,
+		     ffsb_thread_t *ft, ffsb_fs_t *fs, syscall_t sys)
+{
+	struct timeval diff;
+	uint32_t value = 0;
+
+	if (!ft && !fs)
+		return;
+
+	timersub(end, start, &diff);
+
+	value = 1000000 * diff.tv_sec + diff.tv_usec;
+
+	if (ft && ft_needs_stats(ft, sys))
+		ft_add_stat(ft, sys, value);
+	if (fs && fs_needs_stats(fs, sys))
+		fs_add_stat(fs, sys, value);
+}
+
+static int fhopenhelper(char *filename, char *bufflags, int flags,
+			ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int fd = 0;
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_OPEN) ||
+		fs_needs_stats(fs, SYS_OPEN);
+
+	flags |= O_LARGEFILE;
+
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	fd = open64(filename, flags, S_IRWXU);
+	if (fd < 0) {
+		perror(filename);
+		exit(0);
+	}
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_OPEN);
+	}
+
+	return fd;
+}
+
+int fhopenread(char *filename, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int flags = O_RDONLY;
+	int directio = fs_get_directio(fs);
+
+	if (directio)
+		flags |= O_DIRECT;
+	return fhopenhelper(filename, "r", flags, ft, fs);
+}
+
+int fhopenappend(char *filename, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int flags = O_APPEND | O_WRONLY;
+	int directio = fs_get_directio(fs);
+
+	if (directio)
+		flags |= O_DIRECT;
+	return fhopenhelper(filename, "a", flags, ft, fs);
+}
+
+int fhopenwrite(char *filename, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int flags = O_WRONLY;
+	int directio = fs_get_directio(fs);
+
+	if (directio)
+		flags |= O_DIRECT;
+	return fhopenhelper(filename, "w", flags, ft, fs);
+}
+
+int fhopencreate(char *filename, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int flags = O_CREAT | O_RDWR | O_TRUNC;
+	int directio = fs_get_directio(fs);
+
+	if (directio)
+		flags |= O_DIRECT;
+	return fhopenhelper(filename, "rw", flags, ft, fs);
+}
+
+void fhread(int fd, void *buf, uint64_t size, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	ssize_t realsize;
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_READ) ||
+		fs_needs_stats(fs, SYS_READ);
+
+	assert(size <= SIZE_MAX);
+	if (need_stats)
+		gettimeofday(&start, NULL);
+	realsize = read(fd, buf, size);
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_READ);
+	}
+
+	if (realsize != size) {
+		printf("Read %lld instead of %llu bytes.\n",
+		       (unsigned long long)realsize, (unsigned long long)size);
+		perror("read");
+		exit(1);
+	}
+}
+
+void fhwrite(int fd, void *buf, uint32_t size, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	ssize_t realsize;
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_WRITE) ||
+		fs_needs_stats(fs, SYS_WRITE);
+
+	assert(size <= SIZE_MAX);
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	realsize = write(fd, buf, size);
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_WRITE);
+	}
+
+	if (realsize != size) {
+		printf("Wrote %d instead of %d bytes.\n"
+			  "Probably out of disk space\n", realsize, size);
+		perror("write");
+		exit(1);
+	}
+}
+
+void fhseek(int fd, uint64_t offset, int whence, ffsb_thread_t *ft,
+	    ffsb_fs_t *fs)
+{
+	uint64_t res;
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_LSEEK) ||
+		fs_needs_stats(fs, SYS_LSEEK);
+
+	if ((whence == SEEK_CUR) && (offset == 0))
+		return;
+
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	res = lseek64(fd, offset, whence);
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_LSEEK);
+	}
+	if ((whence == SEEK_SET) && (res != offset))
+		perror("seek");
+
+	if (res == -1) {
+		if (whence == SEEK_SET)
+			fprintf(stderr, "tried to seek to %lld\n", offset);
+		else
+			fprintf(stderr, "tried to seek from current "
+				"position to %lld\n", offset);
+
+		perror("seek");
+		exit(1);
+	}
+}
+
+void fhclose(int fd, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_CLOSE) ||
+		fs_needs_stats(fs, SYS_CLOSE);
+
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	close(fd);
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_CLOSE);
+	}
+}
+
+void fhstat(char *name, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	struct timeval start, end;
+	struct stat tmp_stat;
+
+	int need_stats = ft_needs_stats(ft, SYS_STAT) ||
+		fs_needs_stats(fs, SYS_CLOSE);
+
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	if (stat(name, &tmp_stat)) {
+		fprintf (stderr, "stat call failed for file %s\n", name);
+		exit(1);
+	}
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_STAT);
+	}
+}
+
+int writefile_helper(int fd, uint64_t size, uint32_t blocksize, char *buf,
+		     struct ffsb_thread *ft, struct ffsb_fs *fs)
+{
+	uint64_t iterations, a;
+	uint64_t last;
+
+	iterations = size / blocksize;
+	last = size % blocksize;
+
+	for (a = 0; a < iterations; a++)
+		fhwrite(fd, buf, blocksize, ft, fs);
+
+	if (last) {
+		a++;
+		fhwrite(fd, buf, last, ft, fs);
+	}
+	return a;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.h
new file mode 100644
index 0000000..d047b39
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fh.h
@@ -0,0 +1,41 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FH_H_
+#define _FH_H_
+
+#include <inttypes.h>
+
+struct ffsb_thread;
+struct ffsb_fs;
+
+int fhopenread(char *, struct ffsb_thread *, struct ffsb_fs *);
+int fhopenwrite(char *, struct ffsb_thread *, struct ffsb_fs *);
+int fhopencreate(char *, struct ffsb_thread *, struct ffsb_fs *);
+int fhopenappend(char *, struct ffsb_thread *, struct ffsb_fs *);
+
+void fhread(int, void *, uint64_t, struct ffsb_thread *, struct ffsb_fs *);
+
+/* can only write up to size_t bytes at a time, so size is a uint32_t */
+void fhwrite(int, void *, uint32_t, struct ffsb_thread *, struct ffsb_fs *);
+void fhseek(int, uint64_t, int, struct ffsb_thread *, struct ffsb_fs *);
+void fhclose(int, struct ffsb_thread *, struct ffsb_fs *);
+
+int writefile_helper(int, uint64_t, uint32_t, char *, struct ffsb_thread *,
+		     struct ffsb_fs *);
+
+#endif /* _FH_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.c
new file mode 100644
index 0000000..647674b
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.c
@@ -0,0 +1,503 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include "rand.h"
+#include "filelist.h"
+#include "util.h"
+#include "rwlock.h"
+#include "rbt.h"
+#include "cirlist.h"
+
+#if 0
+static
+void print_cl(struct cirlist *cl)
+{
+	struct cnode *cur = cl->head;
+	printf("curlist: ");
+	if (cur == NULL) {
+		printf("\n");
+		return;
+	}
+	do {
+		printf("%d ", cur->obj->num);
+		cur = cur->next;
+	} while (cur != cl->head);
+	printf("\n");
+}
+#endif
+
+#if 0
+static
+int node_cmp(struct ffsb_file *a, struct ffsb_file *b)
+{
+	return a->num - b->num;
+}
+#endif
+
+static
+void build_dirs(struct benchfiles *bf)
+{
+	char buf[FILENAME_MAX];
+	int i;
+
+	if (mkdir(bf->basedir, S_IRWXU) < 0)
+		if (errno != EEXIST) {
+			perror(bf->basedir);
+			exit(1);
+		}
+	for (i = 0; i < bf->numsubdirs; i++) {
+		snprintf(buf, FILENAME_MAX, "%s/%s%s%d",
+			 bf->basedir, bf->basename,
+			 SUBDIRNAME_BASE, i);
+		if (mkdir(buf, S_IRWXU) == -1)
+			if (errno != EEXIST) {
+				perror(buf);
+				exit(1);
+			}
+	}
+}
+
+
+void init_filelist(struct benchfiles *b, char *basedir, char *basename,
+		   uint32_t numsubdirs, int builddirs)
+{
+	memset(b, 0, sizeof(struct benchfiles));
+	b->basedir = ffsb_strdup(basedir);
+	b->basename = ffsb_strdup(basename);
+	b->numsubdirs = numsubdirs;
+	init_rwlock(&b->fileslock);
+	b->files = rbtree_construct();
+	b->dirs = rbtree_construct();
+	b->holes = ffsb_malloc(sizeof(struct cirlist));
+	b->dholes = ffsb_malloc(sizeof(struct cirlist));
+	init_cirlist(b->holes);
+	init_cirlist(b->dholes);
+
+	if (builddirs)
+		build_dirs(b);
+}
+
+static void file_destructor(struct ffsb_file *file)
+{
+	free(file->name);
+	free(file);
+}
+
+void destroy_filelist(struct benchfiles *bf)
+{
+	free(bf->basedir);
+	free(bf->basename);
+
+	while (!cl_empty(bf->holes)) {
+		struct ffsb_file *cur = cl_remove_head(bf->holes);
+		file_destructor(cur);
+	}
+	free(bf->holes);
+	rbtree_clean(bf->files, file_destructor);
+	free(bf->files);
+}
+
+struct ffsb_file *add_file(struct benchfiles *b, uint64_t size, randdata_t *rd)
+{
+	struct ffsb_file *newfile, *oldfile = NULL;
+	int filenum = 0;
+
+	/* We pre-allocate here, because I don't want to spend time
+	 * malloc'ing while the list is locked we free it later if
+	 * necessary
+	 */
+	newfile = ffsb_malloc(sizeof(struct ffsb_file));
+
+	newfile->size = size;
+	init_rwlock(&(newfile->lock));
+
+	/* Write lock the filelist, begin critical section */
+	rw_lock_write(&b->fileslock);
+
+	/* First check "holes" for a file  */
+	if (!cl_empty(b->holes)) {
+		oldfile = cl_remove_head(b->holes);
+		rbtree_insert(b->files, oldfile);
+		rw_lock_write(&oldfile->lock);
+	} else {
+		filenum = b->listsize;
+		b->listsize++;
+
+		newfile->num = filenum;
+		rbtree_insert(b->files, newfile);
+
+		rw_lock_write(&newfile->lock);
+	}
+
+	/* unlock filelist */
+	rw_unlock_write(&b->fileslock);
+
+	if (oldfile == NULL) {
+		char buf[FILENAME_MAX];
+		int randdir = getrandom(rd, b->numsubdirs+1);
+		int namesize = 0;
+		if (randdir == 0)
+			namesize = snprintf(buf, FILENAME_MAX, "%s/%s%s%d",
+					    b->basedir, b->basename,
+					    FILENAME_BASE, filenum);
+		else
+			namesize = snprintf(buf, FILENAME_MAX,
+					    "%s/%s%s%d/%s%s%d", b->basedir,
+					    b->basename, SUBDIRNAME_BASE,
+					    randdir - 1, b->basename,
+					    FILENAME_BASE, filenum);
+		if (namesize >= FILENAME_MAX)
+			/* !!! do something about this ? */
+			printf("warning: filename \"%s\" too long\n", buf);
+		newfile->name = ffsb_strdup(buf);
+		return newfile;
+	} else {
+		free(newfile);
+		return oldfile;
+	}
+}
+
+struct ffsb_file *add_dir(struct benchfiles *b, uint64_t size, randdata_t *rd)
+{
+	struct ffsb_file *newdir, *olddir = NULL;
+	int dirnum = 0;
+
+	newdir = ffsb_malloc(sizeof(struct ffsb_file));
+
+	init_rwlock(&newdir->lock);
+
+	/* write lock the filelist, beging critical section */
+	rw_lock_write(&b->fileslock);
+
+	/* First check "holes" for a file  */
+	if (!cl_empty(b->dholes)) {
+		olddir = cl_remove_head(b->dholes);
+		rbtree_insert(b->files, olddir);
+		rw_lock_write(&olddir->lock);
+	} else {
+		dirnum = b->numsubdirs;
+		b->numsubdirs++;
+		printf("dirnum: %d\n", dirnum);
+		newdir->num = dirnum;
+		rbtree_insert(b->dirs, newdir);
+
+		rw_lock_write(&newdir->lock);
+	}
+
+	/* unlock filelist */
+	rw_unlock_write(&b->fileslock);
+
+	if (olddir == NULL) {
+		char buf[FILENAME_MAX];
+		int namesize = 0;
+		namesize = snprintf(buf, FILENAME_MAX, "%s/%s%s%d",
+				    b->basedir, b->basename,
+				    SUBDIRNAME_BASE, dirnum);
+		if (namesize >= FILENAME_MAX)
+			printf("warning: filename \"%s\" too long\n", buf);
+			/* TODO: take action here... */
+		newdir->name = ffsb_strdup(buf);
+		return newdir;
+	} else {
+		free(newdir);
+		return olddir;
+	}
+}
+
+/* Private version of above function used only for reusing a
+ * fileset.
+ */
+static struct ffsb_file *add_file_named(struct benchfiles *b, uint64_t size,
+					 char *name)
+{
+	struct ffsb_file *newfile = NULL;
+
+	newfile = ffsb_malloc(sizeof(struct ffsb_file));
+	memset(newfile, 0, sizeof(struct ffsb_file));
+	newfile->name = ffsb_strdup(name);
+	newfile->size = size;
+	init_rwlock(&newfile->lock);
+
+	/* Write lock the filelist, begin critical section */
+	rw_lock_write(&b->fileslock);
+
+	newfile->num = b->listsize;
+	b->listsize++;
+
+	/* Add a new file to the rbtree */
+	rbtree_insert(b->files, newfile);
+
+	rw_lock_write(&newfile->lock);
+
+	/* Unlock filelist */
+	rw_unlock_write(&b->fileslock);
+
+	return newfile;
+}
+
+
+#if 0
+static void print_rb_helper(rb_node *cur)
+{
+	if (cur != NULL) {
+		print_rb_helper(cur->left);
+		printf("%d ", cur->object->num);
+		print_rb_helper(cur->right);
+	}
+}
+
+static void print_rb(rb_tree *tree)
+{
+	print_rb_helper(tree->root);
+}
+#endif
+
+void remove_file(struct benchfiles *b, struct ffsb_file *entry)
+{
+	rw_lock_write(&b->fileslock);
+
+	rbtree_remove(b->files, entry, NULL);
+	/* add node to the cir. list of "holes" */
+	cl_insert_tail(b->holes, entry);
+
+	rw_unlock_write(&b->fileslock);
+}
+
+static struct ffsb_file *choose_file(struct benchfiles *b, randdata_t *rd)
+{
+	rb_node *cur = NULL;
+	int chosen = 0;
+	struct ffsb_file temp;
+	temp.num = chosen;
+
+	if (b->listsize == 0) {
+		fprintf(stderr, "No more files to operate on,"
+			  " try making more initial files "
+			  "or fewer delete operations\n");
+		exit(0);
+	}
+
+	while (cur == NULL) {
+		chosen = getrandom(rd, b->listsize);
+		temp.num = chosen;
+		cur = rbtree_find(b->files, &temp);
+	}
+	return cur->object;
+}
+
+struct ffsb_file *choose_file_reader(struct benchfiles *bf, randdata_t *rd)
+{
+	struct ffsb_file *ret;
+
+	rw_lock_read(&bf->fileslock);
+	/* If b->holes->count == bf->listsize, all files have been
+	 * deleted!
+	 */
+	assert(bf->holes->count != bf->listsize);
+
+	ret = choose_file(bf, rd);
+	if (rw_trylock_read(&ret->lock)) {
+		rw_unlock_read(&bf->fileslock);
+		return choose_file_reader(bf, rd);
+	}
+
+	rw_unlock_read(&bf->fileslock);
+	return ret;
+}
+
+struct ffsb_file *choose_file_writer(struct benchfiles *bf, randdata_t *rd)
+{
+	struct ffsb_file *ret ;
+
+	rw_lock_read(&bf->fileslock);
+	assert(bf->holes->count != bf->listsize);
+	ret = choose_file(bf, rd);
+
+	if (rw_trylock_write(&ret->lock)) {
+		rw_unlock_read(&bf->fileslock);
+		return choose_file_writer(bf, rd);
+	}
+
+	rw_unlock_read(&bf->fileslock);
+	return ret;
+}
+
+void unlock_file_reader(struct ffsb_file *file)
+{
+	rw_unlock_read(&file->lock) ;
+}
+
+void unlock_file_writer(struct ffsb_file *file)
+{
+	rw_unlock_write(&file->lock) ;
+}
+
+void rename_file(struct ffsb_file *file)
+{
+	char *newname = malloc(strlen(file->name) + 2);
+	sprintf(newname, "%sa", file->name);
+	file->name = newname;
+}
+
+int validate_filename(struct benchfiles *bf, char *name)
+{
+	int retval = -1;
+	char fmt_str[FILENAME_MAX];
+	if (FILENAME_MAX <= snprintf(fmt_str, FILENAME_MAX,
+				 "%s%s%%d", bf->basename, FILENAME_BASE)) {
+		printf("filename is too long declaring it invalid\n");
+		return -1;
+	}
+
+	sscanf(name, fmt_str, &retval);
+	return retval;
+}
+
+int validate_dirname(struct benchfiles *bf, char *name)
+{
+	int retval = -1;
+	char fmt_str[FILENAME_MAX];
+	if (FILENAME_MAX <= snprintf(fmt_str, FILENAME_MAX, "%s%s%%d",
+				     bf->basename, SUBDIRNAME_BASE)) {
+		printf("dirname is too long declaring it invalid\n");
+		return -1;
+	}
+
+	sscanf(name, fmt_str, &retval);
+	return retval;
+}
+
+/* Do all the dirty work of recursing through a directory structure
+ * check everything for validitiy and update everything properly.
+ * Note it does not check filesizes !!!, it doesn't know anything
+ * about them
+ */
+static int add_dir_to_filelist(struct benchfiles *bf, DIR *subdir,
+			       char *subdir_path, fl_validation_func_t vfunc,
+			       void *vf_data)
+{
+	int retval = 0;
+	struct dirent *d_ent = NULL;
+
+	while ((d_ent = readdir(subdir)) != NULL) {
+		DIR *tmp = NULL;
+		char filename_buf[FILENAME_MAX*2];
+
+		if (FILENAME_MAX < snprintf(filename_buf, FILENAME_MAX, "%s/%s",
+					    subdir_path, d_ent->d_name)) {
+			printf("filename \"%s\" too long aborting\n",
+			       filename_buf);
+			return -1;
+		}
+		tmp = opendir(filename_buf);
+		if (tmp == NULL) {
+			struct ffsb_file *ffsb_file = NULL;
+
+			if (validate_filename(bf, d_ent->d_name) < 0) {
+				printf("filename \"%s\" is invalid aborting\n",
+				       d_ent->d_name);
+				return -1;
+			}
+			/* Verify size/other attributes via callback  */
+			if (vfunc(bf, filename_buf, vf_data)) {
+				printf("filename \"%s\" didn't pass "
+				       "validation\n", d_ent->d_name);
+				return -1;
+			}
+			/* Add file to data structure */
+			ffsb_file = add_file_named(bf, ffsb_get_filesize(filename_buf),
+				       filename_buf);
+			unlock_file_writer(ffsb_file);
+		} else {
+			/* Check for the usual suspects and skip them */
+			if ((0 == strcmp(".", d_ent->d_name)) ||
+			    (0 == strcmp("..", d_ent->d_name))) {
+				closedir(tmp);
+				continue;
+			}
+			if (validate_dirname(bf, d_ent->d_name) < 0) {
+				printf("dirname \"%s\" is invalid aborting\n",
+				       d_ent->d_name);
+				closedir(tmp);
+				return -1;
+			}
+			if (vfunc(bf, filename_buf, vf_data)) {
+				printf("dir \"%s\" didn't pass validation\n",
+				       d_ent->d_name);
+				closedir(tmp);
+				return -1;
+			}
+			/* Update filelist */
+			bf->numsubdirs++;
+
+			/* recurse */
+			retval += add_dir_to_filelist(bf, tmp, filename_buf,
+						      vfunc, vf_data);
+
+			/* clean up */
+			closedir(tmp);
+		}
+	}
+	return retval;
+}
+
+
+int grab_old_fileset(struct benchfiles *bf, char *basename,
+		      fl_validation_func_t vfunc, void *vfunc_data)
+{
+	int retval = 0;
+	char buf[FILENAME_MAX*2];
+	DIR *lc_dir = NULL;
+
+	if (FILENAME_MAX < snprintf(buf, FILENAME_MAX, "%s",
+				    bf->basedir)) {
+		printf("filename \"%s\" is too long aborting\n", buf);
+		return -1;
+	}
+
+	lc_dir = opendir(buf);
+	if (lc_dir == NULL) {
+		perror("opendir");
+		return -1;
+	}
+
+	retval = add_dir_to_filelist(bf, lc_dir, buf, vfunc, vfunc_data);
+
+	closedir(lc_dir);
+	return retval ;
+}
+
+/* Get the number of files */
+uint32_t get_listsize(struct benchfiles *bf)
+{
+	return bf->listsize;
+}
+
+/* Get the number of subdirectories */
+uint32_t get_numsubdirs(struct benchfiles *bf)
+{
+	return bf->numsubdirs;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.h
new file mode 100644
index 0000000..f94120c
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/filelist.h
@@ -0,0 +1,145 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FILELIST_H_
+#define _FILELIST_H_
+
+#include <pthread.h>
+#include "rand.h"
+#include "rwlock.h"
+#include "cirlist.h"
+#include "rbt.h"
+
+#define SUBDIRNAME_BASE "dir"
+#define FILENAME_BASE "file"
+
+struct ffsb_file {
+	char *name;
+	uint64_t size;
+	struct rwlock lock;
+	uint32_t num;
+};
+
+struct cirlist;
+
+/* Tree of ffsb_file structs and associated state info struct must be
+ * locked during use.
+ */
+struct benchfiles {
+	/* The base directory in which all subdirs and files are
+	 * created
+	 */
+	char *basedir;
+
+	/* The name to prepend to all directory and file names */
+	char *basename;
+	uint32_t numsubdirs;
+
+	/* Files which currently exist on the filesystem */
+	struct red_black_tree *files;
+
+	/* Directories which currently exist on the filesystem */
+	struct red_black_tree *dirs;
+
+	/* Files which have been deleted, and whose numbers should be
+	 * reused
+	 */
+	struct cirlist *holes;
+	struct cirlist *dholes;
+
+	/* This lock must be held while manipulating the structure */
+	struct rwlock fileslock;
+	uint32_t listsize; /* Sum size of nodes in files and holes */
+};
+
+/* Initializes the list, user must call this before anything else it
+ * will create the basedir and subdirs on the filesystem automatically
+ * if the builddirs arg. is nonzero
+ */
+void init_filelist(struct benchfiles *, char *, char *, uint32_t, int);
+void destroy_filelist(struct benchfiles *);
+
+/* Allocates a new file, adds to list, (write) locks it, and returns
+ * it.  This function also randomly selects a filename + path to
+ * assign to the new file.
+ *
+ * It first checks the "holes" list for any available filenames.
+ * Caller must ensure file is actually created on disk
+ */
+struct ffsb_file *add_file(struct benchfiles *b, uint64_t size, randdata_t *rd);
+struct ffsb_file *add_dir(struct benchfiles *, uint64_t, randdata_t *);
+
+/* Removes file from list, decrements listsize.
+ *
+ * File should be writer-locked before calling this function.
+ *
+ * This function does not unlock file after removal from list.
+ *
+ * Caller must ensure file is actually removed on disk.
+ *
+ * Caller must NOT free file->name and file, since oldfiles are being
+ * put into holes list.
+ */
+void remove_file(struct benchfiles *, struct ffsb_file *);
+
+/* Picks a file at random, locks it for reading and returns it
+ * locked
+ */
+struct ffsb_file *choose_file_reader(struct benchfiles *, randdata_t *);
+
+/* Picks a file at random, locks it for writing and returns it
+ * locked
+ */
+struct ffsb_file *choose_file_writer(struct benchfiles *, randdata_t *);
+
+/* changes the file->name of a file, file must be write locked
+ * it does not free the old file->name, so caller must keep a ref to it
+ * and free after the call
+ */
+void rename_file(struct ffsb_file *);
+
+void unlock_file_reader(struct ffsb_file *);
+void unlock_file_writer(struct ffsb_file *);
+
+/* Uses SUBDIRNAME_BASE/FILENAME_BASE + bf->basename to validate a
+ * name returns a negative on invalid names, and the actual file
+ * number if valid
+ */
+int validate_filename(struct benchfiles *, char *);
+int validate_dirname(struct benchfiles *, char *);
+
+/* Function type which, does some validation of existing files
+ * currently only used by ffsb_fs stuff, returns 0 on success
+ */
+typedef int (*fl_validation_func_t)(struct benchfiles *, char *, void *);
+
+/* Provided for re-use of filesets.  Also runs the validation callback
+ * on each file/dir that is found, after verifying the name is
+ * conformant.  The fileset should be initialized with init_fileset()
+ * beforehand.
+ * Returns 0 on success
+ */
+int grab_old_fileset(struct benchfiles *, char *, fl_validation_func_t,
+		      void *);
+
+/* Get the number of files */
+uint32_t get_listsize(struct benchfiles *);
+
+/* Get the number of subdirectories */
+uint32_t get_numsubdirs(struct benchfiles *);
+
+#endif /* _FILELIST_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.c
new file mode 100644
index 0000000..e8aa2fc
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.c
@@ -0,0 +1,547 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#define _LARGEFILE64_SOURCE
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+
+
+#include "fh.h"
+#include "util.h"
+#include "ffsb.h"
+#include "fileops.h"
+#include "ffsb_op.h"
+
+static void do_stats(struct timeval *start, struct timeval *end,
+		     ffsb_thread_t *ft, ffsb_fs_t *fs, syscall_t sys)
+{
+	struct timeval diff;
+	uint32_t value = 0;
+
+	if (!ft && !fs)
+		return;
+
+	timersub(end, start, &diff);
+
+	value = 1000000 * diff.tv_sec + diff.tv_usec;
+
+	if (ft && ft_needs_stats(ft, sys))
+		ft_add_stat(ft, sys, value);
+	if (fs && fs_needs_stats(fs, sys))
+		fs_add_stat(fs, sys, value);
+}
+
+void fop_bench(ffsb_fs_t *fs, unsigned opnum)
+{
+	fs_set_opdata(fs, fs_get_datafiles(fs), opnum);
+}
+
+void fop_age(ffsb_fs_t *fs, unsigned opnum)
+{
+	fs_set_opdata(fs, fs_get_agefiles(fs), opnum);
+}
+
+static unsigned readfile_helper(int fd, uint64_t size, uint32_t blocksize,
+				char *buf, ffsb_thread_t *ft, ffsb_fs_t *fs)
+{
+	int iterations, a;
+	int last;
+
+	iterations = size / blocksize;
+	last = size % blocksize;
+
+	for (a = 0; a < iterations; a++)
+		fhread(fd, buf, blocksize, ft, fs);
+	if (last)
+		fhread(fd, buf, last, ft, fs);
+	return iterations;
+}
+
+static uint64_t get_random_offset(randdata_t *rd, uint64_t filesize,
+				  int aligned)
+{
+	if (!aligned)
+		return getllrandom(rd, filesize);
+
+	filesize /= 4096;
+	return getllrandom(rd, filesize) * 4096;
+}
+
+void ffsb_readfile(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+
+	int fd;
+	uint64_t filesize;
+
+	char *buf = ft_getbuf(ft);
+	int read_random = ft_get_read_random(ft);
+	uint64_t read_size = ft_get_read_size(ft);
+	uint32_t read_blocksize = ft_get_read_blocksize(ft);
+	uint32_t read_skipsize = ft_get_read_skipsize(ft);
+	int skip_reads = ft_get_read_skip(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+
+	uint64_t iterations = 0;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenread(curfile->name, ft, fs);
+
+	filesize = ffsb_get_filesize(curfile->name);
+
+	assert(filesize >= read_size);
+
+	/* Sequential read, starting at a random point */
+	if (!read_random) {
+		uint64_t range = filesize - read_size;
+		uint64_t offset = 0;
+		/* Skip or "stride" reads option */
+		if (skip_reads) {
+			unsigned i, last;
+			uint64_t minfilesize;
+			iterations = read_size / read_blocksize;
+			last = read_size % read_blocksize;
+
+			/* Double check that the user hasn't specified
+			 * a read_size that is too large when combined
+			 * with the seeks
+			 */
+			if (last)
+				minfilesize = last + iterations *
+					(read_blocksize + read_skipsize);
+			else
+				minfilesize = read_blocksize + iterations - 1 *
+					(read_blocksize + read_skipsize);
+
+			if (minfilesize > filesize) {
+				  printf("Error: read size %llu bytes too big "
+					 "w/ skipsize %u and blocksize %u,"
+					 " for file of size %llu bytes\n"
+					 " aborting\n\n", read_size,
+					 read_skipsize, read_blocksize,
+					 filesize);
+				  printf("minimum file size must be at least "
+					 " %llu bytes\n", minfilesize);
+					 exit(1);
+			}
+
+			for (i = 0; i < iterations; i++) {
+				fhread(fd, buf, read_blocksize, ft, fs);
+				fhseek(fd, (uint64_t)read_skipsize, SEEK_CUR,
+				       ft, fs);
+			}
+			if (last) {
+				fhread(fd, buf, (uint64_t)last, ft, fs);
+				iterations++;
+			}
+		} else {
+			/* Regular sequential reads */
+			if (range) {
+				offset = get_random_offset(rd, range,
+							   fs_get_alignio(fs));
+				fhseek(fd, offset, SEEK_SET, ft, fs);
+			}
+			iterations = readfile_helper(fd, read_size,
+						     read_blocksize, buf,
+						     ft, fs);
+		}
+	} else {
+		/* Randomized read */
+		uint64_t range = filesize - read_blocksize;
+		int i;
+
+		iterations = read_size / read_blocksize;
+
+		for (i = 0; i < iterations; i++) {
+			uint64_t offset = get_random_offset(rd, range,
+							    fs_get_alignio(fs));
+			fhseek(fd, offset, SEEK_SET, ft, fs);
+			fhread(fd, buf, read_blocksize, ft, fs);
+		}
+	}
+
+	unlock_file_reader(curfile);
+	fhclose(fd, ft, fs);
+
+	ft_incr_op(ft, opnum, iterations, read_size);
+	ft_add_readbytes(ft, read_size);
+}
+
+/* Just like ffsb_readfile but we read the whole file from start to
+ * finish regardless of file size.
+ */
+void ffsb_readall(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+	int fd;
+	uint64_t filesize;
+
+	char *buf = ft_getbuf(ft);
+	uint32_t read_blocksize = ft_get_read_blocksize(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+
+	unsigned iterations = 0;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenread(curfile->name, ft, fs);
+
+	filesize = ffsb_get_filesize(curfile->name);
+	iterations = readfile_helper(fd, filesize, read_blocksize, buf, ft, fs);
+
+	unlock_file_reader(curfile);
+	fhclose(fd, ft, fs);
+
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_readbytes(ft, filesize);
+}
+
+/* Shared core between ffsb_writefile and ffsb_writefile_fsync.*/
+
+static unsigned ffsb_writefile_core(ffsb_thread_t *ft, ffsb_fs_t *fs,
+				    unsigned opnum, uint64_t *filesize_ret,
+				    int fsync_file)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+
+	int fd;
+	uint64_t filesize;
+
+	char *buf = ft_getbuf(ft);
+	int write_random = ft_get_write_random(ft);
+	uint32_t write_size = ft_get_write_size(ft);
+	uint32_t write_blocksize = ft_get_write_blocksize(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+	unsigned iterations = 0;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenwrite(curfile->name, ft, fs);
+
+	filesize = ffsb_get_filesize(curfile->name);
+
+	assert(filesize >= write_size);
+
+	/* Sequential write, starting at a random point  */
+	if (!write_random) {
+		uint64_t range = filesize - write_size;
+		uint64_t offset = 0;
+		if (range) {
+			offset = get_random_offset(rd, range,
+						   fs_get_alignio(fs));
+			fhseek(fd, offset, SEEK_SET, ft, fs);
+		}
+		iterations = writefile_helper(fd, write_size, write_blocksize,
+					      buf, ft, fs);
+	} else {
+		/* Randomized write */
+		uint64_t range = filesize - write_blocksize;
+		int i;
+		iterations = write_size / write_blocksize;
+
+		for (i = 0; i < iterations; i++) {
+			uint64_t offset = get_random_offset(rd, range,
+							    fs_get_alignio(fs));
+			fhseek(fd, offset, SEEK_SET, ft, fs);
+			fhwrite(fd, buf, write_blocksize, ft, fs);
+		}
+	}
+
+	if (fsync_file) {
+		if (fsync(fd)) {
+			perror("fsync");
+			printf("aborting\n");
+			exit(1);
+		}
+	}
+	unlock_file_reader(curfile);
+	fhclose(fd, ft, fs);
+	*filesize_ret = filesize;
+	return iterations;
+}
+
+void ffsb_writefile(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_writefile_core(ft, fs, opnum, &filesize, 0);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+void ffsb_writefile_fsync(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_writefile_core(ft, fs, opnum, &filesize, 1);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+
+/* Shared core between ffsb_writeall and ffsb_writeall_fsync.*/
+
+static unsigned ffsb_writeall_core(ffsb_thread_t *ft, ffsb_fs_t *fs,
+				   unsigned opnum, uint64_t *filesize_ret,
+				   int fsync_file)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+	int fd;
+	uint64_t filesize;
+
+	char *buf = ft_getbuf(ft);
+	uint32_t write_blocksize = ft_get_write_blocksize(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+
+	unsigned iterations = 0;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenwrite(curfile->name, ft, fs);
+
+	filesize = ffsb_get_filesize(curfile->name);
+	iterations = writefile_helper(fd, filesize, write_blocksize, buf,
+				      ft, fs);
+	if (fsync_file)
+		if (fsync(fd)) {
+			perror("fsync");
+			printf("aborting\n");
+			exit(1);
+		}
+
+	unlock_file_reader(curfile);
+	fhclose(fd, ft, fs);
+	*filesize_ret = filesize;
+	return iterations;
+}
+
+/* Just like ffsb_writefile but we write the whole file from start to
+ * finish regardless of file size
+ */
+void ffsb_writeall(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_writeall_core(ft, fs, opnum, &filesize, 0);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+void ffsb_writeall_fsync(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_writeall_core(ft, fs, opnum, &filesize, 1);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+
+static unsigned ffsb_appendfile_core(ffsb_thread_t *ft, ffsb_fs_t *fs,
+				unsigned opnum, uint64_t *filesize_ret,
+				int fsync_file)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile;
+
+	int fd;
+
+	char *buf = ft_getbuf(ft);
+	uint32_t write_size = ft_get_write_size(ft);
+	uint32_t write_blocksize = ft_get_write_blocksize(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+	unsigned iterations = 0;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenappend(curfile->name, ft, fs);
+
+	unlock_file_reader(curfile);
+
+	curfile->size += (uint64_t)write_size;
+
+	iterations = writefile_helper(fd, write_size, write_blocksize, buf,
+				      ft, fs);
+	if (fsync_file)
+ 		if (fsync(fd)) {
+ 			perror("fsync");
+ 			printf("aborting\n");
+ 			exit(1);
+ 		}
+
+	fhclose(fd, ft, fs);
+ 	*filesize_ret = write_size;
+	return iterations;
+}
+
+void ffsb_appendfile(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_appendfile_core(ft, fs, opnum, &filesize, 0);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+void ffsb_appendfile_fsync(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_appendfile_core(ft, fs, opnum, &filesize, 1);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+static unsigned ffsb_createfile_core(ffsb_thread_t *ft, ffsb_fs_t *fs,
+				     unsigned opnum, uint64_t *filesize_ret,
+				     int fsync_file)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *newfile = NULL;
+
+	int fd;
+	uint64_t size;
+
+	char *buf = ft_getbuf(ft);
+	uint32_t write_blocksize = ft_get_write_blocksize(ft);
+	struct randdata *rd = ft_get_randdata(ft);
+	unsigned iterations = 0;
+
+	if (fs->num_weights) {
+		int num = 1 + getrandom(rd, fs->sum_weights);
+		int curop = 0;
+
+		while (fs->size_weights[curop].weight < num) {
+			num -= fs->size_weights[curop].weight;
+			curop++;
+		}
+		size = fs->size_weights[curop].size;
+	}
+	else {
+		uint64_t range = fs_get_max_filesize(fs) - fs_get_min_filesize(fs);
+		size = fs_get_min_filesize(fs);
+		if (range != 0)
+			size += getllrandom(rd, range);
+	}
+
+	newfile = add_file(bf, size, rd);
+	fd = fhopencreate(newfile->name, ft, fs);
+	iterations = writefile_helper(fd, size, write_blocksize, buf, ft, fs);
+
+	if (fsync_file)
+ 		if (fsync(fd)) {
+ 			perror("fsync");
+ 			printf("aborting\n");
+ 			exit(1);
+ 		}
+
+	fhclose(fd, ft, fs);
+	unlock_file_writer(newfile);
+ 	*filesize_ret = size;
+	return iterations;
+}
+
+void ffsb_createfile(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_createfile_core(ft, fs, opnum, &filesize, 0);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+void ffsb_createfile_fsync(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	unsigned iterations;
+	uint64_t filesize;
+
+	iterations = ffsb_createfile_core(ft, fs, opnum, &filesize, 1);
+	ft_incr_op(ft, opnum, iterations, filesize);
+	ft_add_writebytes(ft, filesize);
+}
+
+void ffsb_deletefile(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+	randdata_t *rd = ft_get_randdata(ft);
+	struct timeval start, end;
+	int need_stats = ft_needs_stats(ft, SYS_UNLINK) ||
+		fs_needs_stats(fs, SYS_UNLINK);
+
+	curfile = choose_file_writer(bf, rd);
+	remove_file(bf, curfile);
+
+	if (need_stats)
+		gettimeofday(&start, NULL);
+
+	if (unlink(curfile->name) == -1) {
+		printf("error deleting %s in deletefile\n", curfile->name);
+		perror("deletefile");
+		exit(0);
+	}
+
+	if (need_stats) {
+		gettimeofday(&end, NULL);
+		do_stats(&start, &end, ft, fs, SYS_UNLINK);
+	}
+
+	rw_unlock_write(&curfile->lock);
+
+	ft_incr_op(ft, opnum, 1, 0);
+}
+
+void ffsb_open_close(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+	randdata_t *rd = ft_get_randdata(ft);
+	int fd;
+
+	curfile = choose_file_reader(bf, rd);
+	fd = fhopenread(curfile->name, ft, fs);
+	fhclose(fd, ft, fs);
+	unlock_file_reader(curfile);
+	ft_incr_op(ft, opnum, 1, 0);
+}
+
+void ffsb_stat(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *curfile = NULL;
+	randdata_t *rd = ft_get_randdata(ft);
+
+	curfile = choose_file_reader(bf, rd);
+	fhstat(curfile->name, ft, fs);
+	unlock_file_reader(curfile);
+
+	ft_incr_op(ft, opnum, 1, 0);
+}
+
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.h
new file mode 100644
index 0000000..9d35e94
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/fileops.h
@@ -0,0 +1,51 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _FILEOPS_H_
+#define _FILEOPS_H_
+
+#include "ffsb_thread.h"
+#include "ffsb.h"
+#include "ffsb_op.h"
+#include "ffsb_fs.h"
+
+void ffsb_readfile(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_readall(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_writefile(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_writefile_fsync(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_writeall(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_writeall_fsync(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_createfile(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_createfile_fsync(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_deletefile(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_appendfile(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_appendfile_fsync(ffsb_thread_t *tconfig, ffsb_fs_t *, unsigned opnum);
+void ffsb_stat(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum);
+void ffsb_open_close(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum);
+
+struct ffsb_op_results;
+
+void ffsb_read_print_exl(struct ffsb_op_results *, double secs, unsigned op_num);
+void ffsb_write_print_exl(struct ffsb_op_results *, double secs, unsigned op_num);
+void ffsb_create_print_exl(struct ffsb_op_results *, double secs, unsigned op_num);
+void ffsb_append_print_exl(struct ffsb_op_results *, double secs, unsigned op_num);
+
+/* Set up ops for either aging or benchmarking */
+void fop_bench(ffsb_fs_t *fs, unsigned opnum);
+void fop_age(ffsb_fs_t *fs, unsigned opnum);
+
+#endif /* _FILEOPS_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/install-sh b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/install-sh
new file mode 100755
index 0000000..4b1cd95
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/install-sh
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+
+	if [ -d $dst ]; then
+		instcmd=:
+		chmodcmd=""
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS=''
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ]
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename |
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ]
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.c
new file mode 100644
index 0000000..9a90284
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.c
@@ -0,0 +1,55 @@
+
+/*
+ * Simple list implementation mostly take from the Linux Kernel
+ */
+
+#include <stdlib.h>
+#include "list.h"
+
+void INIT_LIST_HEAD(struct list_head *list)
+{
+	list->next = list;
+	list->prev = list;
+}
+
+void __list_add(struct list_head *new,
+		struct list_head *prev,
+		struct list_head *next)
+{
+	next->prev = new;
+	new->next = next;
+	new->prev = prev;
+	prev->next = new;
+}
+
+void __list_del(struct list_head *prev, struct list_head *next)
+{
+	next->prev = prev;
+	prev->next = next;
+}
+
+void list_add(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head, head->next);
+}
+
+void list_add_tail(struct list_head *new, struct list_head *head)
+{
+	__list_add(new, head->prev, head);
+}
+
+void list_del(struct list_head *entry)
+{
+	__list_del(entry->prev, entry->next);
+	entry->next = NULL;
+	entry->prev = NULL;
+}
+
+void list_replace(struct list_head *old,
+		  struct list_head *new)
+{
+	new->next = old->next;
+	new->next->prev = new;
+	new->prev = old->prev;
+	new->prev->next = new;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.h
new file mode 100644
index 0000000..e14709d
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/list.h
@@ -0,0 +1,53 @@
+
+/*
+ * Simple list implementation mostly take from the Linux Kernel
+ */
+
+#ifndef _LIST_H_
+#define _LIST_H_
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+void INIT_LIST_HEAD(struct list_head *list);
+void __list_add(struct list_head *new, struct list_head *prev,
+		struct list_head *next);
+void __list_del(struct list_head *prev, struct list_head *next);
+void list_add(struct list_head *new, struct list_head *head);
+void list_add_tail(struct list_head *new, struct list_head *head);
+void list_del(struct list_head *entry);
+void list_replace(struct list_head *old, struct list_head *new);
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
+
+#define list_for_each(pos, head) \
+	for (pos = (head)->next; pos->next, pos != (head); pos = pos->next)
+
+#define offsetof(type, member) ((int) &((type *)0)->member)
+
+#define container_of(ptr, type, member) ({ \
+	const typeof(((type *)0)->member) *__mptr = (ptr); \
+	(type *)((char *)__mptr - offsetof(type, member)); })
+
+#define list_entry(ptr, type, member) \
+	container_of(ptr, type, member)
+
+#define list_for_each_entry(pos, head, member) \
+	for (pos = list_entry((head)->next, typeof(*pos), member);	\
+	     pos->member.next, &pos->member != (head); 	\
+	     pos = list_entry(pos->member.next, typeof(*pos), member))
+
+#define list_for_each_entry_safe(pos, n, head, member)			\
+	for (pos = list_entry((head)->next, typeof(*pos), member),	\
+		n = list_entry(pos->member.next, typeof(*pos), member);	\
+	     &pos->member != (head); 					\
+	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
+#define list_for_each_safe(pos, n, head) \
+	for (pos = (head)->next, n = pos->next; pos != (head); \
+		pos = n, n = pos->next)
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/main.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/main.c
new file mode 100644
index 0000000..abee1f3
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/main.c
@@ -0,0 +1,258 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <pthread.h>
+#include <sys/time.h>
+#include <sys/times.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <pthread.h>
+
+#include <assert.h>
+
+#include "config.h"
+
+#include "ffsb.h"
+#include "util.h"
+#include "parser.h"
+
+/* State information for the polling function below */
+struct ffsb_time_poll {
+	struct timeval starttime;
+	int wait_time;
+};
+
+/* This is the polling function used by the threadgroups to check
+ * elapsed time, when it returns 1 they know it is time to stop
+ */
+static int ffsb_poll_fn(void *ptr)
+{
+	struct ffsb_time_poll *data = (struct ffsb_time_poll *)ptr;
+	struct timeval curtime, difftime;
+	gettimeofday(&curtime, NULL);
+
+	timersub(&curtime, &data->starttime, &difftime);
+	if (difftime.tv_sec >= data->wait_time)
+		return 1;
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	int i;
+	ffsb_config_t fc;
+	ffsb_barrier_t thread_barrier, tg_barrier;
+	tg_run_params_t *params;
+	struct ffsb_time_poll pdata;
+	struct timeval starttime, endtime, difftime;
+	pthread_attr_t attr;
+	ffsb_op_results_t total_results;
+	double totaltime = 0.0f, usertime = 0.0f, systime = 0.0f;
+	struct rusage before_self, before_children, after_self, after_children;
+	pthread_t *fs_pts; /* threads to do filesystem creates in parallel */
+	char *callout = NULL;
+
+	char ctime_start_buf[32];
+	char ctime_end_buf[32];
+
+	memset(&before_self, 0, sizeof(before_self));
+	memset(&before_children, 0, sizeof(before_children));
+	memset(&after_self, 0, sizeof(after_self));
+	memset(&after_children, 0, sizeof(after_children));
+
+	ffsb_unbuffer_stdout();
+
+	if (argc < 2) {
+		fprintf(stderr, "usage: %s <config file>\n",
+			argv[0]);
+		exit(1);
+	}
+
+	/* VERSION comes from config.h (which is autogenerated by autoconf) */
+	printf("FFSB version %s started\n\n", VERSION);
+
+	ffsb_parse_newconfig(&fc, argv[1]);
+	pdata.wait_time = fc.time;
+
+	if (fc.time)
+		printf("benchmark time = %u\n", fc.time);
+	 else
+		printf("Only creating the fileset, not running benchmark.\n");
+
+	pthread_attr_init(&attr);
+	pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
+
+	for (i = 0; i < fc.num_threadgroups; i++)
+		tg_print_config(&fc.groups[i]);
+
+	fs_pts = ffsb_malloc(sizeof(pthread_t) * fc.num_filesys);
+
+	gettimeofday(&starttime, NULL);
+	for (i = 0; i < fc.num_filesys; i++) {
+		fs_print_config(&fc.filesystems[i]);
+		pthread_create(fs_pts + i, &attr, construct_ffsb_fs,
+			       &fc.filesystems[i]);
+	}
+
+	fflush(stdout);
+	for (i = 0; i < fc.num_filesys; i++)
+		pthread_join(fs_pts[i], NULL);
+
+	gettimeofday(&endtime, NULL);
+	timersub(&endtime, &starttime, &difftime);
+	printf("fs setup took %ld secs\n", difftime.tv_sec);
+	free(fs_pts);
+
+	if (fc.time == 0) {
+		printf("Setup complete, exiting\n");
+		return 0;
+	}
+
+	params = ffsb_malloc(sizeof(tg_run_params_t) * fc.num_threadgroups);
+
+	init_ffsb_op_results(&total_results);
+	ffsb_barrier_init(&thread_barrier, fc.num_totalthreads);
+	ffsb_barrier_init(&tg_barrier, fc.num_threadgroups + 1);
+
+	ffsb_sync();
+
+	/* Execute the callout if any and wait for it to return */
+	callout = fc_get_callout(&fc);
+	if (callout) {
+		printf("executing callout: \n %s\n", callout);
+		if (ffsb_system(callout) < 0) {
+			perror("system");
+			exit(1);
+		}
+	}
+
+	/* Spawn all of the threadgroup master threads */
+	for (i = 0; i < fc.num_threadgroups; i++) {
+		params[i].tg = &fc.groups[i];
+		params[i].fc = &fc;
+		params[i].poll_fn = ffsb_poll_fn;
+		params[i].poll_data = &pdata;
+		params[i].wait_time = FFSB_TG_WAIT_TIME;
+		params[i].tg_barrier = &tg_barrier;
+		params[i].thread_barrier = &thread_barrier;
+
+		pthread_create(&params[i].pt, &attr, tg_run, &params[i]);
+	}
+
+	ffsb_getrusage(&before_self, &before_children);
+	gettimeofday(&pdata.starttime, NULL);
+
+	ffsb_barrier_wait(&tg_barrier);  /* sync with tg's to start*/
+	printf("Starting Actual Benchmark At: %s\n",
+	       ctime_r(&pdata.starttime.tv_sec, ctime_start_buf));
+	fflush(stdout);
+
+	/* Wait for all of the threadgroup master threads to finish */
+	for (i = 0; i < fc.num_threadgroups; i++)
+		pthread_join(params[i].pt, NULL);
+
+	ffsb_sync();
+	gettimeofday(&endtime, NULL);
+	ffsb_getrusage(&after_self, &after_children);
+
+	printf("FFSB benchmark finished   at: %s\n",
+	       ctime_r(&endtime.tv_sec, ctime_end_buf));
+	printf("Results:\n");
+	fflush(stdout);
+
+	timersub(&endtime, &pdata.starttime, &difftime);
+
+	totaltime = tvtodouble(&difftime);
+
+	printf("Benchmark took %.2lf sec\n", totaltime);
+	printf("\n");
+
+	for (i = 0; i < fc.num_threadgroups; i++) {
+		struct ffsb_op_results tg_results;
+		ffsb_tg_t *tg = fc.groups + i;
+
+		init_ffsb_op_results(&tg_results);
+
+		/* Grab the individual tg results */
+		tg_collect_results(tg, &tg_results);
+
+		if (fc.num_threadgroups == 1)
+			printf("Total Results\n");
+		else
+			printf("ThreadGroup %d\n", i);
+
+		printf("===============\n");
+		print_results(&tg_results, totaltime);
+
+		if (tg_needs_stats(tg)) {
+			ffsb_statsd_t fsd;
+			tg_collect_stats(tg, &fsd);
+			ffsb_statsd_print(&fsd);
+		}
+		printf("\n");
+
+		/* Add the tg results to the total */
+		tg_collect_results(&fc.groups[i], &total_results);
+	}
+
+	if (fc.num_threadgroups > 1) {
+		printf("Total Results\n");
+		printf("===============\n");
+		print_results(&total_results, totaltime);
+	}
+
+#define USEC_PER_SEC ((double)(1000000.0f))
+
+	/* sum up self and children after */
+	usertime = (after_self.ru_utime.tv_sec +
+		    ((after_self.ru_utime.tv_usec)/USEC_PER_SEC)) +
+		((after_children.ru_utime.tv_sec +
+		  ((after_children.ru_utime.tv_usec)/USEC_PER_SEC)));
+
+	/* subtract away the before */
+	usertime -= (before_self.ru_utime.tv_sec +
+		     ((before_self.ru_utime.tv_usec)/USEC_PER_SEC)) +
+		((before_children.ru_utime.tv_sec +
+		  ((before_children.ru_utime.tv_usec)/USEC_PER_SEC)));
+
+
+	/* sum up self and children after */
+	systime = (after_self.ru_stime.tv_sec +
+		   ((after_self.ru_stime.tv_usec)/USEC_PER_SEC)) +
+		((after_children.ru_stime.tv_sec +
+		  ((after_children.ru_stime.tv_usec)/USEC_PER_SEC)));
+
+	/* subtract away the before */
+	systime -= (before_self.ru_stime.tv_sec +
+		    ((before_self.ru_stime.tv_usec)/USEC_PER_SEC)) +
+		((before_children.ru_stime.tv_sec +
+		  ((before_children.ru_stime.tv_usec)/USEC_PER_SEC)));
+
+	printf("\n\n");
+	printf("%.1lf%% User   Time\n", 100 * usertime / totaltime);
+	printf("%.1lf%% System Time\n", 100 * systime / totaltime);
+	printf("%.1f%% CPU Utilization\n", 100 * (usertime + systime) /
+	       totaltime);
+	free(params);
+	destroy_ffsb_config(&fc);
+
+	return 0;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.c
new file mode 100644
index 0000000..c9e2409
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.c
@@ -0,0 +1,112 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "ffsb.h"
+#include "metaops.h"
+#include "rand.h"
+#include "filelist.h"
+
+/* metaops:
+ *  createdir
+ *  removedir
+ *  renamedir
+ *  renamefile
+ */
+
+void metaops_metadir(ffsb_fs_t *fs, unsigned opnum)
+{
+	fs_set_opdata(fs, fs_get_metafiles(fs), opnum);
+}
+
+static void createdir(struct benchfiles *dirs, randdata_t *rd)
+{
+	struct ffsb_file *newdir;
+
+	newdir = add_file(dirs, 0, rd);
+	if (mkdir(newdir->name, S_IRWXU) < 0) {
+		perror("mkdir");
+		exit(1);
+	}
+	unlock_file_writer(newdir);
+}
+
+static void removedir(struct benchfiles *dirs, randdata_t *rd)
+{
+	struct ffsb_file *deldir;
+
+	deldir = choose_file_writer(dirs, rd);
+	remove_file(dirs, deldir);
+
+	if (rmdir(deldir->name) < 0) {
+		perror("rmdir");
+		exit(1);
+	}
+	unlock_file_writer(deldir);
+}
+
+static void renamedir(struct benchfiles *dirs, randdata_t *rd)
+{
+	struct ffsb_file *dir;
+	char *oldname;
+
+	dir = choose_file_writer(dirs, rd);
+	oldname = dir->name;
+	rename_file(dir);
+
+	if (rename(oldname, dir->name) < 0) {
+		perror("rename");
+		exit(1);
+	}
+	unlock_file_writer(dir);
+	free(oldname);
+}
+
+void ffsb_metaops(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	randdata_t *rd = ft_get_randdata(ft);
+
+	createdir(bf, rd);
+	createdir(bf, rd);
+	removedir(bf, rd);
+	renamedir(bf, rd);
+
+	ft_incr_op(ft, opnum, 1, 0);
+}
+
+void ffsb_createdir(ffsb_thread_t *ft, ffsb_fs_t *fs, unsigned opnum)
+{
+	struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
+	struct ffsb_file *newdir;
+	randdata_t *rd = ft_get_randdata(ft);
+
+	newdir = add_dir(bf, 0, rd);
+	if (mkdir(newdir->name, S_IRWXU) < 0) {
+		perror("mkdir");
+		exit(1);
+	}
+	unlock_file_writer(newdir);
+
+	ft_incr_op(ft, opnum, 1, 0);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.h
new file mode 100644
index 0000000..04cbe9f
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/metaops.h
@@ -0,0 +1,28 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _METAOPS_H_
+#define _METAOPS_H_
+
+#include "ffsb.h"
+#include "fileops.h"
+
+void ffsb_metaops(struct ffsb_thread *, ffsb_fs_t *, unsigned);
+void ffsb_createdir(struct ffsb_thread *, ffsb_fs_t *, unsigned);
+void metaops_metadir(ffsb_fs_t *, unsigned);
+
+#endif /* _METAOPS_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/missing b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/missing
new file mode 100755
index 0000000..6a37006
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/missing
@@ -0,0 +1,336 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing 0.4 - GNU automake"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1Help2man' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f y.tab.h ]; then
+	echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+	case "$LASTARG" in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if [ -f "$SRCFILE" ]; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit 1
+    fi
+    ;;
+
+  makeinfo)
+    if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
+       # We have makeinfo, but it failed.
+       exit 1
+    fi
+
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+    if test -n "$run"; then
+      echo 1>&2 "ERROR: \`tar' requires --run"
+      exit 1
+    fi
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+	case "$firstarg" in
+	*o*)
+	    firstarg=`echo "$firstarg" | sed s/o//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+	case "$firstarg" in
+	*h*)
+	    firstarg=`echo "$firstarg" | sed s/h//`
+	    tar "$firstarg" "$@" && exit 0
+	    ;;
+	esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/mkinstalldirs b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/mkinstalldirs
new file mode 100755
index 0000000..1790da1
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1 2009/10/26 11:25:55 subrata_modak Exp $
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.c
new file mode 100644
index 0000000..1c2b780
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.c
@@ -0,0 +1,1033 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <inttypes.h>
+#include <ctype.h>
+
+#include "ffsb.h"
+#include "parser.h"
+#include "ffsb_tg.h"
+#include "ffsb_stats.h"
+#include "util.h"
+#include "list.h"
+
+#define BUFSIZE 1024
+
+config_options_t global_options[] = GLOBAL_OPTIONS;
+config_options_t tg_options[] = THREADGROUP_OPTIONS;
+config_options_t fs_options[] = FILESYSTEM_OPTIONS;
+config_options_t stats_options[] = STATS_OPTIONS;
+container_desc_t container_desc[] = CONTAINER_DESC;
+
+/* strips out whitespace and comments, returns NULL on eof */
+void parseerror(char *msg)
+{
+	fprintf(stderr, "Error parsing %s\n", msg);
+	exit(1);
+}
+
+static char *get_next_line(FILE *f)
+{
+	static char buf[BUFSIZE];
+	char *ret, *tmp;
+	int flag = 1;
+	while (flag) {
+		ret = fgets(buf, BUFSIZE, f);
+		if (ret == NULL)
+			return NULL;
+		ret = buf;
+		while (isspace(*ret))
+			ret++;
+
+		if ((*ret == COMMENT_CHAR) || (*ret == '\0'))
+			continue;
+
+		tmp = ret;
+		while (*tmp != '\0') {
+			if (*tmp == COMMENT_CHAR) {
+				*tmp = '\0';
+				break;
+			}
+			tmp++;
+		}
+		flag = 0;
+	}
+	return ret;
+}
+
+static char *strip_space(char *buf)
+{
+	int len;
+	char *tmp, *tmp2;
+	int flag = 1;
+
+	len = strnlen(buf, BUFSIZE);
+	tmp = malloc(sizeof(char) * len);
+	memset(tmp, 0, sizeof(char) * len);
+	tmp2 = tmp;
+	while (flag) {
+		if (!isspace(*buf)) {
+			*tmp = *buf;
+			tmp++;
+		}
+		buf++;
+		if (*buf != '\0')
+			continue;
+		flag = 0;
+	}
+	return tmp2;
+}
+
+static uint64_t size64_convert(char *buf)
+{
+	size_t buf_size = strlen(buf);
+	char unit[3] = {0};
+	char search_str[256];
+	uint64_t size;
+	uint64_t multiplier = 1;
+	int i;
+
+	if (buf_size == 1)
+		goto out;
+
+	strcpy(unit, buf + (buf_size - 2));
+	for (i = 0; i < 2; i++) {
+		if (isdigit(unit[i]))
+			goto try_single;
+		unit[i] = toupper(unit[i]);
+	}
+	goto do_multiplier;
+
+try_single:
+	memcpy(unit, "\0", 3);
+	strcpy(unit, buf + (buf_size - 1));
+	if (isdigit(unit[0])) {
+		unit[0] = 0;
+		goto out;
+	}
+	unit[0] = toupper(unit[0]);
+
+do_multiplier:
+	if (!strcmp("KB", unit) || !strcmp("K", unit))
+		multiplier = 1024;
+	if (!strcmp("MB", unit) || !strcmp("M", unit))
+		multiplier = 1048576;
+	if (!strcmp("GB", unit) || !strcmp("G", unit))
+		multiplier = 1073741824;
+	if (multiplier == 1) {
+		unit[0] = 0;
+		multiplier = 0;
+	}
+out:
+	sprintf(search_str, "%%llu%s", unit);
+	if (1 == sscanf(buf, search_str, &size))
+		return size * multiplier;
+	return 0;
+}
+
+static uint64_t *get_opt64(char *buf, char string[])
+{
+	char search_str[256];
+	char *line = strip_space(buf);
+	uint64_t temp;
+	uint64_t *ret;
+
+	sprintf(search_str, "%s=%%llu\\n", string);
+	if (1 == sscanf(line, search_str, &temp)) {
+		ret = malloc(sizeof(uint64_t));
+		*ret = temp;
+		return ret;
+	}
+	free(line);
+	return NULL;
+}
+
+static uint32_t *get_opt32(char *buf, char string[])
+{
+	uint32_t *ret;
+	uint64_t *res;
+	res = get_opt64(buf, string);
+	if (res) {
+		ret = malloc(sizeof(uint32_t));
+		*ret = *res;
+		free(res);
+		return ret;
+	}
+	return NULL;
+}
+
+static uint8_t *get_optbool(char *buf, char string[])
+{
+	uint8_t *ret;
+	uint64_t *res;
+	res = get_opt64(buf, string);
+	if (res) {
+		if ((int)*res < 0 || (int)*res > 1) {
+			printf("Error in: %s", buf);
+			printf("%llu not boolean\n", (long long unsigned) *res);
+			exit(1);
+		}
+		ret = malloc(sizeof(uint8_t));
+		*ret = *res;
+		free(res);
+		return ret;
+	}
+	return NULL;
+}
+
+static char *get_optstr(char *buf, char string[])
+{
+	char search_str[256];
+	char *line = strip_space(buf);
+	char *ret_buf;
+	char temp[BUFSIZE];
+	int len;
+
+	len = strnlen(string, BUFSIZE);
+	sprintf(search_str, "%s=%%%ds\\n", string, BUFSIZE - len-1);
+	if (1 == sscanf(line, search_str, &temp)) {
+		len = strnlen(temp, 4096);
+		ret_buf = malloc(len);
+		strncpy(ret_buf, temp, len);
+		return ret_buf;
+		}
+	free(line);
+	return NULL;
+}
+
+static double *get_optdouble(char *buf, char string[])
+{
+	char search_str[256];
+	char *line = strip_space(buf);
+	double temp;
+	double *ret;
+
+	sprintf(search_str, "%s=%%lf\\n", string);
+	if (1 == sscanf(line, search_str, &temp)) {
+		ret = malloc(sizeof(double));
+		*ret = temp;
+		return ret;
+	}
+	free(line);
+	return NULL;
+}
+
+static range_t *get_optrange(char *buf, char string[])
+{
+	char search_str[256];
+	double a, b;
+	range_t *ret;
+
+	sprintf(search_str, "%s %%lf %%lf\\n", string);
+	if (2 == sscanf(buf, search_str, &a, &b)) {
+		ret = malloc(sizeof(struct range));
+		ret->a = a;
+		ret->b = b;
+		return ret;
+	}
+	return NULL;
+}
+
+static size_weight_t *get_optsizeweight(char *buf, char string[])
+{
+	char search_str[256];
+	char size[256];
+	int weight;
+	size_weight_t *ret;
+
+	sprintf(search_str, "%s %%s %%d\\n", string);
+	if (2 == sscanf(buf, search_str, &size, &weight)) {
+		ret = malloc(sizeof(struct size_weight));
+		ret->size = size64_convert(size);
+		ret->weight = weight;
+		return ret;
+	}
+	return NULL;
+}
+
+static uint64_t * get_optsize64(char *buf, char string[])
+{
+	char search_str[256];
+	char *line = strip_space(buf);
+	char temp[256];
+	uint64_t size;
+	uint64_t *ret = NULL;
+
+	sprintf(search_str, "%s=%%s\\n", string);
+	if (1 == sscanf(line, search_str, &temp)) {
+		ret = malloc(sizeof(uint64_t));
+		*ret = size64_convert(temp);
+	}
+	free(line);
+	return ret;
+}
+
+static uint32_t * get_optsize32(char *buf, char string [])
+{
+	uint32_t *ret;
+	uint64_t *res;
+	res = get_optsize64(buf, string);
+	if (res) {
+		ret = malloc(sizeof(uint32_t));
+		*ret = *res;
+		free(res);
+		return ret;
+	}
+	return NULL;
+}
+
+static uint64_t *get_deprecated(char *buf, char string[])
+{
+	char search_str[256];
+	char temp[BUFSIZE];
+	int len;
+
+	len = strnlen(string, BUFSIZE);
+	sprintf(search_str, "%s%%%ds\\n", string, BUFSIZE - len-1);
+	if (1 == sscanf(buf, search_str, &temp))
+		printf("WARNING: The \"%s\" option is deprecated!!!\n", string);
+
+	return NULL;
+}
+
+static container_t *init_container(void)
+{
+	container_t *container;
+	container = malloc(sizeof(container_t));
+	container->config = NULL;
+	container->type = 0;
+	container->next = NULL;
+	return container;
+}
+
+static int set_option(char *buf, config_options_t *options)
+{
+	void *value;
+
+	while (options->name) {
+		switch (options->type) {
+		case TYPE_WEIGHT:
+		case TYPE_U32:
+			value = get_opt32(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_U64:
+			value = get_opt64(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_STRING:
+			value = get_optstr(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_BOOLEAN:
+			value = get_optbool(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_DOUBLE:
+			value = get_optdouble(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_RANGE:
+			value = get_optrange(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_SIZEWEIGHT:
+			value = get_optsizeweight(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_DEPRECATED:
+			value = get_deprecated(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_SIZE32:
+			value = get_optsize32(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		case TYPE_SIZE64:
+			value = get_optsize64(buf, options->name);
+			if (value)
+				goto out;
+			break;
+		default:
+			printf("Unknown type\n");
+			break;
+		}
+		options++;
+	}
+	return 0;
+
+out:
+	if (options->storage_type == STORE_SINGLE)
+		options->value = value;
+	if (options->storage_type == STORE_LIST) {
+		if (!options->value) {
+			value_list_t *lhead;
+			lhead = malloc(sizeof(struct value_list));
+			INIT_LIST_HEAD(&lhead->list);
+			options->value = lhead;
+		}
+		value_list_t *tmp_list, *tmp_list2;
+		tmp_list = malloc(sizeof(struct value_list));
+		INIT_LIST_HEAD(&tmp_list->list);
+		tmp_list->value = value;
+		tmp_list2 = (struct value_list *)options->value;
+		list_add(&(tmp_list->list), &(tmp_list2->list));
+	}
+
+	return 1;
+}
+
+void insert_container(container_t *container, container_t *new_container)
+{
+	while (container->next)
+		container = container->next;
+	container->next = new_container;
+}
+
+container_t *search_group(char *, FILE *);
+
+container_t *handle_container(char *buf, FILE *f, uint32_t type,
+			      config_options_t *options)
+{
+	container_desc_t *desc = container_desc;
+	container_t *ret_container;
+	container_t *tmp_container, *tmp2_container;
+	container_t *child = NULL;
+	int is_option;
+
+	while (desc->name)
+		if (desc->type == type)
+			break;
+		else
+			desc++;
+
+	if (!desc->name)
+		return NULL;
+
+	buf = get_next_line(f);
+	while (buf) {
+		is_option = set_option(buf, options);
+		tmp_container = search_group(buf, f);
+		if (tmp_container) {
+			if (tmp_container->type == END) {
+				free(tmp_container);
+				break;
+			} else {
+				if (child == NULL)
+					child = tmp_container;
+				else {
+					tmp2_container = child;
+					while (tmp2_container->next)
+						tmp2_container = tmp2_container->next;
+					tmp2_container->next = tmp_container;
+				}
+
+			}
+		}
+		if (!is_option && !tmp_container) {
+			printf("ERROR!!! Unknow option: %s", buf);
+			exit(1);
+		}
+		buf = get_next_line(f);
+	}
+	ret_container = init_container();
+	ret_container->config = options;
+	ret_container->type = type;
+	if (child)
+		ret_container->child = child;
+
+	return ret_container;
+}
+
+container_t *search_group(char *buf, FILE *f)
+{
+	char temp[BUFSIZE];
+	char *ptr;
+	config_options_t *options;
+	container_desc_t *desc = container_desc;
+	container_t *ret_container;
+
+	if (1 == sscanf(buf, "[%s]\n", (char *) &temp))
+		while (desc->name) {
+			ptr = strstr(buf, desc->name);
+			if (ptr)
+				switch (desc->type) {
+				case FILESYSTEM:
+					options = malloc(sizeof(fs_options));
+					memcpy(options, fs_options,
+					       sizeof(fs_options));
+					return handle_container(buf, f,
+								desc->type,
+								options);
+					break;
+				case THREAD_GROUP:
+					options = malloc(sizeof(tg_options));
+					memcpy(options, tg_options,
+					       sizeof(tg_options));
+					return handle_container(buf, f,
+								desc->type,
+								options);
+					break;
+				case STATS:
+					options = malloc(sizeof(stats_options));
+					memcpy(options, stats_options,
+					       sizeof(stats_options));
+					return handle_container(buf, f,
+								desc->type,
+								options);
+					break;
+				case END:
+					ret_container = init_container();
+					ret_container->type = END;
+					return ret_container;
+					break;
+				}
+			desc++;
+		}
+	return NULL;
+}
+
+void *get_value(config_options_t *config, char *name)
+{
+	while (config->name) {
+		if (!strcmp(config->name, name)) {
+			if (config->value)
+				return config->value;
+			else
+				return NULL;
+		}
+		config++;
+	}
+	return 0;
+}
+
+char *get_config_str(config_options_t *config, char *name)
+{
+	return get_value(config, name);
+}
+
+uint32_t get_config_u32(config_options_t *config, char *name)
+{
+	void *value = get_value(config, name);
+	if (value)
+		return *(uint32_t *)value;
+	return 0;
+}
+
+uint8_t get_config_bool(config_options_t *config, char *name)
+{
+	void *value = get_value(config, name);
+	if (value)
+		return *(uint8_t *)value;
+	return 0;
+}
+
+uint64_t get_config_u64(config_options_t *config, char *name)
+{
+	void *value = get_value(config, name);
+	if (value)
+		return *(uint64_t *)value;
+	return 0;
+}
+
+double get_config_double(config_options_t *config, char *name)
+{
+	void *value = get_value(config, name);
+	if (value)
+		return *(double *)value;
+	return 0;
+}
+
+static profile_config_t *parse(FILE *f)
+{
+	char *buf;
+	profile_config_t *profile_conf;
+	container_t *tmp_container;
+
+	profile_conf = malloc(sizeof(profile_config_t));
+	profile_conf->global = malloc(sizeof(global_options));
+	memcpy(profile_conf->global, global_options, sizeof(global_options));
+	profile_conf->fs_container = NULL;
+	profile_conf->tg_container = NULL;
+	int is_option;
+	buf = get_next_line(f);
+
+	while (buf) {
+		is_option = set_option(buf, profile_conf->global);
+		tmp_container = search_group(buf, f);
+		if (tmp_container)
+			switch (tmp_container->type) {
+			case FILESYSTEM:
+				if (profile_conf->fs_container == NULL)
+					profile_conf->fs_container = tmp_container;
+				else
+					insert_container(profile_conf->fs_container,
+							 tmp_container);
+				break;
+			case THREAD_GROUP:
+				if (profile_conf->tg_container == NULL)
+					profile_conf->tg_container = tmp_container;
+				else
+					insert_container(profile_conf->tg_container,
+							 tmp_container);
+				break;
+			default:
+				break;
+			}
+		if (!is_option && !tmp_container) {
+			printf("ERROR!!! Unknow option: %s", buf);
+			exit(1);
+		}
+		buf = get_next_line(f);
+	}
+	return profile_conf;
+}
+
+void set_weight(ffsb_tg_t *tg, config_options_t *config)
+{
+	char *op;
+	int len;
+	config_options_t *tmp_config = config;
+
+	while (tmp_config->name) {
+		if (tmp_config->type == TYPE_WEIGHT) {
+			len = strlen(tmp_config->name);
+			op = malloc(sizeof(char) * len - 6);
+			memset(op, 0, sizeof(char) * len - 6);
+			strncpy (op, tmp_config->name, len - 7);
+			tg_set_op_weight(tg, op,
+					 get_config_u32(config,
+							tmp_config->name));
+			free(op);
+		}
+		tmp_config++;
+	}
+}
+
+int get_weight_total(ffsb_tg_t *tg)
+{
+	char *op;
+	int len;
+	int total = 0;
+	config_options_t *tmp_config = tg_options;
+
+	while (tmp_config->name) {
+		if (tmp_config->type == TYPE_WEIGHT) {
+			len = strlen(tmp_config->name);
+			op = malloc(sizeof(char) * len - 6);
+			memset(op, 0, sizeof(char) * len - 6);
+			strncpy (op, tmp_config->name, len - 7);
+			total += tg_get_op_weight(tg, op);
+			free(op);
+		}
+		tmp_config++;
+	}
+	return total;
+}
+
+/* !!! hackish verification function, we should somehow roll this into the */
+/* op descriptions/struct themselves at some point with a callback verify */
+/* op requirements: */
+/* require tg->read_blocksize:  read, readall */
+/* require tg->write_blocksize: write, create, append, rewritefsync */
+/* */
+
+static int verify_tg(ffsb_tg_t *tg)
+{
+	uint32_t read_weight    = tg_get_op_weight(tg, "read");
+	uint32_t readall_weight = tg_get_op_weight(tg, "readall");
+	uint32_t write_weight   = tg_get_op_weight(tg, "write");
+	uint32_t create_weight  = tg_get_op_weight(tg, "create");
+	uint32_t append_weight  = tg_get_op_weight(tg, "append");
+	uint32_t createdir_weight = tg_get_op_weight(tg, "createdir");
+	uint32_t delete_weight    = tg_get_op_weight(tg, "delete");
+	uint32_t writeall_weight = tg_get_op_weight(tg, "writeall");
+	uint32_t writeall_fsync_weight = tg_get_op_weight(tg, "writeall_fsync");
+
+	uint32_t sum_weight = get_weight_total(tg);
+
+	uint32_t read_blocksize  = tg_get_read_blocksize(tg);
+	uint32_t write_blocksize = tg_get_write_blocksize(tg);
+
+	int read_random          = tg_get_read_random(tg);
+	int read_skip            = tg_get_read_skip(tg);
+	uint32_t read_skipsize   = tg_get_read_skipsize(tg);
+
+	if (sum_weight == 0) {
+		printf("Error: A threadgroup must have at least one weighted "
+		       "operation\n");
+		return 1;
+	}
+
+	if ((read_weight || readall_weight) && !(read_blocksize)) {
+		printf("Error: read and readall operations require a "
+		       "read_blocksize\n");
+		return 1;
+	}
+
+	if ((write_weight || create_weight || append_weight || writeall_weight
+	     || writeall_fsync_weight) && !(write_blocksize)) {
+		printf("Error: write, writeall, create, append"
+		       "operations require a write_blocksize\n");
+		return 1;
+	}
+
+	if (read_random && read_skip) {
+		printf("Error: read_random and read_skip are mutually "
+		       "exclusive\n");
+		return 1;
+	}
+
+	if (read_skip && !(read_skipsize)) {
+		printf("Error: read_skip specified but read_skipsize is "
+		       "zero\n");
+		return 1;
+	}
+
+	return 0;
+}
+
+static unsigned get_num_containers(container_t *container)
+{
+	int numtg = 0;
+	while (container) {
+		numtg++;
+		container = container->next;
+	}
+	return numtg;
+}
+
+static unsigned get_num_threadgroups(profile_config_t *profile_conf)
+{
+	return get_num_containers(profile_conf->tg_container);
+}
+
+static unsigned get_num_filesystems(profile_config_t *profile_conf)
+{
+	return get_num_containers(profile_conf->fs_container);
+}
+
+static int get_num_totalthreads(profile_config_t *profile_conf)
+{
+	int num_threads = 0;
+	container_t *tg = profile_conf->tg_container;
+	config_options_t *tg_config;
+
+	while (tg) {
+		tg_config = tg->config;
+		while (tg_config->name) {
+			if (!strcmp(tg_config->name, "num_threads"))
+				num_threads += *(uint32_t *) tg_config->value;
+			tg_config++;
+		}
+		if (tg->next)
+			tg = tg->next;
+		else
+			break;
+	}
+
+	return num_threads;
+}
+
+container_t *get_container(container_t *head_cont, int pos)
+{
+	int count = 0;
+	while (head_cont) {
+		if (count == pos)
+			return head_cont;
+		head_cont = head_cont->next;
+		count++;
+	}
+	return NULL;
+}
+
+config_options_t *get_fs_config(ffsb_config_t *fc, int pos)
+{
+	container_t *tmp_cont;
+
+	assert(pos < fc->num_filesys);
+	tmp_cont = get_container(fc->profile_conf->fs_container, pos);
+	if (tmp_cont)
+		return tmp_cont->config;
+	return NULL;
+}
+
+container_t *get_fs_container(ffsb_config_t *fc, int pos)
+{
+	assert(pos < fc->num_filesys);
+	return get_container(fc->profile_conf->fs_container, pos);
+}
+
+config_options_t *get_tg_config(ffsb_config_t *fc, int pos)
+{
+	container_t *tmp_cont;
+
+	assert(pos < fc->num_threadgroups);
+	tmp_cont = get_container(fc->profile_conf->tg_container, pos);
+	if (tmp_cont)
+		return tmp_cont->config;
+	return NULL;
+}
+
+container_t *get_tg_container(ffsb_config_t *fc, int pos)
+{
+	assert(pos < fc->num_threadgroups);
+	return get_container(fc->profile_conf->tg_container, pos);
+}
+
+static void init_threadgroup(ffsb_config_t *fc, config_options_t *config,
+			    ffsb_tg_t *tg, int tg_num)
+{
+	int num_threads;
+	memset(tg, 0, sizeof(ffsb_tg_t));
+
+	num_threads = get_config_u32(config, "num_threads");
+
+	init_ffsb_tg(tg, num_threads, tg_num);
+
+	if (get_config_str(config, "bindfs")) {
+		int i;
+		config_options_t *tmp_config;
+		for (i = 0; i < fc->num_filesys; i++) {
+			tmp_config = get_fs_config(fc, i);
+			if (!strcmp(get_config_str(config, "bindfs"),
+				    get_config_str(tmp_config, "location")))
+				break;
+		}
+		if (strcmp(get_config_str(config, "bindfs"),
+			   get_config_str(tmp_config, "location"))) {
+			printf ("Bind fs failed:  Base fs \"%s\" not found\n",
+				get_config_str(config, "bindfs"));
+			exit(1);
+		}
+		printf("%d\n", i);
+		tg->bindfs = i;
+	}
+
+	tg->read_random = get_config_bool(config, "read_random");
+	tg->read_size = get_config_u64(config, "read_size");
+	tg->read_skip = get_config_bool(config, "read_skip");
+	tg->read_skipsize = get_config_u32(config, "read_skipsize");
+
+	tg->write_random = get_config_bool(config, "write_random");
+	tg->write_size = get_config_u64(config, "write_size");
+	tg->fsync_file = get_config_bool(config, "fsync_file");
+
+	tg->wait_time = get_config_u32(config, "op_delay");
+
+	tg_set_read_blocksize(tg, get_config_u32(config, "read_blocksize"));
+	tg_set_write_blocksize(tg, get_config_u32(config, "write_blocksize"));
+
+	set_weight(tg, config);
+
+	if (verify_tg(tg)) {
+		printf("threadgroup %d verification failed\n", tg_num);
+		exit(1);
+	}
+}
+
+static void init_filesys(ffsb_config_t *fc, int num)
+{
+	config_options_t *config = get_fs_config(fc, num);
+	profile_config_t *profile_conf = fc->profile_conf;
+	ffsb_fs_t *fs = &fc->filesystems[num];
+	value_list_t *tmp_list, *list_head;
+
+	memset(fs, 0, sizeof(ffsb_fs_t));
+
+	fs->basedir = get_config_str(config, "location");
+
+	if (get_config_str(config, "clone")) {
+		int i;
+		config_options_t *tmp_config;
+		for (i = 0; i < fc->num_filesys; i++) {
+			tmp_config = get_fs_config(fc, i);
+			if (!strcmp(get_config_str(config, "clone"),
+				    get_config_str(tmp_config, "location")))
+				break;
+		}
+		if (strcmp(get_config_str(config, "clone"),
+			   get_config_str(tmp_config, "location"))) {
+			printf ("Clone fs failed:  Base fs \"%s\" not found\n",
+				get_config_str(config, "clone"));
+			exit(1);
+		}
+		config = tmp_config;
+	}
+
+	fs->num_dirs = get_config_u32(config, "num_dirs");
+	fs->num_start_files = get_config_u32(config, "num_files");
+	fs->minfilesize = get_config_u64(config, "min_filesize");
+	fs->maxfilesize = get_config_u64(config, "max_filesize");
+	fs->desired_fsutil = get_config_double(config, "desired_util");
+	fs->init_fsutil = get_config_double(config, "init_util");
+	fs->init_size = get_config_u64(config, "init_size");
+
+	fs->flags = 0;
+	if (get_config_bool(config, "reuse"))
+		fs->flags |= FFSB_FS_REUSE_FS;
+
+	if (get_config_bool(profile_conf->global, "directio"))
+		fs->flags |= FFSB_FS_DIRECTIO | FFSB_FS_ALIGNIO4K;
+
+	if (get_config_bool(profile_conf->global, "bufferio"))
+		fs->flags |= FFSB_FS_LIBCIO;
+
+	if (get_config_bool(profile_conf->global, "alignio"))
+		fs->flags |= FFSB_FS_ALIGNIO4K;
+
+	if (get_config_bool(config, "agefs")) {
+		container_t *age_cont = get_fs_container(fc, num);
+		if (!age_cont->child) {
+			printf("No age threaggroup in profile");
+			exit(1);
+		}
+
+		age_cont = age_cont->child;
+		ffsb_tg_t *age_tg = ffsb_malloc(sizeof(ffsb_tg_t));
+		init_threadgroup(fc, age_cont->config, age_tg, 0);
+		fs->aging_tg = age_tg;
+		fs->age_fs = 1;
+	}
+
+	if (get_config_u32(config, "create_blocksize"))
+		fs->create_blocksize = get_config_u32(config,
+							"create_blocksize");
+	else
+		fs->create_blocksize = FFSB_FS_DEFAULT_CREATE_BLOCKSIZE;
+
+	if (get_config_u32(config, "age_blocksize"))
+		fs->age_blocksize = get_config_u32(config, "age_blocksize");
+	else
+		fs->age_blocksize = FFSB_FS_DEFAULT_AGE_BLOCKSIZE;
+
+	list_head = (value_list_t *) get_value(config, "size_weight");
+	if (list_head) {
+		int count = 0;
+		size_weight_t *sizew;
+		list_for_each_entry(tmp_list, &list_head->list, list)
+			count++;
+
+		fs->num_weights=count;
+		fs->size_weights = malloc(sizeof(size_weight_t) * fs->num_weights);
+
+		count = 0;
+		list_for_each_entry(tmp_list, &list_head->list, list) {
+			sizew = (size_weight_t *)tmp_list->value;
+			fs->size_weights[count].size = sizew->size;
+			fs->size_weights[count].weight = sizew->weight;
+			fs->sum_weights += sizew->weight;
+			count++;
+		}
+	}
+}
+
+static void init_tg_stats(ffsb_config_t *fc, int num)
+{
+	config_options_t *config;
+	container_t *tmp_cont;
+	value_list_t *tmp_list, *list_head;
+	syscall_t sys;
+	ffsb_statsc_t fsc = { 0, };
+	char *sys_name;
+	range_t *bucket_range;
+	uint32_t min, max;
+
+	tmp_cont = get_tg_container(fc, num);
+	if (tmp_cont->child) {
+		if (tmp_cont->type == STATS) {
+			config = tmp_cont->config;
+			if (get_config_bool(config, "enable_stats")) {
+
+				list_head = (value_list_t *) get_value(config, "ignore");
+				if (list_head)
+					list_for_each_entry(tmp_list,
+							    &list_head->list, list) {
+						sys_name = (char *)tmp_list->value;
+						ffsb_stats_str2syscall(sys_name, &sys);
+						ffsb_statsc_ignore_sys(&fsc, sys);
+					}
+
+				list_head = (value_list_t *) get_value(config, "msec_range");
+				if (list_head && get_config_bool(config, "enable_range"))
+					list_for_each_entry(tmp_list,
+							    &list_head->list, list) {
+						bucket_range = (range_t *)tmp_list->value;
+						min = (uint32_t)(bucket_range->a * 1000.0f);
+						max = (uint32_t)(bucket_range->b * 1000.0f);
+						ffsb_statsc_addbucket(&fsc, min, max);
+					}
+
+				tg_set_statsc(&fc->groups[num], &fsc);
+			}
+		}
+	}
+}
+
+static void init_config(ffsb_config_t *fc, profile_config_t *profile_conf)
+{
+	config_options_t *config;
+	container_t *tmp_cont;
+	int i;
+
+	fc->time = get_config_u32(profile_conf->global, "time");
+	fc->num_filesys = get_num_filesystems(profile_conf);
+	fc->num_threadgroups = get_num_threadgroups(profile_conf);
+	fc->num_totalthreads = get_num_totalthreads(profile_conf);
+	fc->profile_conf = profile_conf;
+	fc->callout = get_config_str(profile_conf->global, "callout");
+
+	fc->filesystems = ffsb_malloc(sizeof(ffsb_fs_t) * fc->num_filesys);
+	for (i = 0; i < fc->num_filesys; i++)
+		init_filesys(fc, i);
+
+	fc->groups = ffsb_malloc(sizeof(ffsb_tg_t) * fc->num_threadgroups);
+	for (i = 0; i < fc->num_threadgroups; i++) {
+		config = get_tg_config(fc, i);
+		init_threadgroup(fc, config, &fc->groups[i], i);
+		init_tg_stats(fc, i);
+	}
+}
+
+void ffsb_parse_newconfig(ffsb_config_t *fc, char *filename)
+{
+	FILE *f;
+
+	profile_config_t *profile_conf;
+
+	f = fopen(filename, "r");
+	if (f == NULL) {
+		perror(filename);
+		exit(1);
+	}
+	profile_conf = parse(f);
+	fclose(f);
+
+	init_config(fc, profile_conf);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.h
new file mode 100644
index 0000000..3df4ffe
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/parser.h
@@ -0,0 +1,151 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _PARSER_H_
+#define _PARSER_H_
+
+#include "ffsb.h"
+#include "list.h"
+
+#define COMMENT_CHAR	'#'
+
+#define STORE_SINGLE		0x0001
+#define STORE_LIST		0x0002
+
+#define TYPE_U32		0x0001
+#define	TYPE_U64		0x0002
+#define TYPE_STRING		0x0004
+#define TYPE_BOOLEAN		0x0008
+#define TYPE_DOUBLE		0x0010
+#define TYPE_RANGE		0x0020
+#define TYPE_SIZEWEIGHT		0x0040
+#define TYPE_DEPRECATED		0x0080
+#define TYPE_WEIGHT		0x0100
+#define TYPE_SIZE32		0x0200
+#define TYPE_SIZE64		0x0400
+
+#define ROOT			0x0001
+#define THREAD_GROUP		0x0002
+#define FILESYSTEM		0x0004
+#define END			0x0008
+#define STATS			0x0010
+
+#define GLOBAL_OPTIONS {						\
+	{"num_filesystems", NULL, TYPE_DEPRECATED, STORE_SINGLE},	\
+	{"num_threadgroups", NULL, TYPE_DEPRECATED, STORE_SINGLE},	\
+	{"verbose", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"time", NULL, TYPE_U32, STORE_SINGLE},				\
+	{"directio", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"bufferio", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"alignio", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"callout", NULL, TYPE_STRING, STORE_SINGLE},			\
+	{NULL, NULL, 0, 0} }
+
+#define THREADGROUP_OPTIONS {						\
+	{"bindfs", NULL, TYPE_STRING, STORE_SINGLE},			\
+	{"num_threads", NULL, TYPE_U32, STORE_SINGLE},			\
+	{"read_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"readall_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"read_random", NULL, TYPE_BOOLEAN, STORE_SINGLE},		\
+	{"read_skip", NULL, TYPE_U32, STORE_SINGLE},			\
+	{"read_size", NULL, TYPE_SIZE64, STORE_SINGLE},			\
+	{"read_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE},		\
+	{"read_skipsize", NULL, TYPE_SIZE32, STORE_SINGLE},		\
+	{"write_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"write_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},	\
+	{"write_random", NULL, TYPE_BOOLEAN, STORE_SINGLE},		\
+	{"fsync_file", NULL, TYPE_DEPRECATED, STORE_SINGLE},		\
+	{"write_size", NULL, TYPE_SIZE64, STORE_SINGLE},		\
+	{"write_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE},		\
+	{"create_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"create_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},	\
+	{"delete_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"append_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"append_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},	\
+	{"metaop_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"createdir_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"op_delay", NULL, TYPE_U32, STORE_SINGLE},			\
+	{"stat_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"writeall_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{"writeall_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},	\
+	{"open_close_weight", NULL, TYPE_WEIGHT, STORE_SINGLE},		\
+	{NULL, NULL, 0} }
+
+#define FILESYSTEM_OPTIONS {						\
+	{"location", NULL, TYPE_STRING, STORE_SINGLE},			\
+	{"num_files", NULL, TYPE_U32, STORE_SINGLE},			\
+	{"num_dirs", NULL, TYPE_U32, STORE_SINGLE},			\
+	{"reuse", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"min_filesize", NULL, TYPE_SIZE64, STORE_SINGLE},		\
+	{"max_filesize", NULL, TYPE_SIZE64, STORE_SINGLE},		\
+	{"create_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE},		\
+	{"age_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE},		\
+	{"desired_util", NULL, TYPE_DOUBLE, STORE_SINGLE},		\
+	{"agefs", NULL, TYPE_BOOLEAN, STORE_SINGLE},			\
+	{"size_weight", NULL, TYPE_SIZEWEIGHT, STORE_LIST},		\
+	{"init_util", NULL, TYPE_DOUBLE, STORE_SINGLE},			\
+	{"init_size", NULL, TYPE_SIZE64, STORE_SINGLE},			\
+	{"clone", NULL, TYPE_STRING, STORE_SINGLE},			\
+	{NULL, NULL, 0} }
+
+#define STATS_OPTIONS {							\
+	{"enable_stats", NULL, TYPE_BOOLEAN, STORE_SINGLE},		\
+	{"enable_range", NULL, TYPE_BOOLEAN, STORE_SINGLE},		\
+	{"ignore", NULL, TYPE_STRING, STORE_LIST},			\
+	{"msec_range", NULL, TYPE_RANGE, STORE_LIST},			\
+	{NULL, NULL, 0} }
+
+#define CONTAINER_DESC {				\
+	{"filesystem", FILESYSTEM, 10},			\
+	{"threadgroup", THREAD_GROUP, 11},		\
+	{"end", END, 3},				\
+	{"stats", STATS, 5},				\
+	{NULL, 0, 0} }
+
+typedef struct container {
+	struct config_options *config;
+	uint32_t type;
+	struct container *child;
+	struct container *next;
+} container_t;
+
+typedef struct config_options {
+	char *name;
+	void *value;
+	int type;
+	int storage_type;
+} config_options_t;
+
+typedef struct container_desc {
+	char *name;
+	uint16_t type;
+	uint16_t size;
+} container_desc_t;
+
+typedef struct range {
+	double a;
+	double b;
+} range_t;
+
+typedef struct value_list {
+	void *value;
+	struct list_head list;
+} value_list_t;
+
+void ffsb_parse_newconfig(ffsb_config_t *fc, char *filename);
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/public-description b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/public-description
new file mode 100644
index 0000000..f770dd0
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/public-description
@@ -0,0 +1,4 @@
+The Flexible Filesystem Benchmark (FFSB) is a filesystem performance
+measurement tool.  It uses customizable profiles to measure of different
+workloads, and it supports multiple groups of threads across multiple
+filesystems.
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.c
new file mode 100644
index 0000000..b8c4a2c
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.c
@@ -0,0 +1,188 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <limits.h>
+#include <inttypes.h>
+#include <assert.h>
+
+#include "config.h"
+#include "rand.h"
+#include "util.h"
+
+#define RANDSRC "/dev/urandom"
+
+static int randfd = -1;
+
+/* close the file after we're done with the benchmark */
+void randcleanup(void)
+{
+	if (randfd > 0)
+		close(randfd);
+}
+
+/* We fill up the array with random bits from RANDSRC here and set index */
+/* to 0 */
+/* pre: state->size must be set and state->mt must be allocated! */
+static void sgenrand(randdata_t *state)
+{
+	int got = 0;
+	got = read(randfd, state->mt, state->size);
+	if (got != state->size) {
+		int i ;
+		/* fall back on lrand48 */
+		/* printf("fallback_rand\n"); */
+
+		for (i = got ; i < state->size ; i += 4) {
+			long int  rand = 0;
+#ifdef HAVE_LRAND48
+			lrand48_r(&(state->data), &rand);
+#else
+			rand = random();
+#endif
+			assert(rand != 0);
+			state->mt[i]   = (rand >> 24) & (512 - 1);
+			state->mt[i+1] = (rand >> 16) & (512 - 1);
+			state->mt[i+2] = (rand >>  8) & (512 - 1);
+			state->mt[i+3] = (rand) & (512 - 1);
+		}
+
+	}
+	state->mti = 0;
+}
+
+/* returns 8 random bits */
+static uint8_t genrand8(randdata_t *state)
+{
+	unsigned long ret = 0;
+	if (state->mti >= state->size) {
+/*		sgenrand(state); */
+		state->mti = 0;
+	}
+	ret = state->mt[state->mti];
+	state->mti++;
+	return ret;
+}
+
+/* returns 32 random bits */
+static uint32_t genrand32(randdata_t *state)
+{
+	uint8_t bytes[4];
+	uint32_t ret = 0;
+
+	bytes[0] = genrand8(state);
+	bytes[1] = genrand8(state);
+	bytes[2] = genrand8(state);
+	bytes[3] = genrand8(state);
+
+	ret = *((uint32_t *)bytes); /* !!! hack */
+	return ret;
+}
+
+void init_random(randdata_t *state, uint32_t iter)
+{
+	struct timeval time;
+	if (iter == 0)
+		state->size = MIN_RANDBUF_SIZE * AVG_ITR_RNDBTS;
+	else if (iter > MAX_RANDBUF_SIZE)
+		state->size = MAX_RANDBUF_SIZE * AVG_ITR_RNDBTS;
+	else
+		state->size = iter * AVG_ITR_RNDBTS;
+
+	state->mt = ffsb_malloc(state->size);
+
+	/* !!!! racy? add pthread_once stuff later  */
+	if ((randfd < 0) && (randfd = open(RANDSRC, O_RDONLY)) < 0) {
+		perror("open " RANDSRC);
+		exit(1);
+	}
+	sgenrand(state);
+	gettimeofday(&time, NULL);
+#ifdef HAVE_LRAND48
+	srand48_r(time.tv_sec, &state->data);
+#endif
+}
+
+void destroy_random(randdata_t *rd)
+{
+	free(rd->mt);
+}
+
+/*
+ * I've taken the liberty of slightly redesigning this stuff.
+ * Instead of simply getting the full word of random bits
+ * and throwing away most of it using the mod operator,
+ * we should only get byte-sized chunks of random bits and
+ * construct our random number that way with less wasteage - SR
+ */
+uint32_t getrandom(randdata_t *state, uint32_t mod)
+{
+
+    uint8_t bytes[4] = { 0, 0, 0, 0 };
+    uint32_t ret;
+    int num_bytes = 4;
+    int i;
+
+    if ((mod == 0) || (mod == 1))
+	    return 0;
+
+    if (!(mod >> 8))
+	    num_bytes = 1;
+    else if (!(mod >> 16))
+	    num_bytes = 2;
+    else if (!(mod >> 24))
+	    num_bytes = 3;
+
+    for (i = 0; i < num_bytes; i++)
+	    bytes[i] = genrand8(state);
+
+    ret = (bytes[3] << 24) + (bytes[2] << 16) + (bytes[1] << 8) + bytes[0];
+
+    return ret % mod;
+}
+
+uint64_t getllrandom(randdata_t *state, uint64_t mod)
+{
+	uint64_t result = 0;
+	uint64_t high   = 0;
+	uint32_t low    = 0;
+
+	if (mod == 0)
+		return 0;
+
+	/* ULONG_MAX comes from limits.h */
+	if (mod < ULONG_MAX)
+		return (uint64_t)getrandom(state, (uint32_t)mod);
+
+	high = genrand32(state);
+
+	low  = genrand32(state);
+
+	result = high << 32;
+	result |= (uint64_t)low;
+
+	assert(result != 0);
+	assert(result > 0);
+
+	return result % mod;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.h
new file mode 100644
index 0000000..1321551
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rand.h
@@ -0,0 +1,60 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _MTINT_H_
+#define _MTINT_H_
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <inttypes.h>
+
+/* A guess of how many random bytes (not bits) */
+/* will be consumed per iteration */
+/* This is multiplied by the iteration count */
+/* to get the size of the array in init_random() */
+#define AVG_ITR_RNDBTS 2
+
+/* Set a cap on the size of the array, note this */
+/* is multiplied by AVG_ITR_RNDBTS */
+#define MAX_RANDBUF_SIZE (10 * 1024)
+
+#define MIN_RANDBUF_SIZE 1024
+
+
+typedef struct randdata {
+	int size;
+	uint8_t *mt; /* the array of random bits  */
+	int mti; /* mti==N+1 means mt[N] is not initialized */
+
+	/* fallback random source, lrand48_r() */
+#ifdef HAVE_LRAND48_R
+	struct drand48_data data;
+#endif
+} randdata_t;
+
+uint32_t getrandom(randdata_t *rd, uint32_t mod);
+uint64_t getllrandom(randdata_t *rd, uint64_t mod);
+
+/* pass in thread-local state, and est. number of "uses" */
+/* pass in 0 for size if size is unknown/not important */
+void init_random(randdata_t *state, uint32_t size);
+void destroy_random(randdata_t *rd);
+void randcleanup(void);
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.c
new file mode 100644
index 0000000..b8147f3
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.c
@@ -0,0 +1,1040 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "rbt.h"
+
+/*
+ * ***********************************************
+ *
+ * D.H. IBM, S. Rao
+ *
+ * Module: Operations executed on red-black struct
+ *
+ * ***********************************************
+ */
+
+/* Construct a red-black tree node */
+
+rb_node *rbnode_construct(datatype object, rb_color color)
+{
+	rb_node *node = (rb_node *) malloc(sizeof(rb_node));
+	if (!node) {
+		fprintf(stderr, "Memory Shortage - No Execution Possible\n");
+		return NULL;
+	}
+	node->object = object;
+	node->color = color;
+	node->parent = node->right = node->left = NULL;
+	return node;
+}
+
+/* Destructor of a red-black tree node */
+
+void rbnode_destruct(rb_node *node, destructor d)
+{
+	if (!node)
+		return;
+	if (d != NULL)
+		d(node->object);
+	rbnode_destruct(node->right, d);
+	rbnode_destruct(node->left, d);
+	free(node);
+}
+
+/* Determine the depth of the subtree spanned by a given node */
+
+int rbnode_depth(rb_node *node)
+{
+	/* Recursively determine the depth of the left and right
+	 * subtrees
+	 */
+	int  irightdepth = (node->right) ? rbnode_depth(node->right) : 0;
+	int  ileftdepth = (node->left) ? rbnode_depth(node->left) : 0;
+
+	/* Return the maximal child depth + 1 (the current node) */
+	return ((irightdepth > ileftdepth) ? (irightdepth + 1) : (ileftdepth + 1));
+}
+
+/* Return the leftmost leaf in the tree */
+
+rb_node *rbnode_minimum(rb_node *node)
+{
+	while (node->left)
+		node = node->left;
+	return node;
+}
+
+/* Return the rightmost leaf in the tree */
+
+rb_node *rbnode_maximum(rb_node *node)
+{
+	while (node->right)
+		node = node->right;
+	return node;
+}
+
+/* Replace an object */
+
+void rbnode_replace(rb_node *node, datatype object)
+{
+	/* Make sure the replacement does not violate the tree order
+	 * Replace the object at the node
+	 */
+	node->object = object;
+}
+
+/* Get the next node in the tree (according to the tree order) */
+
+rb_node *rbnode_successor(rb_node *node)
+{
+	rb_node *succ_node;
+
+	if (node->right) {
+
+		/* If there is a right child, the successor is the
+		 * minimal object in the sub-tree spanned by this
+		 * child.
+		 */
+
+		succ_node = node->right;
+		while (succ_node->left)
+			succ_node = succ_node->left;
+	} else {
+
+		/* Otherwise, go up the tree until reaching the parent
+		 * from the left direction.
+		 */
+
+		rb_node *prev_node = node;
+		succ_node = node->parent;
+		while (succ_node && prev_node == succ_node->right) {
+			prev_node = succ_node;
+			succ_node = succ_node->parent;
+		}
+	}
+
+	return (succ_node);
+}
+
+/* Get the previous node in the tree (according to the tree order) */
+
+rb_node *rbnode_predecessor(rb_node *node)
+{
+	rb_node *pred_node;
+
+	if (node->left) {
+
+		/* If there is a left child, the predecessor is the
+		 * maximal object in the sub-tree spanned by this
+		 * child.
+		 */
+
+		pred_node = node->left;
+		while (pred_node->right)
+			pred_node = pred_node->right;
+	} else {
+
+		/* Otherwise, go up the tree until reaching the parent
+		 * from the right direction.
+		 */
+
+		rb_node *prev_node = node;
+		pred_node = node->parent;
+		while (pred_node && prev_node == pred_node->left) {
+			prev_node = pred_node;
+			pred_node = pred_node->parent;
+		}
+	}
+
+  return (pred_node);
+}
+
+/* Return a pointer to a duplication of the given node */
+
+rb_node *rbnode_duplicate(rb_node *node)
+{
+	/* Create a node of the same color, containing the same
+	 * object
+	 */
+	rb_node *dup_node = rbnode_construct(node->object, node->color);
+	if (!dup_node)
+		return NULL;
+
+	/* Duplicate the children recursively */
+	if (node->right) {
+		dup_node->right = rbnode_duplicate(node->right);
+		dup_node->right->parent = dup_node;
+	} else {
+		dup_node->right = NULL;
+	}
+
+	if (node->left) {
+		dup_node->left = rbnode_duplicate(node->left);
+		dup_node->left->parent = dup_node;
+	} else {
+		dup_node->left = NULL;
+	}
+
+	return dup_node; /* Return the duplicated node */
+}
+
+/* Traverse a red-black subtree */
+
+void rbnode_traverse(rb_node *node, opr *op)
+{
+	if (!node)
+		return;
+	rbnode_traverse(node->left, op);
+	op(node->object);
+	rbnode_traverse(node->right, op);
+}
+
+/*
+ * ***********************************
+ *
+ * Operations on rb_tree struct
+ *
+ * ***********************************
+ */
+
+/* Intialize a tree */
+void rbtree_init(rb_tree *tree)
+{
+/*   tree->comp = comp; */
+	tree->isize = 0;
+	tree->root = NULL;
+}
+
+/* Construct a tree given a comparison function */
+
+rb_tree *rbtree_construct()
+{
+	rb_tree *tree = (rb_tree *) malloc(sizeof(rb_tree));
+	if (!tree) {
+		fprintf(stderr, "Memory Issue - Shortge Exists!\n");
+		return NULL;
+	}
+	rbtree_init(tree);
+	return tree;
+}
+
+/* Remove all objects from a black-red tree */
+
+void rbtree_clean(rb_tree *tree, destructor d)
+{
+	if (tree->root)
+		rbnode_destruct(tree->root, d);
+	tree->root = NULL;
+	tree->isize = 0;
+}
+
+/* Destruct a red-black tree */
+
+void rbtree_destruct(rb_tree *tree, destructor d)
+{
+	rbtree_clean(tree, d);
+	free(tree);
+}
+
+/* Returns the size of the tree */
+
+int rbtree_size(rb_tree *tree)
+{
+	return tree->isize;
+}
+
+/* Returns the depth of the tree */
+
+int rbtree_depth(rb_tree *tree)
+{
+	if (!(tree->root))
+		return 0;
+	return rbnode_depth(tree->root);
+}
+
+/* Check whether the tree contains a certain object */
+
+int rbtree_contains(rb_tree *tree, datatype object)
+{
+	return (rbtree_find(tree, object) != NULL);
+}
+
+/* Insert an object into the rb-tree */
+
+rb_node *rbtree_insert(rb_tree *tree, datatype object)
+{
+	rb_node *cur_node;
+	rb_node *new_node;
+	int comp_result = 0;
+
+	if (!(tree->root)) {
+		/* Assign a new root node (the root is always
+		 * black)
+		 */
+		new_node = rbnode_construct(object, black);
+		if (!new_node)
+			return NULL;
+		tree->root = new_node;
+		tree->isize = 1;
+		return new_node;
+	}
+
+	/* Find a spot for the new object, insert the object as a red
+	 * leaf
+	 */
+
+	cur_node = tree->root;
+	new_node = rbnode_construct(object, red);
+	if (!new_node)
+		return NULL;
+
+	while (cur_node) {
+		/* Compare inserted object with the object stored in
+		 * the current node
+		 */
+		comp_result = COMP_NODES(object, cur_node->object);
+		if (comp_result == 0) {
+			printf("Attempted to insert duplicate node, aborting\n");
+			free(new_node);
+			return NULL;
+		}
+		if (comp_result > 0) {
+			if (!(cur_node->left)) {
+				/* Insert the new leaf as the left
+				 * child of the current node
+				 */
+				cur_node->left = new_node;
+				new_node->parent = cur_node;
+				cur_node = NULL; /* Terminate the while loop */
+			} else {
+				 /* Go to the left subtree */
+				cur_node = cur_node->left;
+			}
+		} else {
+			if (!(cur_node->right)) {
+				/* Insert the new leaf as the right
+				 * child of the current node
+				 */
+				cur_node->right = new_node;
+				new_node->parent = cur_node;
+				cur_node = NULL; /* Terminate the while loop */
+			} else {
+				/* Go to the right subtree */
+				cur_node = cur_node->right;
+			}
+		}
+	}
+
+	/* Mark the fact that a new node was added */
+	tree->isize++;
+
+	/* Fix the tree properties */
+	rbtree_insert_fixup(tree, new_node);
+
+	return new_node;
+}
+
+/* Insert a new object to the tree as the a successor of a given
+ * node
+ */
+
+rb_node *insert_successor_at(rb_tree *tree, rb_node *at_node, datatype object)
+{
+	rb_node *parent;
+	rb_node *new_node;
+
+	if (!(tree->root)) {
+		/* Assign a new root node (the root is always
+		 * black)
+		 */
+		new_node = rbnode_construct(object, black);
+		if (!new_node)
+			return NULL;
+		tree->root = new_node;
+		tree->isize = 1;
+		return new_node;
+	}
+
+	/* Insert the new object as a red leaf, being the successor of
+	 * node
+	 */
+	new_node = rbnode_construct(object, red);
+	if (!new_node)
+		return NULL;
+
+	if (!at_node) {
+		/* The new node should become the tree's minimum Place
+		 * is as the left child of the current minimal leaf
+		*/
+		parent = rbnode_minimum(tree->root);
+		parent->left = new_node;
+	} else {
+		/* Make sure the insertion does not violate the tree
+		 * order In case given node has no right child, place
+		 * the new node as its right child. Otherwise, place
+		 * it at the leftmost position at the sub-tree rooted
+		 * at its right side.
+		 */
+		if (!at_node->right) {
+			parent = at_node;
+			parent->right = new_node;
+		} else {
+			parent = rbnode_minimum(at_node->right);
+			parent->left = new_node;
+		}
+	}
+
+	new_node->parent = parent;
+
+	/* Mark that a new node was added */
+	tree->isize++;
+
+	/* Fix the tree properties */
+	rbtree_insert_fixup(tree, new_node);
+
+	return new_node;
+}
+
+/* Insert a new object to the tree as the a predecessor of a given node */
+
+rb_node *insert_predecessor_at(rb_tree *tree, rb_node *at_node, datatype object)
+{
+	rb_node *parent;
+	rb_node *new_node;
+
+	if (!(tree->root)) {
+		/* Assign a new root node (the root is always
+		 * black)
+		 */
+		new_node = rbnode_construct(object, black);
+		if (!new_node)
+			return NULL;
+		tree->root = new_node;
+		tree->isize = 1;
+		return new_node;
+	}
+
+	/* Insert the new object as a red leaf, being the predecessor
+	 * of at_node
+	 */
+	new_node = rbnode_construct(object, red);
+	if (!new_node)
+		return NULL;
+
+	if (!at_node) {
+		/* The new node should become the tree maximum. Place
+		 * is as the right child of the current maximal leaf
+		 */
+		parent = rbnode_maximum(tree->root);
+		parent->right = new_node;
+	} else {
+		/* Make sure the insertion does not violate the tree
+		 * order In case given node has no left child, place
+		 * the new node as its left child. Otherwise, place it
+		 * at the rightmost position at the sub-tree rooted at
+		 * its left side.
+		 */
+		if (!(at_node->left)) {
+			parent = at_node;
+			parent->left = new_node;
+		} else {
+			parent = rbnode_maximum(at_node->left);
+			parent->right = new_node;
+		}
+	}
+
+	new_node->parent = parent;
+
+	/* Mark that a new node was added */
+	tree->isize++;
+
+	/* Fix the tree properties */
+	rbtree_insert_fixup(tree, new_node);
+
+	return new_node;
+}
+
+/* Remove an object from the tree */
+
+void rbtree_remove(rb_tree *tree, datatype object, destructor d)
+{
+	rb_node *node = rbtree_find(tree, object); /* Find the node */
+	rbtree_remove_at(tree, node, d);           /* Remove the node */
+}
+
+/* Remove the object pointed by the given node. */
+
+void rbtree_remove_at(rb_tree *tree, rb_node *node, destructor d)
+{
+	rb_node *child = NULL;
+
+	/* In case of deleting the single object stored in the tree,
+	 * free the root, thus emptying the tree
+	 */
+	if (tree->isize == 1) {
+		rbnode_destruct(tree->root, d);
+		tree->root = NULL;
+		tree->isize = 0;
+		return;
+	}
+
+	/* Remove the given node from the tree */
+	if (node->left && node->right) {
+		/* If the node we want to remove has two children,
+		 * find its successor, which is the leftmost child in
+		 * its right sub-tree and has at most one child (it
+		 * may have a right child).
+		 */
+		rb_node *succ_node = rbnode_minimum(node->right);
+
+		/* Now physically swap node and its successor. Notice
+		 * this may temporarily violate the tree properties,
+		 * but we are going to remove node anyway.  This way
+		 * we have moved node to a position were it is more
+		 * convinient to delete it.
+		 */
+		int immediate_succ = (node->right == succ_node);
+		rb_node *succ_parent = succ_node->parent;
+		rb_node *succ_left = succ_node->left;
+		rb_node *succ_right = succ_node->right;
+		rb_color succ_color = succ_node->color;
+
+		succ_node->parent = node->parent;
+		succ_node->left = node->left;
+		succ_node->right = immediate_succ ? node : node->right;
+		succ_node->color = node->color;
+
+		node->parent = immediate_succ ? succ_node : succ_parent;
+		node->left = succ_left;
+		node->right = succ_right;
+		node->color = succ_color;
+
+		if (!immediate_succ) {
+			if (succ_node == node->parent->left)
+				node->parent->left = node;
+			else
+				node->parent->right = node;
+		}
+
+		if (node->left)
+			node->left->parent = node;
+		if (node->right)
+			node->right->parent = node;
+
+		if (succ_node->parent) {
+			if (node == succ_node->parent->left)
+				succ_node->parent->left = succ_node;
+			else
+				succ_node->parent->right = succ_node;
+		} else {
+			tree->root = succ_node;
+		}
+
+		if (succ_node->left)
+			succ_node->left->parent = succ_node;
+		if (succ_node->right)
+			succ_node->right->parent = succ_node;
+	}
+
+	/* At this stage, the node we are going to remove has at most
+	 * one child
+	 */
+	child = (node->left) ? node->left : node->right;
+
+	/* Splice out the node to be removed, by linking its parent
+	 * straight to the removed node's single child.
+	 */
+	if (child)
+		child->parent = node->parent;
+
+	if (!(node->parent)) {
+		/* If we are deleting the root, make the child the new
+		 * tree node
+		 */
+		tree->root = child;
+	} else {
+		/* Link the removed node parent to its child */
+		if (node == node->parent->left)
+			node->parent->left = child;
+		else
+			node->parent->right = child;
+	}
+
+	/* Fix-up the red-black properties that may have been damaged:
+	 * If we have just removed a black node, the black-depth
+	 * property is no longer valid
+	 */
+	if (node->color == black && child)
+		rbtree_remove_fixup(tree, child);
+
+	/* Delete the un-necessary node (nullify both its children
+	 * because the node's destructor is recursive).
+	 */
+	node->left = NULL;
+	node->right = NULL;
+	free(node);
+
+	/* Decrease the number of objects in the tree */
+	tree->isize--;
+}
+
+/* Get the tree minimum */
+
+rb_node *rbtree_minimum(rb_tree *tree)
+{
+	if (!(tree->root))
+		return NULL;
+
+	/* Return the leftmost leaf in the tree */
+	return rbnode_minimum(tree->root);
+}
+
+/* Get the tree maximum */
+
+rb_node *rbtree_maximum(rb_tree *tree)
+{
+	if (!(tree->root))
+		return NULL;
+
+	/* Return the rightmost leaf in the tree */
+	return rbnode_maximum(tree->root);
+}
+
+/* Return a pointer to the node containing the given object */
+
+rb_node *rbtree_find(rb_tree *tree, datatype object)
+{
+	rb_node *cur_node = tree->root;
+	int comp_result;
+
+	while (cur_node) {
+		comp_result = COMP_NODES(object, cur_node->object);
+		/* In case of equality, we can return the current
+		 * node.
+		 */
+		if (comp_result == 0)
+			return cur_node;
+		/* Go down to the left or right child. */
+		cur_node = (comp_result > 0) ? cur_node->left : cur_node->right;
+	}
+
+	/* If we get here, the object is not in the tree */
+	return NULL;
+}
+
+void rbtree_rotate_left(rb_tree *tree, rb_node *x_node)
+{
+	/* Get the right child of the node */
+	rb_node *y_node = x_node->right;
+
+	/* Change its left subtree (T2) to x's right subtree */
+	x_node->right = y_node->left;
+
+	/* Link T2 to its new parent x */
+	if (y_node->left != NULL)
+		y_node->left->parent = x_node;
+
+	/* Assign x's parent to be y's parent */
+	y_node->parent = x_node->parent;
+
+	if (!(x_node->parent)) {
+		/* Make y the new tree root */
+		tree->root = y_node;
+	} else  {
+		/* Assign a pointer to y from x's parent */
+		if (x_node == x_node->parent->left)
+			x_node->parent->left = y_node;
+		else
+			x_node->parent->right = y_node;
+	}
+
+	/* Assign x to be y's left child */
+	y_node->left = x_node;
+	x_node->parent = y_node;
+}
+
+/* Right-rotate the sub-tree spanned by the given node */
+
+void rbtree_rotate_right(rb_tree *tree, rb_node *y_node)
+{
+	/* Get the left child of the node */
+	rb_node *x_node = y_node->left;
+
+	/* Change its right subtree (T2) to y's left subtree */
+	y_node->left = x_node->right;
+
+	/* Link T2 to its new parent y */
+	if (x_node->right != NULL)
+		x_node->right->parent = y_node;
+
+	/* Assign y's parent to be x's parent */
+	x_node->parent = y_node->parent;
+
+	if (!(y_node->parent)) {
+		/* Make x the new tree root */
+		tree->root = x_node;
+	} else  {
+		/* Assign a pointer to x from y's parent */
+		if (y_node == y_node->parent->left)
+			y_node->parent->left = x_node;
+		else
+			y_node->parent->right = x_node;
+	}
+
+	/* Assign y to be x's right child */
+	x_node->right = y_node;
+	y_node->parent = x_node;
+}
+
+/* Fix the tree so it maintains the red-black properties after an insert */
+
+void rbtree_insert_fixup(rb_tree *tree, rb_node *node)
+{
+	/* Fix the red-black propreties. We may have inserted a red
+	 * leaf as the child of a red parent - so we have to fix the
+	 * coloring of the parent recursively.
+	 */
+	rb_node *curr_node = node;
+	rb_node *grandparent;
+	rb_node *uncle;
+
+	assert(node && node->color == red);
+
+	while (curr_node != tree->root && curr_node->parent->color == red) {
+		/* Get a pointer to the current node's grandparent
+		 * (the root is always black, so the red parent must
+		 * have a parent).
+		 */
+
+		grandparent = curr_node->parent->parent;
+
+		if (curr_node->parent == grandparent->left) {
+			/* If the red parent is a left child, the
+			* uncle is the right child of the grandparent.
+			*/
+			uncle = grandparent->right;
+
+			if (uncle && uncle->color == red) {
+
+				/* If both parent and uncle are red,
+				 * color them black and color the
+				 * grandparent red. In case of a NULL
+				 * uncle, treat it as a black node
+				 */
+				curr_node->parent->color = black;
+				uncle->color = black;
+				grandparent->color = red;
+
+				/* Move to the grandparent */
+				curr_node = grandparent;
+			} else {
+				/* Make sure the current node is a
+				* right child. If not, left-rotate the
+				* parent's sub-tree so the parent
+				* becomes the right child of the
+				* current node (see _rotate_left).
+				*/
+				if (curr_node == curr_node->parent->right) {
+					curr_node = curr_node->parent;
+					rbtree_rotate_left(tree, curr_node);
+				}
+
+				/* Color the parent black and the
+				 * grandparent red
+				 */
+				curr_node->parent->color = black;
+				grandparent->color = red;
+
+				/* Right-rotate the grandparent's
+				 * sub-tree
+				 */
+				rbtree_rotate_right(tree, grandparent);
+			}
+		} else {
+			/* If the red parent is a right child, the
+			 * uncle is the left child of the grandparent.
+			 */
+			uncle = grandparent->left;
+
+			if (uncle && uncle->color == red) {
+				/* If both parent and uncle are red,
+				 * color them black and color the
+				 * grandparent red. In case of a NULL
+				 * uncle, treat it as a black node
+				 */
+				curr_node->parent->color = black;
+				uncle->color = black;
+				grandparent->color = red;
+
+				/* Move to the grandparent */
+				curr_node = grandparent;
+			} else {
+				/* Make sure the current node is a
+				 * left child. If not, right-rotate
+				 * the parent's sub-tree so the parent
+				 * becomes the left child of the
+				 * current node.
+				*/
+				if (curr_node == curr_node->parent->left) {
+					curr_node = curr_node->parent;
+					rbtree_rotate_right(tree, curr_node);
+				}
+
+				/* Color the parent black and the
+				 * grandparent red
+				 */
+				curr_node->parent->color = black;
+				grandparent->color = red;
+
+				/* Left-rotate the grandparent's
+				 * sub-tree
+				 */
+				rbtree_rotate_left(tree, grandparent);
+			}
+		}
+	}
+
+	/* Make sure that the root is black */
+	tree->root->color = black;
+}
+
+void rbtree_remove_fixup(rb_tree *tree, rb_node *node)
+{
+	rb_node *curr_node = node;
+	rb_node *sibling;
+
+	while (curr_node != tree->root && curr_node->color == black) {
+		/* Get a pointer to the current node's sibling (notice
+		 * that the node's parent must exist, since the node
+		 * is not the root).
+		 */
+		if (curr_node == curr_node->parent->left) {
+			/* If the current node is a left child, its
+			 * sibling is the right child of the parent.
+			 */
+			sibling = curr_node->parent->right;
+
+			/* Check the sibling's color. Notice that NULL
+			 * nodes are treated as if they are colored
+			 * black.
+			 */
+			if (sibling && sibling->color == red) {
+				/* In case the sibling is red, color
+				 * it black and rotate.  Then color
+				 * the parent red (the grandparent is
+				 * now black)
+				 */
+				sibling->color = black;
+				curr_node->parent->color = red;
+				rbtree_rotate_left(tree, curr_node->parent);
+				sibling = curr_node->parent->right;
+			}
+
+			if (sibling &&
+			    (!(sibling->left) || sibling->left->color == black) &&
+			    (!(sibling->right) || sibling->right->color == black)) {
+				/* If the sibling has two black
+				 * children, color it red
+				 */
+				sibling->color = red;
+				if (curr_node->parent->color == red) {
+					/* If the parent is red, we
+					 * can safely color it black
+					 * and terminate the fix
+					 * process.
+					 */
+					curr_node->parent->color = black;
+					/* In order to stop the while loop */
+					curr_node = tree->root;
+				} else {
+					/* The black depth of the
+					* entire sub-tree rooted at
+					* the parent is now too small
+					* - fix it up recursively.
+					 */
+					curr_node = curr_node->parent;
+				}
+			} else {
+				if (!sibling) {
+					/* Take special care of the
+					 * case of a NULL sibling
+					 */
+					if (curr_node->parent->color == red) {
+						curr_node->parent->color = black;
+						/* In order to stop
+						 * the while loop */
+						curr_node = tree->root;
+					} else {
+						curr_node = curr_node->parent;
+					}
+				} else {
+					/* In this case, at least one
+					 * of the sibling's children
+					 * is red.  It is therfore
+					 * obvious that the sibling
+					 * itself is black.
+					 */
+					if (sibling->right && sibling->right->color == red) {
+						/* If the right child
+						 * of the sibling is
+						 * red, color it black
+						 * and rotate around
+						 * the current parent.
+						 */
+						sibling->right->color = black;
+						rbtree_rotate_left(tree, curr_node->parent);
+					} else {
+						/* If the left child
+						 * of the sibling is
+						 * red, rotate around
+						 * the sibling, then
+						 * rotate around the
+						 * new sibling of our
+						 * current node.
+						  */
+						rbtree_rotate_right(tree, sibling);
+						sibling = curr_node->parent->right;
+						rbtree_rotate_left(tree, sibling);
+					}
+
+					/* It is now safe to color the
+					 * parent black and to
+					 * terminate the fix process.
+					 */
+					if (curr_node->parent->parent)
+						curr_node->parent->parent->color = curr_node->parent->color;
+					curr_node->parent->color = black;
+					/* In order to stop the while loop */
+					curr_node = tree->root;
+				}
+			}
+		} else {
+			/* If the current node is a right child, its
+			 * sibling is the left child of the parent.
+			 */
+			sibling = curr_node->parent->left;
+
+			/* Check the sibling's color. Notice that NULL
+			 * nodes are treated as if they are colored
+			 * black.
+			 */
+			if (sibling && sibling->color == red) {
+				/* In case the sibling is red, color
+				 * it black and rotate.  Then color
+				 * the parent red (the grandparent is
+				 * now black).
+				 */
+				sibling->color = black;
+				curr_node->parent->color = red;
+				rbtree_rotate_right(tree, curr_node->parent);
+
+				sibling = curr_node->parent->left;
+			}
+
+			if (sibling &&
+			    (!(sibling->left) || sibling->left->color == black) &&
+			    (!(sibling->right) || sibling->right->color == black)) {
+				/* If the sibling has two black children, color it red */
+				sibling->color = red;
+				if (curr_node->parent->color == red) {
+					/* If the parent is red, we
+					 * can safely color it black
+					 * and terminate the fix-up
+					 * process.
+					 */
+					curr_node->parent->color = black;
+					/* In order to stop the while
+					 * loop
+					 */
+					curr_node = tree->root;
+				} else {
+					/* The black depth of the
+					 * entire sub-tree rooted at
+					 * the parent is now too small
+					 * - fix it up recursively.
+					 */
+					curr_node = curr_node->parent;
+				}
+			} else {
+				if (!sibling) {
+					/* Take special care of the
+					 * case of a NULL sibling */
+					if (curr_node->parent->color == red) {
+						curr_node->parent->color = black;
+						/* In order to stop
+						 * the while loop */
+						curr_node = tree->root;
+					} else {
+						curr_node = curr_node->parent;
+					}
+				} else {
+					/* In this case, at least one
+					* of the sibling's children is
+					* red.  It is therfore obvious
+					* that the sibling itself is
+					* black.
+					*/
+					if (sibling->left && sibling->left->color == red) {
+						/* If the left child
+						* of the sibling is
+						* red, color it black
+						* and rotate around
+						* the current parent
+						*/
+						sibling->left->color = black;
+						rbtree_rotate_right(tree, curr_node->parent);
+					} else {
+						/* If the right child
+						 * of the sibling is
+						 * red, rotate around
+						 * the sibling, then
+						 * rotate around the
+						 * new sibling of our
+						 * current node
+						 */
+						rbtree_rotate_left(tree, sibling);
+						sibling = curr_node->parent->left;
+						rbtree_rotate_right(tree, sibling);
+					}
+
+					/* It is now safe to color the
+					 * parent black and to
+					 * terminate the fix process.
+					 */
+					if (curr_node->parent->parent)
+						curr_node->parent->parent->color = curr_node->parent->color;
+					curr_node->parent->color = black;
+					/* In order to stop the while loop */
+					curr_node = tree->root;
+				}
+			}
+		}
+	}
+
+	/* The root can always be colored black */
+	curr_node->color = black;
+}
+
+/* Traverse a red-black tree */
+
+void rbtree_traverse(rb_tree *tree, opr *op)
+{
+	rbnode_traverse(tree->root, op);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.h
new file mode 100644
index 0000000..415890e
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rbt.h
@@ -0,0 +1,316 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef RED_BLACK_TREE_H
+#define RED_BLACK_TREE_H
+
+/*
+ * ***************************************************************************
+ *
+ * Container class for a red-black tree ......
+ *
+ * A binary tree that satisfies the following properties:
+ *
+ * 1. Every node is either red or black
+ * 2. The root node is black
+ * 3. Every leaf (NIL) is black
+ * 4. If a node is red, both its children are black
+ * 5. For each node, all paths from the node to descendant leaf nodes
+ *    contain the same number of black nodes
+ *
+ * Due to points 4 & 5, the depth of a red-black tree containing n nodes
+ * is bounded by 2*log2(n+1) (WC).
+ *
+ *
+ * The rb_tree template requires two additional parmeters:
+ *
+ * - The contained TYPE class represents the objects stored in the tree.
+ *   It has to support the copy constructor and the assignment operator (opr)
+ * - cmp is a functor used to define the order of objects of class TYPE:
+ *   This class has to support an operator() that recieves two objects from
+ *   the TYPE class and returns a negative, 0, or a positive integer,
+ *   depending on the comparison result.
+ *
+ * Dominique Heger, S. Rao
+ *
+ * ***************************************************************************
+ */
+
+/* Color enumeration for nodes of red-black tree */
+/* ********************************************* */
+
+#include "filelist.h"
+
+typedef struct ffsb_file *datatype;
+
+#define COMP_NODES(a, b) ((a)->num - (b)->num)
+
+typedef enum red_black_color {red, black} rb_color;
+
+/*! Representation of a node in a red-black tree */
+typedef struct red_black_node {
+	datatype object;                      /* the stored object */
+	rb_color color;                       /* the color of the node */
+	struct red_black_node *parent;       /* points to the parent node */
+	struct red_black_node *right;        /* points to the right child */
+	struct red_black_node *left;         /* points to the left child */
+} rb_node;
+
+typedef int(cmp)(datatype, datatype);
+typedef void(opr)(void *);
+typedef void(destructor)(datatype);
+
+/* Construct of a red-black tree node
+ * - The object stored in the node
+ * - The color of the node
+ */
+
+extern rb_node *rbnode_construct(datatype object, rb_color color);
+
+/* Recursive destructor for the entire sub-tree */
+/* ******************************************** */
+
+extern void rbnode_destruct(rb_node *node, destructor d);
+
+/* Calculate the depth of the sub-tree spanned by the given node
+ * - The sub-tree root
+ * - The sub-tree depth
+ */
+
+extern int rbnode_depth(rb_node *node);
+
+/* Get the leftmost node in the sub-tree spanned by the given node
+ * - The sub-tree root
+ * - The sub-tree minimum
+ */
+
+extern rb_node *rbnode_minimum(rb_node *node);
+
+/* Get the rightmost node in the sub-tree spanned by the given node
+ * - The sub-tree root
+ * - The sub-tree maximum
+ */
+
+extern rb_node *rbnode_maximum(rb_node *node);
+
+/* Replace the object */
+/* ****************** */
+
+extern void rbnode_replace(rb_node *node, datatype object);
+
+/* Get the next node in the tree (according to the tree order)
+ * - The current node
+ * - The successor node, or NULL if node is the tree maximum
+ */
+
+extern rb_node *rbnode_successor(rb_node *node);
+
+/* Get the previous node in the tree (according to the tree order)
+ * - The current node
+ * - The predecessor node, or NULL if node is the tree minimum
+ */
+
+extern rb_node *rbnode_predecessor(rb_node *node);
+
+/* Duplicate the entire sub-tree rooted at the given node
+ * - The sub-tree root
+ * - A pointer to the duplicated sub-tree root
+ */
+
+extern rb_node *rbnode_duplicate(rb_node *node);
+
+/* Traverse a red-black sub-tree
+ * - The sub-tree root
+ * - The operation to perform on each object in the sub-tree
+ */
+extern void rbnode_traverse(rb_node *node, opr *op);
+
+/* Representation of a red-black tree */
+/* ********************************** */
+
+typedef struct red_black_tree {
+	rb_node *root;                /* pointer to the tree root */
+	int isize;                     /* number of objects stored */
+	/*   cmp * comp; */                   /* compare function */
+} rb_tree;
+
+/* Initialize a red-black tree with a comparision function
+ * - The tree
+ * - The comparision function
+ */
+
+void rbtree_init(rb_tree *tree);
+
+/* Construct a red-black tree with a comparison object
+ * - A pointer to the comparison object to be used by the tree
+ * - The newly constructed  tree
+ */
+
+rb_tree *rbtree_construct(void);
+
+/* Clean a red-black tree [takes O(n) operations]
+ * - The tree
+ */
+
+extern void rbtree_clean(rb_tree *tree, destructor d);
+
+/* Destruct a red-black tree
+ * - The tree
+ */
+
+extern void rbtree_destruct(rb_tree *tree, destructor d);
+
+/* Get the size of the tree [takes O(1) operations]
+ * - The tree
+ * - The number of objects stored in the tree
+ */
+
+extern int rbtree_size(rb_tree *tree);
+
+/* Get the depth of the tree [takes O(n) operations]
+ * - The tree
+ * - The length of the longest path from the root to a leaf node
+ */
+
+extern int rbtree_depth(rb_tree *tree);
+
+/* Check whether the tree contains an object [takes O(log n) operations]
+ * - The tree
+ * - The query object
+ * - (true) if an equal object is found in the tree, otherwise (false)
+ */
+
+extern int rbtree_contains(rb_tree *tree, datatype object);
+
+/* Insert an object to the tree [takes O(log n) operations]
+ * - The tree
+ * - The object to be inserted
+ * - Return the inserted object node
+ */
+
+extern rb_node *rbtree_insert(rb_tree *tree, datatype object);
+
+/* Insert a new object to the tree as the a successor of a given node
+ * - The tree
+ * - The new node
+ */
+
+extern rb_node *insert_successor_at(rb_tree *tree, rb_node *at_node,
+				    datatype object);
+
+/* Insert a new object to the tree as the a predecessor of a given node
+ * - The tree
+ * - The new node
+ */
+
+extern rb_node *insert_predecessor_at(rb_tree *tree, rb_node *at_node,
+				      datatype object);
+
+/* Remove an object from the tree [takes O(log n) operations]
+ * - The tree
+ * - The object to be removed
+ * - The object should be contained in the tree
+ */
+
+extern void rbtree_remove(rb_tree *tree, datatype object, destructor d);
+
+/* Get a handle to the tree minimum [takes O(log n) operations]
+ * - The tree
+ * - Return the minimal object in the tree, or a NULL if the tree is empty
+ */
+
+extern rb_node *rbtree_minimum(rb_tree *tree);
+
+/* Get a handle to the tree maximum [takes O(log n) operations]
+ * - The tree
+ * - Return the maximal object in the tree, or a NULL if the tree is empty
+ */
+
+extern rb_node *rbtree_maximum(rb_tree *tree);
+
+/* Get the next node in the tree (according to the tree order)
+ * - [takes O(log n) operations at worst-case, but only O(1) amortized]
+ * - The tree
+ * - The current object
+ * - The successor node, or a NULL, if we are at the tree maximum
+ */
+extern rb_node *rbtree_successor(rb_tree *tree, rb_node *node);
+
+/* Get the previous node in the tree (according to the tree order)
+ * - [takes O(log n) operations at worst-case, but only O(1) amortized]
+ * - The tree
+ * - The current object
+ * - The predecessor node, or a NULL, if we are at the tree minimum
+ */
+
+extern rb_node *rbtree_predecessor(rb_tree *tree, rb_node *node);
+
+/* Find a node that contains the given object
+ * - The tree
+ * - The desired object
+ * - Return a node that contains the given object, or NULL if no such object
+ *   is found in the tree
+ */
+
+extern rb_node *rbtree_find(rb_tree *tree, datatype object);
+
+/* Remove the object stored in the given tree node
+ * - The tree
+ * - The node storing the object to be removed from the tree
+ */
+
+extern void rbtree_remove_at(rb_tree *tree, rb_node *node, destructor d);
+
+/* Left-rotate the sub-tree spanned by the given node
+ * - The tree
+ * - The sub-tree root
+ */
+
+extern void rbtree_rotate_left(rb_tree *tree, rb_node *node);
+
+/* Right-rotate the sub-tree spanned by the given node
+ * - The tree
+ * - The sub-tree root
+ */
+
+extern void rbtree_rotate_right(rb_tree *tree, rb_node *node);
+
+/*
+ * Fix the red-black tree properties after an insertion operation
+ * - The tree
+ * - The node that has just been inserted to the tree
+ * - The color of node must be red
+ */
+
+extern void rbtree_insert_fixup(rb_tree *tree, rb_node *node);
+
+/* Fix the red-black tree properties after a removal operation
+ * - The tree
+ * - The child of the node that has just been removed from the tree
+ */
+
+extern void rbtree_remove_fixup(rb_tree *tree, rb_node *node);
+
+/* Traverse a red-black tree
+ * - The tree
+ * - The operation to perform on every object of the tree (according to
+ *   the tree order)
+ */
+
+extern void rbtree_traverse(rb_tree *tree, opr *op);
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/registration-description b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/registration-description
new file mode 100644
index 0000000..fd181e2
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/registration-description
@@ -0,0 +1,7 @@
+The Flexible Filesystem Benchmark (FFSB) is a filesystem performance measurement tool.  It is a multi-threaded application (using pthreads), written entirely in C with cross-platform portability in mind.  It differs from other filesystem benchmarks in that the user may supply a profile to create custom workloads, while most other filesystem benchmarks use a fixed set of workloads.
+
+It is currently known to support Linux, AIX, and Solaris, although almost all development and testing has occurred on Linux.  We intend to add support for HP-UX, IRIX, and possibly others in the near future.
+
+FFSB is currently at version 5.0, and has been an internal tool at IBM for about four years.  I has already been used to conduct a study of Linux Kernel 2.6 IO-schedulers, and a great deal of future filesystem performance work is planned with FFSB as the primary tool.
+
+In version 5.0, it supports six different basic operations, support for multiple groups of threads with different operation mixtures, support for operation across multiple filesystems, and support for filesystem aging prior to benchmarking.
\ No newline at end of file
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.c
new file mode 100644
index 0000000..56430c2
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.c
@@ -0,0 +1,109 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* #define RWDEBUG 1 */
+#include "config.h"
+#include "rwlock.h"
+
+void init_rwlock(struct rwlock *rw)
+{
+	rw->n_readers = 0;
+	pthread_mutex_init(&rw->plock, NULL);
+	pthread_cond_init(&rw->pcond, NULL);
+#ifdef RWDEBUG
+	rw->n_write_waiting = 0;
+	rw->n_read_waiting  = 0;
+	rw->writer_tid      = -1;
+#endif
+}
+
+
+void rw_lock_read(struct rwlock *rw)
+{
+	pthread_mutex_lock(&rw->plock);
+#ifdef RWDEBUG
+	rw->n_read_waiting++;
+#endif
+	while (rw->n_readers < 0)
+		pthread_cond_wait(&rw->pcond, &rw->plock);
+	rw->n_readers++;
+#ifdef RWDEBUG
+	rw->n_read_waiting--;
+#endif
+	pthread_mutex_unlock(&rw->plock);
+}
+
+void rw_lock_write(struct rwlock *rw)
+{
+	pthread_mutex_lock(&rw->plock);
+#ifdef RWDEBUG
+	rw->n_write_waiting++;
+#endif
+	while (rw->n_readers != 0)
+		pthread_cond_wait(&rw->pcond, &rw->plock);
+	rw->n_readers = -1;
+#ifdef RWDEBUG
+	rw->n_write_waiting--;
+	rw->writer_tid = (int)pthread_self();
+#endif
+	pthread_mutex_unlock(&rw->plock);
+
+}
+
+void rw_unlock_read(struct rwlock *rw)
+{
+	pthread_mutex_lock(&rw->plock);
+	rw->n_readers -= 1 ;
+	pthread_cond_signal(&rw->pcond);
+	pthread_mutex_unlock(&rw->plock);
+}
+
+void rw_unlock_write(struct rwlock *rw)
+{
+	pthread_mutex_lock(&rw->plock);
+	rw->n_readers = 0 ;
+	pthread_cond_broadcast(&rw->pcond);
+	pthread_mutex_unlock(&rw->plock);
+}
+
+int rw_trylock_read(struct rwlock *rw)
+{
+	int ret = 1;
+	pthread_mutex_lock(&rw->plock);
+	if (rw->n_readers >= 0) {
+		rw->n_readers++;
+		ret = 0;
+	}
+	pthread_mutex_unlock(&rw->plock);
+	return ret;
+}
+
+int rw_trylock_write(struct rwlock *rw)
+{
+	int ret = 1;
+	pthread_mutex_lock(&rw->plock);
+	if (rw->n_readers == 0) {
+		ret = 0;
+		rw->n_readers = -1;
+	}
+	pthread_mutex_unlock(&rw->plock);
+	return ret;
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.h
new file mode 100644
index 0000000..4392b41
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/rwlock.h
@@ -0,0 +1,51 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _RWLOCK_H
+#define _RWLOCK_H
+
+#include <pthread.h>
+
+/* #define RWDEBUG 1 */
+
+/* n_readers >= 0 means 0 or more readers */
+/* n_readers < 0 means a writer */
+struct rwlock {
+	pthread_mutex_t plock;
+	int n_readers;
+	pthread_cond_t pcond;
+#ifdef RWDEBUG
+  int writer_tid;
+  int n_read_waiting;
+  int n_write_waiting;
+#endif
+};
+
+void init_rwlock(struct rwlock *rw);
+
+void rw_lock_read(struct rwlock *rw);
+void rw_lock_write(struct rwlock *rw);
+
+void rw_unlock_read(struct rwlock *rw);
+void rw_unlock_write(struct rwlock *rw);
+
+int rw_trylock_read(struct rwlock *rw);
+int rw_trylock_write(struct rwlock *rw);
+
+
+
+#endif
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/stamp-h.in b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/stamp-h.in
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.c b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.c
new file mode 100644
index 0000000..df5d755
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.c
@@ -0,0 +1,351 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2004
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/select.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <limits.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include "config.h"
+#include "fh.h"
+#include "util.h"
+
+uint64_t ffsb_get_filesize(char *name)
+{
+#ifndef HAVE_STAT64
+ #define STAT(a, b) do { stat((a), (b)); } while (0)
+	struct stat filestat;
+#else
+ #define STAT(a, b) do { stat64((a), (b)); } while (0)
+	struct stat64 filestat;
+#endif
+
+
+	STAT(name, &filestat);
+	return (uint64_t)filestat.st_size;
+#undef STAT
+}
+
+
+void *ffsb_malloc(size_t size)
+{
+	void *ptr = malloc((size));
+	assert(ptr != NULL);
+	memset(ptr, 0, size);
+	return ptr;
+}
+
+void *ffsb_realloc(void *ptr, size_t size)
+{
+	void *tmp ;
+	/* printf("ffsb_realloc: ptr = %p  size = %ld\n",ptr,size); */
+
+	if (ptr == NULL)
+		return ffsb_malloc(size);
+
+	tmp = realloc(ptr, size);
+	assert(ptr != NULL);
+	ptr = tmp;
+	return ptr;
+}
+
+void *ffsb_align_4k(void *ptr)
+{
+	unsigned long mask = ~(0xfff); /* 12 zeros at the end */
+	void *ret = (void *)((unsigned long)ptr & mask);
+	/* printf("align_4k got %p returning %p\n",ptr,ret); */
+	return ret;
+}
+
+char *ffsb_strdup(const char *str)
+{
+	int len = strlen(str);
+	char *dup = ffsb_malloc(len + 1);
+	/* !!! am I off by one here ?? */
+	strncpy(dup, str, len+1);
+	return dup;
+}
+
+size_t ffsb_strnlen(const char *str, size_t maxlen)
+{
+	size_t index = 0;
+
+	while (index < maxlen) {
+		if (str[index] == '\0')
+			break;
+		index++;
+	}
+	return index;
+}
+
+/* not perfect, in case we are somehow interrupted it's borked */
+void ffsb_sleep(unsigned secs)
+{
+	struct timeval tv = { 0 , 0 };
+	tv.tv_sec = secs;
+	select(0, NULL, NULL, NULL, &tv);
+}
+
+
+char *ffsb_printsize(char *buf, double size, int bufsize)
+{
+	if (size >= 1024 * 1024 * 1024)
+		snprintf(buf, bufsize, "%.3gGB", size / (1024 * 1024 * 1024));
+	else if (size >= 1024 * 1024)
+		snprintf(buf, bufsize, "%.3gMB", size / (1024 * 1024));
+	else if (size >= 1024)
+		snprintf(buf, bufsize, "%.3gKB", size/1024);
+	else
+		snprintf(buf, bufsize, "%.3gB", size);
+
+	return buf;
+}
+
+void ffsb_mkdir(char *dirname)
+{
+	if (mkdir(dirname, S_IRWXU) < 0) {
+		fprintf(stderr, "Error creating %s\n", dirname);
+		perror("mkdir");
+		exit(1);
+	}
+}
+
+struct timeval tvsub(struct timeval t1, struct timeval t0)
+{
+	struct timeval tdiff;
+	tdiff.tv_sec = t1.tv_sec - t0.tv_sec;
+	tdiff.tv_usec = t1.tv_usec - t0.tv_usec;
+	if (tdiff.tv_usec < 0)
+		tdiff.tv_sec--, tdiff.tv_usec += 1000000;
+	return tdiff;
+}
+
+struct timeval tvadd(struct timeval t1, struct timeval t0)
+{
+	struct timeval tdiff;
+	tdiff.tv_sec = t1.tv_sec + t0.tv_sec;
+	tdiff.tv_usec = t1.tv_usec + t0.tv_usec;
+	if (tdiff.tv_usec > 1000000)
+		tdiff.tv_sec++, tdiff.tv_usec -= 1000000;
+	return tdiff;
+}
+
+double tvtodouble(struct timeval *t)
+{
+	return ((double)t->tv_sec*(1000000.0f) + (double)t->tv_usec) /
+		1000000.0f;
+}
+
+double cpu_so_far(void)
+{
+	struct rusage rusage;
+
+	getrusage(RUSAGE_SELF, &rusage);
+
+	return
+		((double) rusage.ru_utime.tv_sec) +
+		(((double) rusage.ru_utime.tv_usec) / 1000000.0) +
+		((double) rusage.ru_stime.tv_sec) +
+		(((double) rusage.ru_stime.tv_usec) / 1000000.0);
+}
+
+double cpu_so_far_children(void)
+{
+	struct rusage rusage;
+
+	getrusage(RUSAGE_CHILDREN, &rusage);
+
+	return
+		((double) rusage.ru_utime.tv_sec) +
+		(((double) rusage.ru_utime.tv_usec) / 1000000.0) +
+		((double) rusage.ru_stime.tv_sec) +
+		(((double) rusage.ru_stime.tv_usec) / 1000000.0);
+}
+
+
+/* !!!! check portability */
+float getfsutil(char *dirname)
+{
+	struct statvfs64 fsdata;
+
+	statvfs64(dirname, &fsdata);
+
+/* 	return (float)(fsdata.f_blocks-fsdata.f_bfree)/ */
+/* 		(float)(fsdata.f_blocks-fsdata.f_bfree+fsdata.f_bavail); */
+	return (float) (((float)(fsdata.f_blocks - fsdata.f_bfree)) /
+			((float)fsdata.f_blocks));
+}
+
+uint64_t getfsutil_size(char *dirname)
+{
+	struct statvfs64 fsdata;
+	statvfs64(dirname, &fsdata);
+
+	return (fsdata.f_blocks - fsdata.f_bfree) * fsdata.f_bsize;
+}
+
+int ffsb_system(char *command)
+{
+	int pid=0, status;
+	extern char **environ;
+
+	if (command == NULL)
+		return 1;
+	pid = fork();
+	if (pid == -1)
+		return -1;
+	if (pid == 0) {
+		char *argv[4];
+		argv[0] = "sh";
+		argv[1] = "-c";
+		argv[2] = command;
+		argv[3] = 0;
+		execve("/bin/sh", argv, environ);
+		exit(127);
+	}
+	do {
+		if (waitpid(pid, &status, 0) == -1) {
+			if (errno != EINTR)
+				return -1;
+		}
+		else
+			return status;
+	} while (1);
+}
+
+void ffsb_sync()
+{
+	struct timeval starttime, endtime, difftime;
+	printf("Syncing()...");
+	fflush(stdout);
+	gettimeofday(&starttime, NULL);
+	sync();
+	gettimeofday(&endtime, NULL);
+	timersub(&endtime, &starttime, &difftime);
+	printf("%ld sec\n", difftime.tv_sec);
+}
+
+void ffsb_getrusage(struct rusage *ru_self, struct rusage *ru_children)
+{
+	int ret = 0;
+/* 	printf("cpu_so_far is %lf\n",cpu_so_far()); */
+/* 	printf("cpu_so_far_children is %lf\n",cpu_so_far_children()); */
+	ret = getrusage(RUSAGE_SELF, ru_self);
+	if (ret < 0)
+		perror("getrusage self");
+
+/* 	printf("self returned %d\n",ret); */
+	ret = getrusage(RUSAGE_CHILDREN, ru_children);
+	if (ret < 0)
+		perror("getrusage children");
+/* 	printf("children returned %d\n",ret); */
+}
+
+void ffsb_milli_sleep(unsigned time)
+{
+	struct timeval tv = { 0 , 0 };
+	if (!time)
+		return;
+	tv.tv_usec = time * 1000;
+	select(0, NULL, NULL, NULL, &tv);
+}
+
+void ffsb_micro_sleep(unsigned time)
+{
+	struct timeval tv = { 0 , 0 };
+	if (!time)
+		return;
+	tv.tv_usec = time ;
+	select(0, NULL, NULL, NULL, &tv);
+}
+
+
+void ffsb_barrier_init(ffsb_barrier_t *fb, unsigned count)
+{
+	memset(fb, 0, sizeof(*fb));
+	pthread_mutex_init(&fb->plock, NULL);
+	pthread_cond_init(&fb->pcond, NULL);
+	fb->required_count = count;
+}
+
+void ffsb_barrier_wait(ffsb_barrier_t *fb)
+{
+	pthread_mutex_lock(&fb->plock);
+
+	fb->current_count++;
+
+	if (fb->current_count == fb->required_count)
+		pthread_cond_broadcast(&fb->pcond);
+	else
+		while (fb->current_count != fb->required_count)
+			pthread_cond_wait(&fb->pcond, &fb->plock);
+
+	pthread_mutex_unlock(&fb->plock);
+}
+
+void ffsb_unbuffer_stdout(void)
+{
+#ifndef SETVBUF_REVERSED
+	setvbuf(stdout, NULL, _IONBF, 0);
+#else
+	setvbuf(stdout, _IONBF, NULL, 0);
+#endif
+}
+
+void ffsb_bench_gettimeofday(void)
+{
+	unsigned long i = 0;
+	uint64_t total_usec;
+	uint64_t average = 0;
+	struct timeval starttime, endtime, junk, difftime;
+	gettimeofday(&starttime, NULL);
+	for (i = 0; i < 1000000; i++)
+		gettimeofday(&junk, NULL);
+	gettimeofday(&endtime, NULL);
+	timersub(&endtime, &starttime, &difftime);
+	total_usec = difftime.tv_sec * 1000000;
+	total_usec += difftime.tv_usec;
+	average = total_usec / 1000ull;
+	printf("average time for gettimeofday(): %llu nsec\n", average);
+}
+
+void ffsb_bench_getpid(void)
+{
+	unsigned long i = 0;
+	uint64_t total_usec;
+	uint64_t average = 0;
+	struct timeval starttime, endtime, difftime;
+	gettimeofday(&starttime, NULL);
+	for (i = 0; i < 1000000; i++)
+		getpid();
+	gettimeofday(&endtime, NULL);
+	timersub(&endtime, &starttime, &difftime);
+	total_usec = difftime.tv_sec * 1000000;
+	total_usec += difftime.tv_usec;
+	average = total_usec / 1000ull;
+	printf("average time for getpid(): %llu nsec\n", average);
+}
diff --git a/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.h b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.h
new file mode 100644
index 0000000..c1f5798
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/ffsb-6.0-rc2/util.h
@@ -0,0 +1,94 @@
+/*
+ *   Copyright (c) International Business Machines Corp., 2001-2006
+ *
+ *   This program is free software;  you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation; either version 2 of the License, or
+ *   (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ *   the GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program;  if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef _UTIL_H_
+#define _UTIL_H_
+
+#include "config.h"
+
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+#include <sys/statvfs.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <pthread.h>
+
+
+void ffsb_sleep(unsigned secs);
+void *ffsb_malloc(size_t size);
+void *ffsb_realloc(void *ptr, size_t size);
+char *ffsb_strdup(const char *str);
+size_t ffsb_strnlen(const char *str, size_t maxlen);
+
+void ffsb_mkdir(char *dirname);
+void ffsb_getrusage(struct rusage *ru_self, struct rusage *ru_children);
+void ffsb_sync(void);
+void *ffsb_align_4k(void *ptr);
+char *ffsb_printsize(char *buf, double size, int bufsize);
+
+int ffsb_system(char *command);
+void ffsb_milli_sleep(unsigned time);
+void ffsb_micro_sleep(unsigned time);
+void ffsb_unbuffer_stdout(void);
+void ffsb_bench_gettimeofday(void);
+void ffsb_bench_getpid(void);
+
+uint64_t ffsb_get_filesize(char *name);
+
+typedef struct {
+	unsigned required_count;
+	unsigned current_count;
+	pthread_mutex_t plock;
+	pthread_cond_t pcond;
+} ffsb_barrier_t ;
+
+void ffsb_barrier_init(ffsb_barrier_t *fb, unsigned count);
+void ffsb_barrier_wait(ffsb_barrier_t *fb);
+
+double cpu_so_far(void);
+double time_so_far(void);
+double cpu_so_far_children(void);
+float getfsutil(char *dirname);
+uint64_t getfsutil_size(char *dirname);
+
+struct timeval tvsub(struct timeval t1, struct timeval t0);
+struct timeval tvadd(struct timeval t1, struct timeval t0);
+double tvtodouble(struct timeval *t);
+
+
+#define max(a, b) (((a) > (b)) ? (a) : (b))
+
+#ifndef timersub
+#define timersub(a, b, result)                                          \
+	do {           	                                                \
+		(result)->tv_sec = (a)->tv_sec - (b)->tv_sec;		\
+		(result)->tv_usec = (a)->tv_usec - (b)->tv_usec;	\
+									\
+		if ((result)->tv_usec < 0) {				\
+			(result)->tv_sec--;				\
+			(result)->tv_usec += 1000000;			\
+		}							\
+	} while (0)
+#endif /* timersub */
+
+#endif /* _UTIL_H_ */
diff --git a/testcases/kernel/fs/ext4-new-features/run_ext4_test.sh b/testcases/kernel/fs/ext4-new-features/run_ext4_test.sh
new file mode 100755
index 0000000..534d2b9
--- /dev/null
+++ b/testcases/kernel/fs/ext4-new-features/run_ext4_test.sh
@@ -0,0 +1,179 @@
+#! /bin/bash
+
+################################################################################
+#                                                                              #
+# Copyright (c) 2009 FUJITSU LIMITED                                           #
+#                                                                              #
+# This program is free software;  you can redistribute it and#or modify        #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation; either version 2 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful, but          #
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY   #
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License     #
+# for more details.                                                            #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program;  if not, write to the Free Software                 #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA      #
+#                                                                              #
+################################################################################
+# Name Of File: run_ext4_test.sh                                               #
+#                                                                              #
+# Description: This file runs the tests for ext4 filesystem's new features.    #
+#                                                                              #
+# Precaution:   In order to avoid destroying the important data on the disk,   #
+#               specify a free partition to be used for test please.           #
+#                                                                              #
+# Author:       Li Zefan    <lizf@cn.fujitsu.com>                              #
+#                                                                              #
+# History:                                                                     #
+#                                                                              #
+#  DATE      NAME        EMAIL                    DESC                         #
+#                                                                              #
+#  09/10/08  Li Zefan    <lizf@cn.fujitsu.com>    Created this test            #
+#  08/25/09  Miao Xie    <miaox@cn.fujitsu.com>   Moved to LTP                 #
+#                                                                              #
+################################################################################
+
+source ext4_funcs.sh;
+
+export TCID="ext4_new_feature"
+export TST_TOTAL=1
+export TST_COUNT=1
+
+tst_kvercmp 2 6 31
+if [ $? -eq 0 ]; then
+	tst_brkm TCONF ignored "kernel is below 2.6.31"
+	exit 0
+fi
+
+if [ "$USER" != root ]; then
+	tst_brkm TCONF ignored "Test must be run as root"
+	exit 0
+fi
+
+EXT4_SUPPORT1=`grep -w ext4 /proc/filesystems | cut -f2`
+EXT4_SUPPORT2=`grep -w ext4 /proc/modules | cut -f1`
+if [  "$EXT4_SUPPORT1" != "ext4" ] && [ "$EXT4_SUPPORT2" != "ext4" ]; then
+	tst_brkm TCONF ignored "Ext4 is not supported"
+	exit 0
+fi
+
+if [ ! -f "ffsb" ]; then
+	tst_brkm TCONF ignored "ffsb does not exist.Please check whether ffsb was configed and compiled"
+	exit 0
+fi
+
+if [ ! -f "ext4-test-config" ]; then
+	tst_brkm TCONF ignored "Config file ext4-test-config does not exist. Please check whether the configure wan ran"
+	exit 0
+fi
+
+cd $LTPROOT/testcases/bin/
+
+RET=0
+
+echo "EXT4 NEW FEATURE TESTING";
+echo "TEST STARTED: Please avoid using system while this test executes";
+
+echo " "
+echo "Ext4 block allocation test"
+if [ -f "ext4-alloc-test.sh" ]; then
+	./ext4-alloc-test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 journal checksum test"
+if [ -f "ext4_journal_checksum.sh" ]; then
+	./ext4_journal_checksum.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 subdir limit test"
+if [ -f "ext4_subdir_limit_test.sh" ]; then
+	./ext4_subdir_limit_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 nanosecond timestamp test"
+if [ -f "ext4_nsec_timestamps_test.sh" ]; then
+	./ext4_nsec_timestamps_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 persist prealloc test"
+if [ -f "ext4_persist_prealloc_test.sh" ]; then
+	./ext4_persist_prealloc_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 inode version test"
+if [ -f "ext4_inode_version_test.sh" ]; then
+	./ext4_inode_version_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 uninit groups test"
+if [ -f "ext4_uninit_groups_test.sh" ]; then
+	./ext4_uninit_groups_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+echo " "
+echo "Ext4 online defrag test"
+echo "The output of defrag program is in the file"\
+	"LTPROOT/output/ext4_online_defrag.txt"
+if [ -f "ext4_online_defrag_test.sh" ]; then
+	./ext4_online_defrag_test.sh ./ext4-test-config
+	if [ $? -ne 0 ]; then
+		RET=1
+	fi
+else
+	echo "Shell file is not installed..Please check Makefile..."
+	RET=1
+fi
+
+exit $RET