• Jan Kara's avatar
    fsnotify: avoid spurious EMFILE errors from inotify_init() · 35e48176
    Jan Kara authored
    Inotify instance is destroyed when all references to it are dropped.
    That not only means that the corresponding file descriptor needs to be
    closed but also that all corresponding instance marks are freed (as each
    mark holds a reference to the inotify instance).  However marks are
    freed only after SRCU period ends which can take some time and thus if
    user rapidly creates and frees inotify instances, number of existing
    inotify instances can exceed max_user_instances limit although from user
    point of view there is always at most one existing instance.  Thus
    inotify_init() returns EMFILE error which is hard to justify from user
    point of view.  This problem is exposed by LTP inotify06 testcase on
    some machines.
    
    We fix the problem by making sure all group marks are properly freed
    while destroying inotify instance.  We wait for SRCU period to end in
    that path anyway since we have to make sure there is no event being
    added to the instance while we are tearing down the instance.  So it
    takes only some plumbing to allow for marks to be destroyed in that path
    as well and not from a dedicated work item.
    
    [akpm@linux-foundation.org: coding-style fixes]
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Reported-by: default avatarXiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
    Tested-by: default avatarXiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    35e48176
Name
Last commit
Last update
..
dnotify Loading commit data...
fanotify Loading commit data...
inotify Loading commit data...
Kconfig Loading commit data...
Makefile Loading commit data...
fdinfo.c Loading commit data...
fdinfo.h Loading commit data...
fsnotify.c Loading commit data...
fsnotify.h Loading commit data...
group.c Loading commit data...
inode_mark.c Loading commit data...
mark.c Loading commit data...
notification.c Loading commit data...
vfsmount_mark.c Loading commit data...