diff mbox series

[v3] overlay/072: test for whiteout inode sharing

Message ID 20200414093401.9792-1-cgxu519@mykernel.net (mailing list archive)
State New, archived
Headers show
Series [v3] overlay/072: test for whiteout inode sharing | expand

Commit Message

Chengguang Xu April 14, 2020, 9:34 a.m. UTC
This is a test for whiteout inode sharing feature.

Signed-off-by: Chengguang Xu <cgxu519@mykernel.net>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
---
v1->v2:
- Address Amir's comments in v1

v2->v3:
- Address Amir's comments in v2

 common/module         |   9 +++
 tests/overlay/072     | 149 ++++++++++++++++++++++++++++++++++++++++++
 tests/overlay/072.out |   2 +
 tests/overlay/group   |   1 +
 4 files changed, 161 insertions(+)
 create mode 100755 tests/overlay/072
 create mode 100644 tests/overlay/072.out

Comments

Eryu Guan April 19, 2020, 4 p.m. UTC | #1
On Tue, Apr 14, 2020 at 05:34:01PM +0800, Chengguang Xu wrote:
> This is a test for whiteout inode sharing feature.
> 
> Signed-off-by: Chengguang Xu <cgxu519@mykernel.net>
> Reviewed-by: Amir Goldstein <amir73il@gmail.com>

Looks fine to me overall, but still, I'd like to see the kernel patch
lands first.

And some minor comments inline.

It'd be great if you could provide more info about the new feature, so
people understand the feature and could review the tests with such info
in mind, "whiteout inode sharing feature" doesn't explain what it is
very well.

> ---
> v1->v2:
> - Address Amir's comments in v1
> 
> v2->v3:
> - Address Amir's comments in v2
> 
>  common/module         |   9 +++
>  tests/overlay/072     | 149 ++++++++++++++++++++++++++++++++++++++++++
>  tests/overlay/072.out |   2 +
>  tests/overlay/group   |   1 +
>  4 files changed, 161 insertions(+)
>  create mode 100755 tests/overlay/072
>  create mode 100644 tests/overlay/072.out
> 
> diff --git a/common/module b/common/module
> index 39e4e793..148e8c8f 100644
> --- a/common/module
> +++ b/common/module
> @@ -81,3 +81,12 @@ _get_fs_module_param()
>  {
>  	cat /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
>  }
> + # Set the value of a filesystem module parameter
> + # at /sys/module/$FSTYP/parameters/$PARAM
> + #
> + # Usage example:
> + #   _set_fs_module_param param value
> + _set_fs_module_param()
> +{
> +	echo ${2} > /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
> +}
> diff --git a/tests/overlay/072 b/tests/overlay/072
> new file mode 100755
> index 00000000..81e39a79
> --- /dev/null
> +++ b/tests/overlay/072
> @@ -0,0 +1,149 @@
> +#! /bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright (c) 2020 Chengguang Xu <cgxu519@mykernel.net>.
> +# All Rights Reserved.
> +#
> +# FS QA Test 072
> +#
> +# This is a test for whiteout inode sharing feature.
> +#
> +seq=`basename $0`
> +seqres=$RESULT_DIR/$seq
> +echo "QA output created by $seq"
> +
> +here=`pwd`
> +tmp=/tmp/$$
> +status=1	# failure is the default!
> +trap "_cleanup; exit \$status" 0 1 2 3 15
> +
> +_cleanup()
> +{
> +	cd /
> +	rm -f $tmp.*
> +	if [[ -n "${orig_param_value}" ]]; then
> +		_set_fs_module_param $param_name $orig_param_value
> +	fi
> +}
> +
> +# get standard environment, filters and checks
> +. ./common/rc
> +. ./common/filter
> +
> +# remove previous $seqres.full before test
> +rm -f $seqres.full
> +
> +# real QA test starts here
> +_supported_fs overlay
> +_supported_os Linux
> +_require_scratch
> +
> +param_name="whiteout_link_max"
> +
> +# Check overlayfs module param(whiteout_link_max)
> +check_whiteout_link_max()
> +{
> +	orig_param_value=`_get_fs_module_param ${param_name}`
> +	if [ -z ${orig_param_value} ]; then
> +		_notrun "${FSTYP} does not support whiteout inode sharing"
> +	fi
> +}
> +
> +lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
> +upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
> +workdir=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
> +
> +# Make some testing files in lowerdir.
> +# Argument:
> +# $1: Testing file number
> +make_lower_files()
> +{
> +	for name in `seq ${1}`
> +	do

Perfer the following style for "for loop":

	for name in `seq ${`}`; do
		...
	done

> +		touch $lowerdir/file${name} &>/dev/null
> +	done
> +}
> +
> +# Delete all copy-uped files in upperdir.
> +make_whiteout_files()
> +{
> +	rm -f $SCRATCH_MNT/* &>/dev/null
> +}
> +
> +# Check link count of whiteout files.
> +# Arguments:
> +# $1: Testing file number
> +# $2: Expected link count
> +check_whiteout_files()
> +{
> +	for name in `seq ${1}`
> +	do

Same here.

Thanks,
Eryu

> +		local real_count=`stat -c %h $upperdir/file${name} 2>/dev/null`
> +		if [[ ${2} != $real_count ]]; then
> +			echo "Expected link count is ${2} but real count is $real_count, file name is file${name}"
> +		fi
> +	done
> +	local tmpfile_count=`ls $workdir/work/\#* $workdir/index/\#* 2>/dev/null |wc -l 2>/dev/null`
> +	if [[ -n "$tmpfile_count" && $tmpfile_count > 1 ]]; then
> +		echo "There are more than one whiteout tmpfile in work/index dir!"
> +		ls -l $workdir/work/\#* $workdir/index/\#* 2>/dev/null
> +	fi
> +}
> +
> +# Run test case with specific arguments.
> +# Arguments:
> +# $1: Maximum link count
> +# $2: Testing file number
> +# $3: Expected link count
> +run_test_case()
> +{
> +	_scratch_mkfs
> +	_set_fs_module_param $param_name ${1}
> +	make_lower_files ${2}
> +	_scratch_mount
> +	make_whiteout_files
> +	check_whiteout_files ${2} ${3}
> +	_scratch_unmount
> +}
> +
> +check_whiteout_link_max
> +
> +# Case1:
> +# Setting whiteout_link_max=0 means whiteout files will not
> +# share inode, each whiteout file will have it's own inode.
> +
> +link_max=0
> +file_count=10
> +link_count=1
> +run_test_case $link_max $file_count $link_count
> +
> +# Case2:
> +# Setting whiteout_link_max=1 means whiteout files will not
> +# share inode, each whiteout file will have it's own inode.
> +
> +link_max=1
> +file_count=10
> +link_count=1
> +run_test_case $link_max $file_count $link_count
> +
> +# Case3:
> +# Setting whiteout_link_max>1 means whiteout files will share
> +# inode and link count could up to whiteout_link_max.
> +
> +link_max=2
> +file_count=10
> +link_count=2
> +run_test_case $link_max $file_count $link_count
> +
> +# Case4:
> +# Setting whiteout_link_max>1 means whiteout files will share
> +# inode and link count could up to whiteout_link_max.
> +
> +link_max=10
> +file_count=20
> +link_count=10
> +run_test_case $link_max $file_count $link_count
> +
> +# success, all done
> +echo "Silence is golden"
> +status=0
> +exit
> diff --git a/tests/overlay/072.out b/tests/overlay/072.out
> new file mode 100644
> index 00000000..590bbc6c
> --- /dev/null
> +++ b/tests/overlay/072.out
> @@ -0,0 +1,2 @@
> +QA output created by 072
> +Silence is golden
> diff --git a/tests/overlay/group b/tests/overlay/group
> index 43ad8a52..8b2276f1 100644
> --- a/tests/overlay/group
> +++ b/tests/overlay/group
> @@ -74,3 +74,4 @@
>  069 auto quick copyup hardlink exportfs nested nonsamefs
>  070 auto quick copyup redirect nested
>  071 auto quick copyup redirect nested nonsamefs
> +072 auto quick whiteout
> -- 
> 2.20.1
> 
>
diff mbox series

Patch

diff --git a/common/module b/common/module
index 39e4e793..148e8c8f 100644
--- a/common/module
+++ b/common/module
@@ -81,3 +81,12 @@  _get_fs_module_param()
 {
 	cat /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
 }
+ # Set the value of a filesystem module parameter
+ # at /sys/module/$FSTYP/parameters/$PARAM
+ #
+ # Usage example:
+ #   _set_fs_module_param param value
+ _set_fs_module_param()
+{
+	echo ${2} > /sys/module/${FSTYP}/parameters/${1} 2>/dev/null
+}
diff --git a/tests/overlay/072 b/tests/overlay/072
new file mode 100755
index 00000000..81e39a79
--- /dev/null
+++ b/tests/overlay/072
@@ -0,0 +1,149 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2020 Chengguang Xu <cgxu519@mykernel.net>.
+# All Rights Reserved.
+#
+# FS QA Test 072
+#
+# This is a test for whiteout inode sharing feature.
+#
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1	# failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+	cd /
+	rm -f $tmp.*
+	if [[ -n "${orig_param_value}" ]]; then
+		_set_fs_module_param $param_name $orig_param_value
+	fi
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs overlay
+_supported_os Linux
+_require_scratch
+
+param_name="whiteout_link_max"
+
+# Check overlayfs module param(whiteout_link_max)
+check_whiteout_link_max()
+{
+	orig_param_value=`_get_fs_module_param ${param_name}`
+	if [ -z ${orig_param_value} ]; then
+		_notrun "${FSTYP} does not support whiteout inode sharing"
+	fi
+}
+
+lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
+upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
+workdir=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
+
+# Make some testing files in lowerdir.
+# Argument:
+# $1: Testing file number
+make_lower_files()
+{
+	for name in `seq ${1}`
+	do
+		touch $lowerdir/file${name} &>/dev/null
+	done
+}
+
+# Delete all copy-uped files in upperdir.
+make_whiteout_files()
+{
+	rm -f $SCRATCH_MNT/* &>/dev/null
+}
+
+# Check link count of whiteout files.
+# Arguments:
+# $1: Testing file number
+# $2: Expected link count
+check_whiteout_files()
+{
+	for name in `seq ${1}`
+	do
+		local real_count=`stat -c %h $upperdir/file${name} 2>/dev/null`
+		if [[ ${2} != $real_count ]]; then
+			echo "Expected link count is ${2} but real count is $real_count, file name is file${name}"
+		fi
+	done
+	local tmpfile_count=`ls $workdir/work/\#* $workdir/index/\#* 2>/dev/null |wc -l 2>/dev/null`
+	if [[ -n "$tmpfile_count" && $tmpfile_count > 1 ]]; then
+		echo "There are more than one whiteout tmpfile in work/index dir!"
+		ls -l $workdir/work/\#* $workdir/index/\#* 2>/dev/null
+	fi
+}
+
+# Run test case with specific arguments.
+# Arguments:
+# $1: Maximum link count
+# $2: Testing file number
+# $3: Expected link count
+run_test_case()
+{
+	_scratch_mkfs
+	_set_fs_module_param $param_name ${1}
+	make_lower_files ${2}
+	_scratch_mount
+	make_whiteout_files
+	check_whiteout_files ${2} ${3}
+	_scratch_unmount
+}
+
+check_whiteout_link_max
+
+# Case1:
+# Setting whiteout_link_max=0 means whiteout files will not
+# share inode, each whiteout file will have it's own inode.
+
+link_max=0
+file_count=10
+link_count=1
+run_test_case $link_max $file_count $link_count
+
+# Case2:
+# Setting whiteout_link_max=1 means whiteout files will not
+# share inode, each whiteout file will have it's own inode.
+
+link_max=1
+file_count=10
+link_count=1
+run_test_case $link_max $file_count $link_count
+
+# Case3:
+# Setting whiteout_link_max>1 means whiteout files will share
+# inode and link count could up to whiteout_link_max.
+
+link_max=2
+file_count=10
+link_count=2
+run_test_case $link_max $file_count $link_count
+
+# Case4:
+# Setting whiteout_link_max>1 means whiteout files will share
+# inode and link count could up to whiteout_link_max.
+
+link_max=10
+file_count=20
+link_count=10
+run_test_case $link_max $file_count $link_count
+
+# success, all done
+echo "Silence is golden"
+status=0
+exit
diff --git a/tests/overlay/072.out b/tests/overlay/072.out
new file mode 100644
index 00000000..590bbc6c
--- /dev/null
+++ b/tests/overlay/072.out
@@ -0,0 +1,2 @@ 
+QA output created by 072
+Silence is golden
diff --git a/tests/overlay/group b/tests/overlay/group
index 43ad8a52..8b2276f1 100644
--- a/tests/overlay/group
+++ b/tests/overlay/group
@@ -74,3 +74,4 @@ 
 069 auto quick copyup hardlink exportfs nested nonsamefs
 070 auto quick copyup redirect nested
 071 auto quick copyup redirect nested nonsamefs
+072 auto quick whiteout