fs: call fsnotify_sb_delete after evict_inodes
authorEric Sandeen <sandeen@redhat.com>
Fri, 6 Dec 2019 16:55:59 +0000 (10:55 -0600)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 18 Dec 2019 05:03:01 +0000 (00:03 -0500)
commit1edc8eb2e93130e36ac74ac9c80913815a57d413
tree11eb2e97e44475cad56618264e9345f85d1132b8
parent04646aebd30b99f2cfa0182435a2ec252fcb16d0
fs: call fsnotify_sb_delete after evict_inodes

When a filesystem is unmounted, we currently call fsnotify_sb_delete()
before evict_inodes(), which means that fsnotify_unmount_inodes()
must iterate over all inodes on the superblock looking for any inodes
with watches.  This is inefficient and can lead to livelocks as it
iterates over many unwatched inodes.

At this point, SB_ACTIVE is gone and dropping refcount to zero kicks
the inode out out immediately, so anything processed by
fsnotify_sb_delete / fsnotify_unmount_inodes gets evicted in that loop.

After that, the call to evict_inodes will evict everything else with a
zero refcount.

This should speed things up overall, and avoid livelocks in
fsnotify_unmount_inodes().

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/notify/fsnotify.c
fs/super.c