1#!/bin/ksh -p 2# 3# 4# This file and its contents are supplied under the terms of the 5# Common Development and Distribution License ("CDDL"), version 1.0. 6# You may only use this file in accordance with the terms of version 7# 1.0 of the CDDL. 8# 9# A full copy of the text of the CDDL should have accompanied this 10# source. A copy of the CDDL is also available via the Internet at 11# http://www.illumos.org/license/CDDL. 12# 13# 14# Copyright 2018 Nutanix Inc. All rights reserved. 15# 16 17. $STF_SUITE/tests/functional/casenorm/casenorm.kshlib 18 19# DESCRIPTION: 20# For the filesystem with casesensitivity=mixed, normalization=none, 21# when multiple files with the same name (differing only in case) are created, 22# the number of files is limited to what can fit in a fatzap leaf-block. 23# And beyond that, it fails with ENOSPC. 24# 25# Ensure that the create/rename operations fail gracefully and not trigger an 26# ASSERT. 27# 28# STRATEGY: 29# Repeat the below steps for objects: files, directories, symlinks and hardlinks 30# 1. Create objects with same name but varying in case. 31# E.g. 'abcdefghijklmnop', 'Abcdefghijklmnop', 'ABcdefghijklmnop' etc. 32# The create should fail with ENOSPC. 33# 2. Create an object with name 'tmp_obj' and try to rename it to name that we 34# failed to add in step 1 above. 35# This should fail as well. 36 37verify_runnable "global" 38 39function cleanup 40{ 41 destroy_testfs 42} 43 44log_onexit cleanup 45log_assert "With mixed mode: ensure create fails with ENOSPC beyond a certain limit" 46 47create_testfs "-o casesensitivity=mixed -o normalization=none" 48 49# Different object types 50obj_type=('file' 'dir' 'symlink' 'hardlink') 51 52# Commands to create different object types 53typeset -A ops 54ops['file']='touch' 55ops['dir']='mkdir' 56ops['symlink']='ln -s' 57ops['hardlink']='ln' 58 59# This function tests the following for a give object type : 60# - Create multiple objects with the same name (varying only in case). 61# Ensure that it eventually fails once the leaf-block limit is exceeded. 62# - Create another object with a different name. And attempt rename it to the 63# name (for which the create had failed in the previous step). 64# This should fail as well. 65# Args : 66# $1 - object type (file/dir/symlink/hardlink) 67# $2 - test directory 68# 69function test_ops 70{ 71 typeset obj_type=$1 72 typeset testdir=$2 73 74 target_obj='target-file' 75 76 op="${ops[$obj_type]}" 77 78 log_note "The op : $op" 79 log_note "testdir=$testdir obj_type=$obj_type" 80 81 test_path="$testdir/$obj_type" 82 mkdir $test_path 83 log_note "Created test dir $test_path" 84 85 if [[ $obj_type = "symlink" || $obj_type = "hardlink" ]]; then 86 touch $test_path/$target_obj 87 log_note "Created target: $test_path/$target_obj" 88 op="$op $test_path/$target_obj" 89 fi 90 91 log_note "op : $op" 92 names='{a,A}{b,B}{c,C}{d,D}{e,E}{f,F}{g,G}{h,H}{i,I}{j,J}{k,K}{l,L}' 93 for name in $names; do 94 cmd="$op $test_path/$name" 95 out=$($cmd 2>&1) 96 ret=$? 97 log_note "cmd: $cmd ret: $ret out=$out" 98 if (($ret != 0)); then 99 if [[ $out = *@(No space left on device)* ]]; then 100 save_name="$test_path/$name" 101 break; 102 else 103 log_err "$cmd failed with unexpected error : $out" 104 fi 105 fi 106 done 107 108 log_note 'Test rename \"sample_name\" rename' 109 TMP_OBJ="$test_path/tmp_obj" 110 cmd="$op $TMP_OBJ" 111 out=$($cmd 2>&1) 112 ret=$? 113 if (($ret != 0)); then 114 log_err "cmd:$cmd failed out:$out" 115 fi 116 117 # Now, try to rename the tmp_obj to the name which we failed to add earlier. 118 # This should fail as well. 119 out=$(mv $TMP_OBJ $save_name 2>&1) 120 ret=$? 121 if (($ret != 0)); then 122 if [[ $out = *@(No space left on device)* ]]; then 123 log_note "$cmd failed as expected : $out" 124 else 125 log_err "$cmd failed with : $out" 126 fi 127 fi 128} 129 130for obj_type in ${obj_type[*]}; 131do 132 log_note "Testing create of $obj_type" 133 test_ops $obj_type $TESTDIR 134done 135 136log_pass "Mixed mode FS: Ops on large number of colliding names fail gracefully" 137