generic/402: Drop useless fail message
[xfstests-dev.git] / tests / generic / 421
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2017 Google, Inc.  All Rights Reserved.
4 #
5 # FS QA Test generic/421
6 #
7 # Test revoking an encryption key during concurrent I/O.  Regression test for
8 # 1b53cf9815bb ("fscrypt: remove broken support for detecting keyring key
9 # revocation").
10 #
11 seq=`basename $0`
12 seqres=$RESULT_DIR/$seq
13 echo "QA output created by $seq"
14
15 here=`pwd`
16 tmp=/tmp/$$
17 status=1        # failure is the default!
18 trap "_cleanup; exit \$status" 0 1 2 3 15
19
20 _cleanup()
21 {
22         cd /
23         rm -f $tmp.*
24 }
25
26 # get standard environment, filters and checks
27 . ./common/rc
28 . ./common/filter
29 . ./common/encrypt
30
31 # remove previous $seqres.full before test
32 rm -f $seqres.full
33
34 # real QA test starts here
35 _supported_fs generic
36 _require_scratch_encryption
37 _require_command "$KEYCTL_PROG" keyctl
38
39 _new_session_keyring
40 _scratch_mkfs_encrypted &>> $seqres.full
41 _scratch_mount
42
43 dir=$SCRATCH_MNT/encrypted_dir
44 file=$dir/file
45
46 # 4 processes, 2 MB per process
47 nproc=4
48 slice=2
49
50 # Create an encrypted file and sync its data to disk.
51 rm -rf $dir
52 mkdir $dir
53 keydesc=$(_generate_session_encryption_key)
54 _set_encpolicy $dir $keydesc
55 $XFS_IO_PROG -f $file -c "pwrite 0 $((nproc*slice))M" -c "fsync" > /dev/null
56
57 # Create processes to read from the encrypted file.  Use fadvise to wipe the
58 # pagecache before each read, ensuring that each read actually does decryption.
59 for ((proc = 0; proc < nproc; proc++)); do
60         (
61                 range="$((proc * slice))M ${slice}M"
62                 while [ ! -e $tmp.done ]; do
63                         $XFS_IO_PROG $file -c "fadvise -d $range" \
64                                            -c "pread $range" &> /dev/null
65                 done
66         ) &
67 done
68
69 # Wait a second for the readers to start up.
70 sleep 1
71
72 # Revoke the encryption key.
73 keyid=$(_revoke_session_encryption_key $keydesc)
74
75 # Now try to open the file again.  In buggy kernels this caused concurrent
76 # readers to crash with a NULL pointer dereference during decryption.
77 #
78 # Note that the fix also made filenames stop "immediately" reverting to their
79 # ciphertext on key revocation.  Therefore, the name of the file we're opening
80 # here may be in either plaintext or ciphertext depending on the kernel version,
81 # and ciphertext names are unpredictable anyway, so just use 'find' to find it.
82 cat "$(find $dir -type f)" > /dev/null
83
84 # Wait for readers to exit
85 touch $tmp.done
86 wait
87
88 # success, all done
89 echo "Didn't crash!"
90 status=0
91 exit