From: Artem Blagodarenko This test verifies that files created in directories with both encryption and case-insensitive (casefold) attributes work correctly. See ext4/065 for the same test WITH dirdata feature enabled. Signed-off-by: Artem Blagodarenko --- tests/ext4/064 | 153 +++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/064.out | 17 +++++ 2 files changed, 170 insertions(+) diff --git a/tests/ext4/064 b/tests/ext4/064 new file mode 100755 index 00000000..53450927 --- /dev/null +++ b/tests/ext4/064 @@ -0,0 +1,153 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (c) 2026 The Lustre Collective. All Rights Reserved. +# Author: Artem Blagodarenko +# +# FS QA Test ext4/064 +# +# Test ext4 encryption + casefold feature combination WITHOUT dirdata. +# This test verifies that files created in directories with both +# encryption and case-insensitive (casefold) attributes work correctly. +# See ext4/065 for the same test WITH dirdata feature enabled. +# +. ./common/preamble +_begin_fstest auto quick encrypt casefold + +# get standard environment and checks +. ./common/filter +. ./common/encrypt +. ./common/casefold +. ./common/attr + +_exclude_fs ext2 +_exclude_fs ext3 + +_require_scratch_nocheck +_require_scratch_encryption +_require_scratch_casefold +_require_xfs_io_command "set_encpolicy" +_require_xfs_io_command "add_enckey" + +# Helper to add a v2 encryption key and set policy on a directory +_setup_encrypted_casefold_dir() +{ + local dir=$1 + local raw_key=$(_generate_raw_encryption_key) + local keyspec=$(_add_enckey $SCRATCH_MNT "$raw_key" | awk '{print $NF}') + _set_encpolicy $dir $keyspec + _casefold_set_attr $dir + echo $keyspec +} + +# Create a filesystem with both encrypt and casefold features +_scratch_mkfs -O encrypt,casefold &>>$seqres.full +_scratch_mount + +# Test 1: Create an encrypted + casefolded directory and verify lookups work +echo "Test 1: Basic encrypted casefold lookup" +mkdir $SCRATCH_MNT/test1 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test1 > /dev/null + +# Create file with lowercase, lookup with uppercase +echo "hello" > $SCRATCH_MNT/test1/testfile.txt +if [ -f "$SCRATCH_MNT/test1/TESTFILE.TXT" ]; then + echo "Case-insensitive lookup works in encrypted dir" +else + echo "FAIL: Case-insensitive lookup failed in encrypted dir" +fi + +# Verify the exact name on disk is preserved +if _casefold_check_exact_name "$SCRATCH_MNT/test1" "testfile.txt"; then + echo "Original filename preserved" +else + echo "FAIL: Original filename not preserved" +fi + +# Test 2: Create files with different case variations +echo "Test 2: Conflicting names in encrypted casefold dir" +mkdir $SCRATCH_MNT/test2 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test2 > /dev/null + +echo "first" > $SCRATCH_MNT/test2/MyFile.txt +# This should fail or overwrite since "MYFILE.TXT" is equivalent +echo "second" > $SCRATCH_MNT/test2/MYFILE.TXT 2>/dev/null +content=$(cat $SCRATCH_MNT/test2/myfile.txt) +echo "Content after writes: $content" + +# Test 3: Unicode normalization in encrypted casefold dir +echo "Test 3: Unicode in encrypted casefold dir" +mkdir $SCRATCH_MNT/test3 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test3 > /dev/null + +# Test with UTF-8 characters +fr_file1=$(echo -e "cafe\xcc\x81.txt") +fr_file2=$(echo -e "caf\xc3\xa9.txt") +echo "french" > "$SCRATCH_MNT/test3/$fr_file1" +if [ -f "$SCRATCH_MNT/test3/$fr_file2" ]; then + echo "Unicode normalization works in encrypted dir" +else + echo "FAIL: Unicode normalization failed in encrypted dir" +fi + +# Test 4: Directory operations in encrypted casefold dir +echo "Test 4: Directory operations in encrypted casefold dir" +mkdir $SCRATCH_MNT/test4 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test4 > /dev/null + +mkdir $SCRATCH_MNT/test4/SubDir +if [ -d "$SCRATCH_MNT/test4/SUBDIR" ]; then + echo "Directory case-insensitive lookup works" +else + echo "FAIL: Directory case-insensitive lookup failed" +fi + +# Test 5: Verify inheritance of casefold+encryption in subdirectories +echo "Test 5: Inheritance of attributes" +mkdir $SCRATCH_MNT/test5 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test5 > /dev/null + +mkdir $SCRATCH_MNT/test5/child +echo "data" > $SCRATCH_MNT/test5/child/file.txt +if [ -f "$SCRATCH_MNT/test5/CHILD/FILE.TXT" ]; then + echo "Attributes inherited correctly" +else + echo "FAIL: Attributes not inherited" +fi + +# Test 6: Remove and recreate with different case +echo "Test 6: Remove and recreate with different case" +mkdir $SCRATCH_MNT/test6 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test6 > /dev/null + +echo "original" > $SCRATCH_MNT/test6/RemoveMe.txt +rm $SCRATCH_MNT/test6/REMOVEME.TXT +echo "recreated" > $SCRATCH_MNT/test6/REMOVEME.TXT +if _casefold_check_exact_name "$SCRATCH_MNT/test6" "REMOVEME.TXT"; then + echo "Recreated file has new case" +else + echo "FAIL: Recreated file case incorrect" +fi + +# Test 7: Hard links in encrypted casefold dir +echo "Test 7: Hard links in encrypted casefold dir" +mkdir $SCRATCH_MNT/test7 +_setup_encrypted_casefold_dir $SCRATCH_MNT/test7 > /dev/null + +echo "linkdata" > $SCRATCH_MNT/test7/original.txt +ln $SCRATCH_MNT/test7/original.txt $SCRATCH_MNT/test7/hardlink.txt +if [ -f "$SCRATCH_MNT/test7/HARDLINK.TXT" ]; then + echo "Hard link case-insensitive lookup works" +else + echo "FAIL: Hard link case-insensitive lookup failed" +fi + +# Cleanup and verify filesystem +_scratch_unmount +_check_scratch_fs + +echo "Encrypted casefold tests completed" + +# success, all done +status=0 +exit diff --git a/tests/ext4/064.out b/tests/ext4/064.out new file mode 100644 index 00000000..0197e51e --- /dev/null +++ b/tests/ext4/064.out @@ -0,0 +1,17 @@ +QA output created by 064 +Test 1: Basic encrypted casefold lookup +Case-insensitive lookup works in encrypted dir +Original filename preserved +Test 2: Conflicting names in encrypted casefold dir +Content after writes: second +Test 3: Unicode in encrypted casefold dir +Unicode normalization works in encrypted dir +Test 4: Directory operations in encrypted casefold dir +Directory case-insensitive lookup works +Test 5: Inheritance of attributes +Attributes inherited correctly +Test 6: Remove and recreate with different case +Recreated file has new case +Test 7: Hard links in encrypted casefold dir +Hard link case-insensitive lookup works +Encrypted casefold tests completed -- 2.43.7