Hi Eric, I tested fanotify in 2.6.37-rc7 and faced the following issue: when a fanotify server process (started with open_perm set) segfaults the kernel tries to open core dump file and here it is forced to wait a permission result because fanotify server receives notifications on file operations initiated by itself. Since fanotify server has crashed the permission will never be granted. So the whole system hangs. I don't see the point in receiving notifications on file operations initiated by fanotify server process so I created a patch that disables that and solves the issue at least in case of one fanotify server. Best regards, Vasily
/usr/src/linux --- ./fs/notify/fanotify/fanotify.c.orig 2010-12-24 12:50:33.653029001 -0500 +++ ./fs/notify/fanotify/fanotify.c 2010-12-24 13:28:19.561029005 -0500 @@ -92,6 +92,9 @@ static int fanotify_get_response_from_ac pr_debug("%s: group=%p event=%p\n", __func__, group, event); + if(group->fanotify_data.tgid == task_tgid(current)) + return 0; + wait_event(group->fanotify_data.access_waitq, event->response || atomic_read(&group->fanotify_data.bypass_perm)); @@ -217,6 +220,7 @@ static void fanotify_free_group_priv(str user = group->fanotify_data.user; atomic_dec(&user->fanotify_listeners); free_uid(user); + put_pid(group->fanotify_data.tgid); } const struct fsnotify_ops fanotify_fsnotify_ops = { --- ./fs/notify/fanotify/fanotify_user.c.orig 2010-12-24 12:12:07.593029001 -0500 +++ ./fs/notify/fanotify/fanotify_user.c 2010-12-27 09:26:15.259956001 -0500 @@ -337,6 +337,10 @@ static ssize_t fanotify_read(struct file ret = PTR_ERR(kevent); if (IS_ERR(kevent)) break; + if(kevent->tgid == group->fanotify_data.tgid) { + fsnotify_put_event(kevent); + continue; + } ret = copy_event_to_user(group, kevent, buf); fsnotify_put_event(kevent); if (ret < 0) @@ -718,6 +722,7 @@ SYSCALL_DEFINE2(fanotify_init, unsigned INIT_LIST_HEAD(&group->fanotify_data.access_list); atomic_set(&group->fanotify_data.bypass_perm, 0); #endif + group->fanotify_data.tgid = get_pid(task_tgid(current)); switch (flags & FAN_ALL_CLASS_BITS) { case FAN_CLASS_NOTIF: group->priority = FS_PRIO_0; --- ./include/linux/fsnotify_backend.h.orig 2010-12-24 12:08:59.965029002 -0500 +++ ./include/linux/fsnotify_backend.h 2010-12-27 13:05:34.738636001 -0500 @@ -171,6 +171,7 @@ struct fsnotify_group { int f_flags; unsigned int max_marks; struct user_struct *user; + struct pid *tgid; } fanotify_data; #endif /* CONFIG_FANOTIFY */ };