From patchwork Mon Nov 21 11:31:28 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dave Chinner X-Patchwork-Id: 126755 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id EB753B720D for ; Mon, 21 Nov 2011 22:37:02 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756179Ab1KULg6 (ORCPT ); Mon, 21 Nov 2011 06:36:58 -0500 Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]:2168 "EHLO ipmail06.adl2.internode.on.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755631Ab1KULgv (ORCPT ); Mon, 21 Nov 2011 06:36:51 -0500 X-Greylist: delayed 303 seconds by postgrey-1.27 at vger.kernel.org; Mon, 21 Nov 2011 06:36:41 EST X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAPk1yk55LGY5/2dsb2JhbABDqjeBBoFyAQEFViMQCBgxOQMbGbtDg1mGPgSmVQ Received: from ppp121-44-102-57.lns20.syd6.internode.on.net (HELO dastard) ([121.44.102.57]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Nov 2011 22:01:46 +1030 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1RSS67-00080w-DZ; Mon, 21 Nov 2011 22:31:39 +1100 Received: from dave by disappointment with local (Exim 4.76) (envelope-from ) id 1RSS61-00083a-2m; Mon, 21 Nov 2011 22:31:33 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 8/8] xfstests: enable large fs testing on ext4 Date: Mon, 21 Nov 2011 22:31:28 +1100 Message-Id: <1321875088-30801-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.5.4 In-Reply-To: <1321875088-30801-1-git-send-email-david@fromorbit.com> References: <1321875088-30801-1-git-send-email-david@fromorbit.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Dave Chinner Now that setting up large filesystem testing on sparse loopback devices uses a generic method for filling the filesystem, extent support to ext4 filesystems. ext4 is slightly more complex to fill as it does not support files larger than 16TB. Hence a slightly more complex method of using multiple smaller files to fill the space is necessary. Signed-off-by: Dave Chinner --- common.rc | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 90 insertions(+), 0 deletions(-) diff --git a/common.rc b/common.rc index 9b9041f..7bb8f50 100644 --- a/common.rc +++ b/common.rc @@ -366,6 +366,93 @@ _scratch_mkfs_xfs() return $mkfs_status } +_setup_large_ext4_fs() +{ + fs_size=$1 + local tmp_dir=/tmp/ + + [ "$LARGE_SCRATCH_DEV" != yes ] && return 0 + [ -z "$SCRATCH_DEV_EMPTY_SPACE" ] && SCRATCH_DEV_EMPTY_SPACE=0 + [ $SCRATCH_DEV_EMPTY_SPACE -ge $fs_size ] && return 0 + + # Default free space in the FS is 50GB, but you can specify more via + # SCRATCH_DEV_EMPTY_SPACE + space_to_consume=$(($fs_size - 50*1024*1024*1024 - $SCRATCH_DEV_EMPTY_SPACE)) + + # mount the filesystem and create 16TB - 4KB files until we consume + # all the necessary space. + _scratch_mount 2>&1 >$tmp_dir/mnt.err + local status=$? + if [ $status -ne 0 ]; then + echo "mount failed" + cat $tmp_dir/mnt.err >&2 + rm -f $tmp_dir/mnt.err + return $status + fi + rm -f $tmp_dir/mnt.err + + file_size=$((16*1024*1024*1024*1024 - 4096)) + nfiles=0 + while [ $space_to_consume -gt $file_size ]; do + + xfs_io -F -f \ + -c "truncate $file_size" \ + -c "falloc -k 0 $file_size" \ + $SCRATCH_MNT/.use_space.$nfiles 2>&1 + status=$? + if [ $status -ne 0 ]; then + break; + fi + + space_to_consume=$(( $space_to_consume - $file_size )) + nfiles=$(($nfiles + 1)) + done + + # consume the remaining space. + if [ $space_to_consume -gt 0 ]; then + xfs_io -F -f \ + -c "truncate $space_to_consume" \ + -c "falloc -k 0 $space_to_consume" \ + $SCRATCH_MNT/.use_space.$nfiles 2>&1 + status=$? + fi + + umount $SCRATCH_MNT + if [ $status -ne 0 ]; then + echo "large file prealloc failed" + cat $tmp_dir/mnt.err >&2 + return $status + fi + return 0 +} +_scratch_mkfs_ext4() +{ + local tmp_dir=/tmp/ + + /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV \ + 2>$tmp_dir.mkfserr 1>$tmp_dir.mkfsstd + local mkfs_status=$? + + if [ $mkfs_status -eq 0 -a "$LARGE_SCRATCH_DEV" = yes ]; then + # manually parse the mkfs output to get the fs size in bytes + fs_size=`cat $tmp_dir.mkfsstd | awk ' \ + /^Block size/ { split($2, a, "="); bs = a[2] ; } \ + / inodes, / { blks = $3 } \ + /reserved for the super user/ { resv = $1 } \ + END { fssize = bs * blks - resv; print fssize }'` + + _setup_large_ext4_fs $fs_size + mkfs_status=$? + fi + + # output stored mkfs output + cat $tmp_dir.mkfserr >&2 + cat $tmp_dir.mkfsstd + rm -f $tmp_dir.mkfserr $tmp_dir.mkfsstd + + return $mkfs_status +} + _scratch_mkfs() { case $FSTYP in @@ -381,6 +468,9 @@ _scratch_mkfs() btrfs) $MKFS_BTRFS_PROG $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null ;; + ext4) + _scratch_mkfs_ext4 $* + ;; *) /sbin/mkfs -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV ;;