kernfs: fix locking around kernfs_ops->release() callback
authorTejun Heo <tj@kernel.org>
Sat, 11 Feb 2017 20:33:02 +0000 (05:33 +0900)
committerTejun Heo <tj@kernel.org>
Tue, 21 Feb 2017 20:49:25 +0000 (15:49 -0500)
commitf83f3c515654474e19c7fc86e3b06564bb5cb4d4
tree17389a81a3e78f0051e4fb5d948f3d440f539cce
parent63f1ca59453aadae81f702840c7ac6ea8b9f9262
kernfs: fix locking around kernfs_ops->release() callback

The release callback may be called from two places - file release
operation and kernfs open file draining.  kernfs_open_file->mutex is
used to synchronize the two callsites.  This unfortunately leads to
possible circular locking because of->mutex is used to protect the
usual kernfs operations which may use locking constructs which are
held while removing and thus draining kernfs files.

@of->mutex is for synchronizing concurrent kernfs access operations
and all we need here is synchronization between the releaes and drain
paths.  As the drain path has to grab kernfs_open_file_mutex anyway,
let's use the mutex to synchronize the release operation instead.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-and-tested-by: Tony Lindgren <tony@atomide.com>
Fixes: 0e67db2f9fe9 ("kernfs: add kernfs_ops->open/release() callbacks")
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/kernfs/file.c