--- source3/smbd/notify_inotify.c.inotify 2009-12-15 09:25:26.000000000 +0100 +++ source3/smbd/notify_inotify.c 2009-12-17 18:42:06.000000000 +0100 @@ -75,6 +75,7 @@ struct sys_notify_context *ctx; int fd; struct inotify_watch_context *watches; + bool broken_inotify; /* Late stop for broken system */ }; struct inotify_watch_context { @@ -239,8 +240,15 @@ filenames, and thus can't know how much to allocate otherwise */ - if (ioctl(in->fd, FIONREAD, &bufsize) != 0 || - bufsize == 0) { + if ((ioctl(in->fd, FIONREAD, &bufsize) != 0) && (errno == EACCES)) { + /* + * Workaround for broken system (SELinux policy bug fixed since long but it is always better not to loop on EACCES) + */ + TALLOC_FREE(fde); + in->broken_inotify = True; + return; + } + if (bufsize == 0) { DEBUG(0,("No data on inotify fd?!\n")); TALLOC_FREE(fde); return; @@ -297,6 +305,7 @@ } in->ctx = ctx; in->watches = NULL; + in->broken_inotify = False; ctx->private_data = in; talloc_set_destructor(in, inotify_destructor); @@ -391,6 +400,10 @@ in = talloc_get_type(ctx->private_data, struct inotify_private); + if (in->broken_inotify) { + return NT_STATUS_OK; + } + mask = inotify_map(e); if (mask == 0) { /* this filter can't be handled by inotify */