configfs: Fix race between configfs_readdir() and configfs_d_iput()
authorJoel Becker <jlbec@evilplan.org>
Wed, 18 May 2011 11:08:16 +0000 (04:08 -0700)
committerJoel Becker <jlbec@evilplan.org>
Wed, 18 May 2011 11:08:16 +0000 (04:08 -0700)
commit24307aa1e707b31613be92deaba7990e16bc1aec
tree6699c969a7f56c2b7949bf16af54320caee0687e
parentdf7f99670a4c76f269ae57ce91876b309417a316
configfs: Fix race between configfs_readdir() and configfs_d_iput()

configfs_readdir() will use the existing inode numbers of inodes in the
dcache, but it makes them up for attribute files that aren't currently
instantiated.  There is a race where a closing attribute file can be
tearing down at the same time as configfs_readdir() is trying to get its
inode number.

We want to get the inode number of open attribute files, because they
should match while instantiated.  We can't lock down the transition
where dentry->d_inode is set to NULL, so we just check for NULL there.
We can, however, ensure that an inode we find isn't iput() in
configfs_d_iput() until after we've accessed it.

Signed-off-by: Joel Becker <jlbec@evilplan.org>
fs/configfs/dir.c