configfs: provide exclusion between IO and removals
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 31 Aug 2019 07:43:43 +0000 (09:43 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 4 Sep 2019 20:33:51 +0000 (22:33 +0200)
commitb0841eefd9693827afb9888235e26ddd098f9cef
tree9e420e0e963aada121fb41ed76a2177594fc73bf
parent47320fbe11a6059ae502c9c16b668022fdb4cf76
configfs: provide exclusion between IO and removals

Make sure that attribute methods are not called after the item
has been removed from the tree.  To do so, we
* at the point of no return in removals, grab ->frag_sem
exclusive and mark the fragment dead.
* call the methods of attributes with ->frag_sem taken
shared and only after having verified that the fragment is still
alive.

The main benefit is for method instances - they are
guaranteed that the objects they are accessing *and* all ancestors
are still there.  Another win is that we don't need to bother
with extra refcount on config_item when opening a file -
the item will be alive for as long as it stays in the tree, and
we won't touch it/attributes/any associated data after it's
been removed from the tree.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/configfs/dir.c
fs/configfs/file.c