All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
To: fstests@vger.kernel.org
Cc: linux-btrfs@vger.kernel.org, eguan@redhat.com, darrick.wong@oracle.com
Subject: Re: [PATCH v4] generic: make 17[1-4] work well when btrfs compression is enabled
Date: Tue, 1 Nov 2016 16:49:34 +0800	[thread overview]
Message-ID: <5818571E.8020806@cn.fujitsu.com> (raw)
In-Reply-To: <20161101084503.6578-1-wangxg.fnst@cn.fujitsu.com>

hi Darrick,

Common/populate needs xfs_io supports falloc and fpunch,
so I didn't put _fill_fs() in common/populate.

Regards,
Xiaoguang Wang

On 11/01/2016 04:45 PM, Wang Xiaoguang wrote:
> When enabling btrfs compression, original codes can not fill fs
> correctly, here we introduce _fill_fs() in common/rc, which'll keep
> creating and writing files until enospc error occurs. Note _fill_fs
> is copied from tests/generic/256, but with some minor modifications.
>
> Signed-off-by: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
> ---
> V2: In common/, I did't find an existing function suitable for
>      these 4 test cases to fill fs, so I still use _pwrite_byte() with
>      a big enough file length fo fill fs. Note, for btrfs, metadata space
>      still is not full, only data space is full, but it's OK for these
>      4 test cases.
>
>      All these 4 cases pass in xfs and btrfs(without compression), if
>      btrfs has compression enabled, these 4 cases will fail for false
>      enospc error, I have sent kernel patches to fix this bug.
>
> V3: Introduce  _fill_fs in common/rc to fill fs.
> V4: Fix some issues suggested by Eryu and Darrick.
> ---
>   common/rc         | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   tests/generic/171 |  3 +--
>   tests/generic/172 |  4 ++--
>   tests/generic/173 |  3 +--
>   tests/generic/174 |  3 +--
>   tests/generic/256 | 65 ++++------------------------------------------------
>   6 files changed, 78 insertions(+), 68 deletions(-)
>
> diff --git a/common/rc b/common/rc
> index 7a9fc90..7628a0e 100644
> --- a/common/rc
> +++ b/common/rc
> @@ -4003,6 +4003,74 @@ _require_xfs_mkfs_without_validation()
>   	fi
>   }
>   
> +# Fill a file system by repeatedly creating files in the given folder
> +# starting with the given file size.  Files are reduced in size when
> +# they can no longer fit until no more files can be created.
> +_fill_fs()
> +{
> +	local file_size=$1
> +	local dir=$2
> +	local block_size=$3
> +	local switch_user=$4
> +	local file_count=1
> +	local bytes_written=0
> +	local use_falloc=1;
> +
> +	if [ $# -ne 4 ]; then
> +		echo "Usage: _fill_fs filesize dir blocksize switch_user"
> +		exit 1
> +	fi
> +
> +	if [ $switch_user -eq 0 ]; then
> +		mkdir -p $dir
> +	else
> +		_user_do "mkdir -p $dir"
> +	fi
> +	if [ ! -d $dir ]; then
> +		return 0;
> +	fi
> +
> +	testio=`$XFS_IO_PROG -F -fc "falloc 0 $block_size" $dir/$$.xfs_io 2>&1`
> +	echo $testio | grep -q "not found" && use_falloc=0
> +	echo $testio | grep -q "Operation not supported" && use_falloc=0
> +
> +	if [ $file_size -lt $block_size ]; then
> +		$file_size = $block_size
> +	fi
> +
> +	while [ $file_size -ge $block_size ]; do
> +		bytes_written=0
> +		if [ $switch_user -eq 0 ]; then
> +			if [ $use_falloc -eq 0 ]; then
> +				$XFS_IO_PROG -fc "pwrite -b 8388608 0 $file_size" \
> +					$dir/$file_count
> +			else
> +				$XFS_IO_PROG -fc "falloc 0 $file_size" \
> +					$dir/$file_count
> +			fi
> +		else
> +			if [ $use_falloc -eq 0 ]; then
> +				_user_do "$XFS_IO_PROG -f -c \"pwrite -b 8388608 0 \
> +					$file_size\" $dir/$file_count"
> +			else
> +				_user_do "$XFS_IO_PROG -f -c \"falloc 0 \
> +					$file_size\" $dir/$file_count"
> +			fi
> +		fi
> +
> +		if [ -f $dir/$file_count ]; then
> +			bytes_written=$(stat -c '%s' $dir/$file_count)
> +		fi
> +
> +		# If there was no room to make the file, then divide it in
> +		# half, and keep going
> +		if [ $bytes_written -lt $file_size ]; then
> +			file_size=$((file_size / 2))
> +		fi
> +		file_count=$((file_count + 1))
> +	done
> +}
> +
>   init_rc
>   
>   ################################################################################
> diff --git a/tests/generic/171 b/tests/generic/171
> index a69f798..906e4db 100755
> --- a/tests/generic/171
> +++ b/tests/generic/171
> @@ -76,8 +76,7 @@ sync
>   
>   echo "Allocate the rest of the space"
>   nr_free=$(stat -f -c '%f' $testdir)
> -touch $testdir/file0 $testdir/file1
> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
> +_fill_fs $((nr_free * blksz)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>   sync
>   
>   echo "CoW the big file"
> diff --git a/tests/generic/172 b/tests/generic/172
> index 8192290..f6fcdc9 100755
> --- a/tests/generic/172
> +++ b/tests/generic/172
> @@ -57,6 +57,7 @@ testdir=$SCRATCH_MNT/test-$seq
>   mkdir $testdir
>   
>   echo "Reformat with appropriate size"
> +blksz="$(get_block_size $testdir)"
>   umount $SCRATCH_MNT
>   
>   file_size=$((168 * 1024 * 1024))
> @@ -72,8 +73,7 @@ _cp_reflink $testdir/bigfile $testdir/clonefile
>   sync
>   
>   echo "Allocate the rest of the space"
> -touch $testdir/file0 $testdir/file1
> -_pwrite_byte 0x61 0 $fs_size $testdir/eat_my_space >> $seqres.full 2>&1
> +_fill_fs $fs_size  $testdir/space $blksz 0 >> $seqres.full 2>&1
>   sync
>   
>   echo "CoW the big file"
> diff --git a/tests/generic/173 b/tests/generic/173
> index e35597f..10e303d 100755
> --- a/tests/generic/173
> +++ b/tests/generic/173
> @@ -76,8 +76,7 @@ sync
>   
>   echo "Allocate the rest of the space"
>   nr_free=$(stat -f -c '%f' $testdir)
> -touch $testdir/file0 $testdir/file1
> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
> +_fill_fs $((blksz * nr_free)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>   sync
>   
>   echo "mmap CoW the big file"
> diff --git a/tests/generic/174 b/tests/generic/174
> index e58d64b..455d6c3 100755
> --- a/tests/generic/174
> +++ b/tests/generic/174
> @@ -77,8 +77,7 @@ sync
>   
>   echo "Allocate the rest of the space"
>   nr_free=$(stat -f -c '%f' $testdir)
> -touch $testdir/file0 $testdir/file1
> -_pwrite_byte 0x61 0 $((blksz * nr_free)) $testdir/eat_my_space >> $seqres.full 2>&1
> +_fill_fs $((blksz * nr_free)) $testdir/space $blksz 0 >> $seqres.full 2>&1
>   sync
>   
>   echo "CoW the big file"
> diff --git a/tests/generic/256 b/tests/generic/256
> index cfbf790..9488648 100755
> --- a/tests/generic/256
> +++ b/tests/generic/256
> @@ -53,64 +53,6 @@ _require_test
>   
>   testfile=$TEST_DIR/256.$$
>   
> -# _fill_fs()
> -#
> -# Fills a file system by repeatedly creating files in the given folder
> -# starting with the given file size.  Files are reduced in size when
> -# they can no longer fit untill no more files can be created.
> -#
> -# This routine is used by _test_full_fs_punch to test that a hole may
> -# still be punched when the disk is full by borrowing reserved blocks.
> -# All files are created as a non root user to prevent reserved blocks
> -# from being consumed.
> -#
> -_fill_fs() {
> -	local file_size=$1
> -	local dir=$2
> -	local block_size=$3
> -	local file_count=1
> -	local bytes_written=0
> -
> -	if [ $# -ne 3 ]
> -	then
> -		echo "USAGE: _fill_fs filesize dir block size"
> -		exit 1
> -	fi
> -
> -	# Creation of files or folders
> -	# must not be done as root or
> -	# reserved blocks will be consumed
> -	_user_do "mkdir -p $dir &> /dev/null"
> -	if [ $? -ne 0 ] ; then
> -		return 0
> -	fi
> -
> -	if [ $file_size -lt $block_size ]
> -	then
> -		$file_size = $block_size
> -	fi
> -
> -	while [ $file_size -ge $block_size ]
> -	do
> -		bytes_written=0
> -		_user_do "$XFS_IO_PROG -f -c \"pwrite 0 $file_size\" $dir/$file_count.bin &> /dev/null"
> -
> -		if [ -f $dir/$file_count.bin ]
> -		then
> -			bytes_written=`$XFS_IO_PROG -c "stat"  $dir/$file_count.bin | grep stat.size | cut -d ' ' -f3`
> -		fi
> -
> -		# If there was no room to make the file,
> -		# then divide it in half, and keep going
> -		if [ $bytes_written -lt $file_size ]
> -		then
> -			file_size=$(( $file_size / 2 ))
> -		fi
> -		file_count=$(( $file_count + 1 ))
> -
> -	done
> -}
> -
>   # _test_full_fs_punch()
>   #
>   # This function will test that a hole may be punched
> @@ -144,7 +86,10 @@ _test_full_fs_punch()
>   		-c "fsync" $file_name &> /dev/null
>   	chmod 666 $file_name
>   
> -	_fill_fs $(( 1024 * 1024 * 1024 )) $path/fill $block_size
> +	# All files are created as a non root user to prevent reserved blocks
> +	# from being consumed.
> +	_fill_fs $(( 1024 * 1024 * 1024 )) $path/fill $block_size 1 \
> +		> /dev/null 2>&1
>   
>   	for (( i=0; i<$iterations; i++ ))
>   	do
> @@ -159,7 +104,7 @@ _test_full_fs_punch()
>   
>   		hole_offset=$(( $hole_offset + $hole_len + $hole_interval ))
>   
> -		_fill_fs $hole_len $path/fill.$i $block_size
> +		_fill_fs $hole_len $path/fill.$i $block_size 1 > /dev/null 2>&1
>   
>   	done
>   }

  reply	other threads:[~2016-11-01  8:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-01  8:45 [PATCH v4] generic: make 17[1-4] work well when btrfs compression is enabled Wang Xiaoguang
2016-11-01  8:49 ` Wang Xiaoguang [this message]
2016-11-02  1:15   ` Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5818571E.8020806@cn.fujitsu.com \
    --to=wangxg.fnst@cn.fujitsu.com \
    --cc=darrick.wong@oracle.com \
    --cc=eguan@redhat.com \
    --cc=fstests@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.