summaryrefslogtreecommitdiffstats
path: root/fs/buffer.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2018-02-23 20:47:17 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2018-02-23 20:47:17 -0500
commit3b821409632ab778d46e807516b457dfa72736ed (patch)
tree523ea8d13fa5e78688a5a7bf90d29404373ec874 /fs/buffer.c
parent91ab883eb21325ad80f3473633f794c78ac87f51 (diff)
downloadlinux-3b821409632ab778d46e807516b457dfa72736ed.tar.bz2
lock_parent() needs to recheck if dentry got __dentry_kill'ed under it
In case when dentry passed to lock_parent() is protected from freeing only by the fact that it's on a shrink list and trylock of parent fails, we could get hit by __dentry_kill() (and subsequent dentry_kill(parent)) between unlocking dentry and locking presumed parent. We need to recheck that dentry is alive once we lock both it and parent *and* postpone rcu_read_unlock() until after that point. Otherwise we could return a pointer to struct dentry that already is rcu-scheduled for freeing, with ->d_lock held on it; caller's subsequent attempt to unlock it can end up with memory corruption. Cc: stable@vger.kernel.org # 3.12+, counting backports Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/buffer.c')
0 files changed, 0 insertions, 0 deletions