]> git.hungrycats.org Git - linux/commitdiff
[PATCH] dnotify
authorStephen Rothwell <sfr@canb.auug.org.au>
Tue, 12 Mar 2002 04:47:35 +0000 (20:47 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Tue, 12 Mar 2002 04:47:35 +0000 (20:47 -0800)
The following patch makes directory notifications per thread group instead
of per process tree as they are now.  This means, in particular, that if
a child closes a file descriptor that has a directory open with notifies
enabled, the notification will not be removed.

Thanks to Andrea for the push in the right direction.

fs/dnotify.c
include/linux/dnotify.h

index 5711e6b4175207ba547d7c03ac57ff2170766ca8..3cf7f0656f289076a38f08dbe53032b2c31c4f30 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Directory notifications for Linux.
  *
- * Copyright (C) 2000 Stephen Rothwell
+ * Copyright (C) 2000,2001,2002 Stephen Rothwell
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -59,7 +59,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
        write_lock(&dn_lock);
        prev = &inode->i_dnotify;
        for (odn = *prev; odn != NULL; prev = &odn->dn_next, odn = *prev)
-               if (odn->dn_filp == filp)
+               if ((odn->dn_owner == current->files) && (odn->dn_filp == filp))
                        break;
        if (odn != NULL) {
                if (turning_off) {
@@ -82,6 +82,7 @@ int fcntl_dirnotify(int fd, struct file *filp, unsigned long arg)
        dn->dn_mask = arg;
        dn->dn_fd = fd;
        dn->dn_filp = filp;
+       dn->dn_owner = current->files;
        inode->i_dnotify_mask |= arg & ~DN_MULTISHOT;
        dn->dn_next = inode->i_dnotify;
        inode->i_dnotify = dn;
index 60c1e2117f10816c141977f088f740a8b73a4961..23e8733ab4fb8b79a1f72d651dc47b84438b6809 100644 (file)
@@ -13,6 +13,7 @@ struct dnotify_struct {
                                                   see linux/fcntl.h */
        int                     dn_fd;
        struct file *           dn_filp;
+       fl_owner_t              dn_owner;
 };
 
 #define DNOTIFY_MAGIC  0x444E4F54