> + schedule(); Here's a stab at getting rid of that raw schedule() in inotify_read(). It maintains the behaviour where it returns when an event doesn't fit and returns after events have been copied instead of sleeping. It changes behaviour in that it returns partial reads that suceeded instead of the error that stopped processing. It also lets threads who race out of a wakeup to find an empty list go back to sleep instead of returning 0. Dunno if that's behaviour you'd prefer but it seemed reasonable. I hope that lockless list_empty() is OK, I didn't think very hard about it. Compiles but totally untested. Check my work :) - z