# 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 }