linux-hardened/fs/notify
Eric Paris 9e572cc987 inotify: do not reuse watch descriptors
Since commit 7e790dd5fc ("inotify: fix
error paths in inotify_update_watch") inotify changed the manor in which
it gave watch descriptors back to userspace.  Previous to this commit
inotify acted like the following:

  inotify_add_watch(X, Y, Z) = 1
  inotify_rm_watch(X, 1);
  inotify_add_watch(X, Y, Z) = 2

but after this patch inotify would return watch descriptors like so:

  inotify_add_watch(X, Y, Z) = 1
  inotify_rm_watch(X, 1);
  inotify_add_watch(X, Y, Z) = 1

which I saw as equivalent to opening an fd where

  open(file) = 1;
  close(1);
  open(file) = 1;

seemed perfectly reasonable.  The issue is that quite a bit of userspace
apparently relies on the behavior in which watch descriptors will not be
quickly reused.  KDE relies on it, I know some selinux packages rely on
it, and I have heard complaints from other random sources such as debian
bug 558981.

Although the man page implies what we do is ok, we broke userspace so
this patch almost reverts us to the old behavior.  It is still slightly
racey and I have patches that would fix that, but they are rather large
and this will fix it for all real world cases.  The race is as follows:

 - task1 creates a watch and blocks in idr_new_watch() before it updates
   the hint.
 - task2 creates a watch and updates the hint.
 - task1 updates the hint with it's older wd
 - task removes the watch created by task2
 - task adds a new watch and will reuse the wd originally given to task2

it requires moving some locking around the hint (last_wd) but this should
solve it for the real world and be -stable safe.

As a side effect this patch papers over a bug in the lib/idr code which
is causing a large number WARN's to pop on people's system and many
reports in kerneloops.org.  I'm working on the root cause of that idr
bug seperately but this should make inotify immune to that issue.

Signed-off-by: Eric Paris <eparis@redhat.com>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2010-01-15 14:49:23 -08:00
..
dnotify dnotify: ignore FS_EVENT_ON_CHILD 2009-10-20 18:02:33 -04:00
inotify inotify: do not reuse watch descriptors 2010-01-15 14:49:23 -08:00
fsnotify.c inotify: use GFP_NOFS under potential memory pressure 2009-07-21 15:26:27 -04:00
fsnotify.h fsnotify: generic notification queue and waitq 2009-06-11 14:57:53 -04:00
group.c fsnotify: generic notification queue and waitq 2009-06-11 14:57:53 -04:00
inode_mark.c fsnotify: do not set group for a mark before it is on the i_list 2009-10-18 15:49:38 -04:00
Kconfig fsnotify: use def_bool in kconfig instead of letting the user choose 2009-07-21 15:26:26 -04:00
Makefile fsnotify: add marks to inodes so groups can interpret how to handle those inodes 2009-06-11 14:57:53 -04:00
notification.c inotify: fix coalesce duplicate events into a single event in special case 2009-10-18 15:49:38 -04:00