[v2,1/2] common/casefold: Add infrastructure to test filename casefold feature
diff mbox series

Message ID 20190606193138.25852-1-krisman@collabora.com
State New
Headers show
Series
  • [v2,1/2] common/casefold: Add infrastructure to test filename casefold feature
Related show

Commit Message

Gabriel Krisman Bertazi June 6, 2019, 7:31 p.m. UTC
Add a set of basic helper functions to simplify the testing of
casefolding capable filesystems.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
---
 common/casefold | 108 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)
 create mode 100644 common/casefold

Comments

Eryu Guan June 7, 2019, 4:08 p.m. UTC | #1
On Thu, Jun 06, 2019 at 03:31:37PM -0400, Gabriel Krisman Bertazi wrote:
> Add a set of basic helper functions to simplify the testing of
> casefolding capable filesystems.
> 
> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
> ---
>  common/casefold | 108 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 108 insertions(+)
>  create mode 100644 common/casefold
> 
> diff --git a/common/casefold b/common/casefold
> new file mode 100644
> index 000000000000..34c1d4ae1af1
> --- /dev/null
> +++ b/common/casefold
> @@ -0,0 +1,108 @@
> +#-----------------------------------------------------------------------
> +#
> +# Common functions for testing filename casefold feature
> +#
> +#-----------------------------------------------------------------------
> +# Copyright (c) 2018 Collabora, Ltd.  All Rights Reserved.
                   ^^^^ 2019?
> +#
> +# Author: Gabriel Krisman Bertazi <krisman@collabora.com>
> +#
> +# 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.
> +#
> +# This program is distributed in the hope that it would 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 the Free Software Foundation,
> +# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +#-----------------------------------------------------------------------

Please use the SPDX tags to specify licence, you could take common/rc as
a reference.

> +
> +_has_casefold_feature_kernel_support() {

The name seems a bit long to me, just _has_casefold_kernel_support()?

> +    case $FSTYP in
> +	ext4)
> +	    test -f '/sys/fs/ext4/features/casefold'
> +	    ;;
> +	*)
> +	    # defaults to unsupported
> +	    false
> +	    ;;
> +    esac

Please use 8-spaces tab for indention. The same for the new test.

> +}
> +
> +_require_casefold_support() {

_require_scratch_casefold(), as the function test casefold support
against scratch device, so add "scratch" in the function name to
indicate that.

> +    if ! _has_casefold_feature_kernel_support ; then
> +	_notrun "$FSTYP does not support casefold feature"
> +    fi
> +
> +    if ! _scratch_mkfs_casefold &>>seqres.full; then
> +	_notrun "$FSTYP userspace tools do not support casefold"
> +    fi
> +
> +    # Make sure the kernel can mount a filesystem with the encoding
> +    # defined by the userspace tools.  This will fail if
> +    # the userspace tool used a more recent encoding than the one
> +    # supported in kernel space.
> +    if ! _try_scratch_mount &>>seqres.full; then
> +	_notrun \
> +	    "kernel can't mount filesystem using the encoding set by userspace"
> +    fi
> +    _scratch_unmount
> +}
> +
> +_scratch_mkfs_casefold () {
> +    case $FSTYP in
> +	ext4)
> +	    _scratch_mkfs -O casefold $*
> +	    ;;
> +	*)
> +	    _notrun "Don't know how to mkfs with casefold support on $FSTYP"
> +	    ;;
> +	esac
> +}
> +
> +_scratch_mkfs_casefold_strict () {
> +    case $FSTYP in
> +	ext4)
> +	    _scratch_mkfs -O casefold -E encoding_flags=strict
> +	    ;;
> +	*)
> +	    _notrun \
> +		"Don't know how to mkfs with casefold-strict support on $FSTYP"
> +	    ;;
> +	esac
> +}
> +
> +_casefold_check_exact_name () {
> +    # To get the exact disk name, we need some method that does a
> +    # getdents() on the parent directory, such that we don't get
> +    # normalized/casefolded results.  'Find' works ok.

I think these could go before the helper.

> +    basedir=$1
> +    exact_name=$2

Declare local variables as "local", the same for all other local
variables, both in this casefold file and in the new test.

> +    find ${basedir} | grep -q ${exact_name}
> +}
> +
> +_try_set_casefold_attr () {
> +    chattr +F "${1}" &>/dev/null

$CHATTR_PROG

And need to require chattr in _require_scratch_casefold() too, e.g.

	_require_command "$CHATTR_PROG" chattr
> +}
> +
> +_try_unset_casefold_attr () {
> +    chattr -F "${1}" &>/dev/null

Same here. And I don't think we should redirect chattr output in these
helper functions, just let callers handle the outputs.

> +}
> +
> +_set_casefold_attr () {
> +    _try_set_casefold_attr "${1}" || \
> +	_fail "Unable to set casefold attribute on ${1}"
> +}
> +
> +_unset_casefold_attr () {
> +    _try_unset_casefold_attr "${1}" || \
> +	_fail "Unable to unset casefold attribute on ${1}"
> +}

And no need to _fail here. IMHO, just two helpers like:

_set_casefold_attr()
{
	$CHATTR_PROG +F "${1}"
}

_unset_casefold_attr()
{
	$CHATTR_PROG -F "${1}"
}

And let callers deal with the outputs/results. More comments on this in
next patch.

> +
> +_is_casefolded_dir () {
> +    lsattr -ld "${1}" | grep -q "Casefold"
> +}

$LSATTR_PROG, and do 

	_require_command "$LSATTR_PROG" lsattr

in _require_scratch_casefold() as well.

Thanks,
Eryu
> -- 
> 2.20.1
>

Patch
diff mbox series

diff --git a/common/casefold b/common/casefold
new file mode 100644
index 000000000000..34c1d4ae1af1
--- /dev/null
+++ b/common/casefold
@@ -0,0 +1,108 @@ 
+#-----------------------------------------------------------------------
+#
+# Common functions for testing filename casefold feature
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2018 Collabora, Ltd.  All Rights Reserved.
+#
+# Author: Gabriel Krisman Bertazi <krisman@collabora.com>
+#
+# 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.
+#
+# This program is distributed in the hope that it would 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 the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+
+_has_casefold_feature_kernel_support() {
+    case $FSTYP in
+	ext4)
+	    test -f '/sys/fs/ext4/features/casefold'
+	    ;;
+	*)
+	    # defaults to unsupported
+	    false
+	    ;;
+    esac
+}
+
+_require_casefold_support() {
+    if ! _has_casefold_feature_kernel_support ; then
+	_notrun "$FSTYP does not support casefold feature"
+    fi
+
+    if ! _scratch_mkfs_casefold &>>seqres.full; then
+	_notrun "$FSTYP userspace tools do not support casefold"
+    fi
+
+    # Make sure the kernel can mount a filesystem with the encoding
+    # defined by the userspace tools.  This will fail if
+    # the userspace tool used a more recent encoding than the one
+    # supported in kernel space.
+    if ! _try_scratch_mount &>>seqres.full; then
+	_notrun \
+	    "kernel can't mount filesystem using the encoding set by userspace"
+    fi
+    _scratch_unmount
+}
+
+_scratch_mkfs_casefold () {
+    case $FSTYP in
+	ext4)
+	    _scratch_mkfs -O casefold $*
+	    ;;
+	*)
+	    _notrun "Don't know how to mkfs with casefold support on $FSTYP"
+	    ;;
+	esac
+}
+
+_scratch_mkfs_casefold_strict () {
+    case $FSTYP in
+	ext4)
+	    _scratch_mkfs -O casefold -E encoding_flags=strict
+	    ;;
+	*)
+	    _notrun \
+		"Don't know how to mkfs with casefold-strict support on $FSTYP"
+	    ;;
+	esac
+}
+
+_casefold_check_exact_name () {
+    # To get the exact disk name, we need some method that does a
+    # getdents() on the parent directory, such that we don't get
+    # normalized/casefolded results.  'Find' works ok.
+    basedir=$1
+    exact_name=$2
+    find ${basedir} | grep -q ${exact_name}
+}
+
+_try_set_casefold_attr () {
+    chattr +F "${1}" &>/dev/null
+}
+
+_try_unset_casefold_attr () {
+    chattr -F "${1}" &>/dev/null
+}
+
+_set_casefold_attr () {
+    _try_set_casefold_attr "${1}" || \
+	_fail "Unable to set casefold attribute on ${1}"
+}
+
+_unset_casefold_attr () {
+    _try_unset_casefold_attr "${1}" || \
+	_fail "Unable to unset casefold attribute on ${1}"
+}
+
+_is_casefolded_dir () {
+    lsattr -ld "${1}" | grep -q "Casefold"
+}