#!/bin/bash # This is the script that was used to create the image.gz in this directory. set -e -u BLOCKSIZE=4096 do_debugfs() { umount mnt debugfs -w "$@" image mount image mnt } do_tune2fs() { umount mnt tune2fs $@ image mount image mnt } symlink() { local len=$1 local src=$2 local target=$(perl -e 'print "A" x '$len) ln -s $target $src stat -c %i $src } # Overwrite the length in the header of the encrypted symlink target set_encrypted_symlink_len() { local ino=$1 local len=$2 echo "zap_block -f <$ino> -p $((len%256)) -o 0 -l 1 0" echo "zap_block -f <$ino> -p $((len/256)) -o 1 -l 1 0" } create_symlinks() { local dir=$1 local encrypted=${2:-false} local overhead=0 local ino if $encrypted; then overhead=2 fi mkdir -p $dir { ino=$(symlink 1 $dir/empty) echo "set_inode_field <$ino> i_size 10" echo "set_inode_field <$ino> block[0] 0" symlink 1 $dir/fast_min > /dev/null ino=$(symlink 10 $dir/fast_isize_too_small) echo "set_inode_field <$ino> i_size 1" ino=$(symlink 10 $dir/fast_isize_too_large) echo "set_inode_field <$ino> i_size 20" symlink $((59 - overhead)) $dir/fast_max > /dev/null symlink $((60 - overhead)) $dir/slow_min > /dev/null ino=$(symlink 100 $dir/slow_isize_too_small) echo "set_inode_field <$ino> i_size 80" ino=$(symlink 100 $dir/slow_isize_too_large) echo "set_inode_field <$ino> i_size 120" symlink $((BLOCKSIZE - 1 - overhead)) $dir/slow_max > /dev/null ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/one_too_long) echo "set_inode_field <$ino> i_size $BLOCKSIZE" echo "zap_block -f <$ino> -p 65 0" if $encrypted; then set_encrypted_symlink_len $ino $((BLOCKSIZE - overhead)) fi ino=$(symlink $((BLOCKSIZE - 1 - overhead)) $dir/too_long) echo "set_inode_field <$ino> i_size $((BLOCKSIZE + 1000))" echo "zap_block -f <$ino> -p 65 0" if $encrypted; then set_encrypted_symlink_len $ino $((BLOCKSIZE + 1000 - overhead)) fi } >> debugfs_commands do_debugfs < debugfs_commands } create_encrypted_symlinks() { local dir=$1 link mkdir $dir echo | e4crypt add_key $dir create_symlinks $dir true # Move symlinks into an unencrypted directory (leaving their targets # encrypted). This makes the fsck output consistent. mv $dir ${dir}~encrypted mkdir $dir mv ${dir}~encrypted/* $dir } mkdir -p mnt umount mnt &> /dev/null || true dd if=/dev/zero of=image bs=1024 count=600 mke2fs -O 'encrypt,^extents,^64bit' -b $BLOCKSIZE -I 256 image mount image mnt create_symlinks mnt/default create_encrypted_symlinks mnt/encrypted do_tune2fs -O extents create_symlinks mnt/extents create_encrypted_symlinks mnt/extents_encrypted do_debugfs -R 'feature inline_data' create_symlinks mnt/inline_data rm -rf debugfs_commands mnt/*~encrypted umount mnt rmdir mnt gzip -9 -f image