On Fri, 2005-04-22 at 22:13 +0100, Al Viro wrote:

> Or it would, if remove_watch() had been called only once.  In the scenario
> above that will not be true.

Thanks.

        Robert Love


Double check that we don't race.

Signed-off-by: Robert Love <[EMAIL PROTECTED]>

 fs/inotify.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff -urN linux-2.6.12-rc3-inotify/fs/inotify.c linux/fs/inotify.c
--- linux-2.6.12-rc3-inotify/fs/inotify.c       2005-04-22 19:20:14.000000000 
-0400
+++ linux/fs/inotify.c  2005-04-22 19:25:44.000000000 -0400
@@ -861,12 +861,17 @@
                return -EINVAL;
        }
        get_inotify_watch(watch);
+       inode = watch->inode;   
        up(&dev->sem);
 
-       inode = watch->inode;
        down(&inode->inotify_sem);
        down(&dev->sem);
-       remove_watch(watch, dev);
+
+       /* make sure we did not race */
+       watch = idr_find(&dev->idr, wd);
+       if (likely(watch))
+               remove_watch(watch, dev);
+
        up(&dev->sem);
        up(&inode->inotify_sem);
        put_inotify_watch(watch);


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to