summaryrefslogtreecommitdiffstats
path: root/tools/nfsd
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-08-05 17:37:37 +0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-08-05 17:37:37 +0400
commit672fe15d091ce76d6fb98e489962e9add7c1ba4c (patch)
tree75760dceefa6de192465c14d6f72431d055fc772 /tools/nfsd
parentc095ba7224d8edc71dcef0d655911399a8bd4a3f (diff)
downloadop-kernel-dev-672fe15d091ce76d6fb98e489962e9add7c1ba4c.zip
op-kernel-dev-672fe15d091ce76d6fb98e489962e9add7c1ba4c.tar.gz
reiserfs: fix deadlock in umount
Since remove_proc_entry() started to wait for IO in progress (i.e. since 2007 or so), the locking in fs/reiserfs/proc.c became wrong; if procfs read happens between the moment when umount() locks the victim superblock and removal of /proc/fs/reiserfs/<device>/*, we'll get a deadlock - read will wait for s_umount (in sget(), called by r_start()), while umount will wait in remove_proc_entry() for that read to finish, holding s_umount all along. Fortunately, the same change allows a much simpler race avoidance - all we need to do is remove the procfs entries in the very beginning of reiserfs ->kill_sb(); that'll guarantee that pointer to superblock will remain valid for the duration for procfs IO, so we don't need sget() to keep the sucker alive. As the matter of fact, we can get rid of the home-grown iterator completely, and use single_open() instead. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'tools/nfsd')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud