fscrypt: cache decrypted symlink target in ->i_link
Path lookups that traverse encrypted symlink(s) are very slow because each encrypted symlink needs to be decrypted each time it's followed. This also involves dropping out of rcu-walk mode. Make encrypted symlinks faster by caching the decrypted symlink target in ->i_link. The first call to fscrypt_get_symlink() sets it. Then, the existing VFS path lookup code uses the non-NULL ->i_link to take the fast path where ->get_link() isn't called, and lookups in rcu-walk mode remain in rcu-walk mode. Also set ->i_link immediately when a new encrypted symlink is created. To safely free the symlink target after an RCU grace period has elapsed, introduce a new function fscrypt_free_inode(), and make the relevant filesystems call it just before actually freeing the inode. Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by:Eric Biggers <ebiggers@google.com> Signed-off-by:
Theodore Ts'o <tytso@mit.edu>
Showing
- fs/crypto/hooks.c 33 additions, 7 deletionsfs/crypto/hooks.c
- fs/crypto/keyinfo.c 21 additions, 0 deletionsfs/crypto/keyinfo.c
- fs/ext4/super.c 3 additions, 0 deletionsfs/ext4/super.c
- fs/f2fs/super.c 3 additions, 0 deletionsfs/f2fs/super.c
- fs/ubifs/super.c 3 additions, 0 deletionsfs/ubifs/super.c
- include/linux/fscrypt.h 5 additions, 0 deletionsinclude/linux/fscrypt.h
Please register or sign in to comment