Index: samba-3.6.6/source3/smbd/notify_inotify.c
===================================================================
--- samba-3.6.6.orig/source3/smbd/notify_inotify.c
+++ samba-3.6.6/source3/smbd/notify_inotify.c
@@ -77,6 +77,7 @@ struct inotify_private {
 	struct sys_notify_context *ctx;
 	int fd;
 	struct inotify_watch_context *watches;
+	bool broken_inotify;	/* Late stop for broken system */
 };
 
 struct inotify_watch_context {
@@ -241,8 +242,15 @@ static void inotify_handler(struct event
 	  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;
@@ -300,6 +308,7 @@ static NTSTATUS inotify_setup(struct sys
 	}
 	in->ctx = ctx;
 	in->watches = NULL;
+	in->broken_inotify = False;
 
 	ctx->private_data = in;
 	talloc_set_destructor(in, inotify_destructor);
@@ -394,6 +403,10 @@ NTSTATUS inotify_watch(struct sys_notify
 
 	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 */
