| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright (c) 2019 Collabora, Ltd. All Rights Reserved. | |
| # | |
| # Common functions for testing filename casefold feature | |
| _has_casefold_kernel_support() | |
| { | |
| case $FSTYP in | |
| ext4) | |
| test -f '/sys/fs/ext4/features/casefold' | |
| ;; | |
| f2fs) | |
| test -f '/sys/fs/f2fs/features/casefold' | |
| ;; | |
| *) | |
| # defaults to unsupported | |
| false | |
| ;; | |
| esac | |
| } | |
| _require_scratch_casefold() | |
| { | |
| if ! _has_casefold_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 with the encoding set by userspace" | |
| fi | |
| _scratch_unmount | |
| # utilities used by casefold | |
| _require_command "$CHATTR_PROG" chattr | |
| _require_command "$LSATTR_PROG" lsattr | |
| } | |
| _scratch_mkfs_casefold() | |
| { | |
| case $FSTYP in | |
| ext4) | |
| _scratch_mkfs -O casefold $* | |
| ;; | |
| f2fs) | |
| _scratch_mkfs -C utf8 $* | |
| ;; | |
| *) | |
| _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 | |
| ;; | |
| f2fs) | |
| _scratch_mkfs -C utf8:strict | |
| ;; | |
| *) | |
| _notrun "Don't know how to mkfs with casefold-strict support on $FSTYP" | |
| ;; | |
| esac | |
| } | |
| # 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. | |
| _casefold_check_exact_name() | |
| { | |
| local basedir=$1 | |
| local exact_name=$2 | |
| find ${basedir} | grep -q ${exact_name} | |
| } | |
| _casefold_set_attr() | |
| { | |
| $CHATTR_PROG +F "${1}" | |
| } | |
| _casefold_unset_attr() | |
| { | |
| $CHATTR_PROG -F "${1}" | |
| } | |
| _casefold_lsattr_dir() | |
| { | |
| if $LSATTR_PROG -ld "${1}" | grep -q Casefold ; then | |
| echo "${1} Casefold" | |
| else | |
| echo "${1}" | |
| fi | |
| } |