diff options
author | Eric Biggers | 2019-04-10 22:21:15 +0200 |
---|---|---|
committer | Theodore Ts'o | 2019-04-17 18:43:29 +0200 |
commit | 2c58d548f5706d085c4b009f6abb945220460632 (patch) | |
tree | b263f432d3ad778b6970ebbb842bd0a577e88cdc /include/linux/preempt.h | |
parent | vfs: use READ_ONCE() to access ->i_link (diff) | |
download | kernel-qcow2-linux-2c58d548f5706d085c4b009f6abb945220460632.tar.gz kernel-qcow2-linux-2c58d548f5706d085c4b009f6abb945220460632.tar.xz kernel-qcow2-linux-2c58d548f5706d085c4b009f6abb945220460632.zip |
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>
Diffstat (limited to 'include/linux/preempt.h')
0 files changed, 0 insertions, 0 deletions