2006-03-29 15:57:23

by Amy Griffis

[permalink] [raw]
Subject: [PATCH] inotify: IN_DELETE events missing in -mm

In recent -mm kernels (e.g. 2.6.16-mm1), IN_DELETE events are no longer
generated for the removal of a file from a watched directory.

This seems to be a result of clearing DCACHE_INOTIFY_PARENT_WATCHED in
d_delete() directly before calling fsnotify_nameremove().

Assuming the flag doesn't need to be cleared before dentry_iput(), this should
do the trick.

Signed-off-by: Amy Griffis <[email protected]>

diff --git a/fs/dcache.c b/fs/dcache.c
index 363cd4b..344ce91 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1198,11 +1198,11 @@ void d_delete(struct dentry * dentry)
spin_lock(&dentry->d_lock);
isdir = S_ISDIR(dentry->d_inode->i_mode);
if (atomic_read(&dentry->d_count) == 1) {
- /* remove this and other inotify debug checks after 2.6.18 */
- dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
-
dentry_iput(dentry);
fsnotify_nameremove(dentry, isdir);
+
+ /* remove this and other inotify debug checks after 2.6.18 */
+ dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
return;
}


2006-03-29 21:37:22

by John McCutchan

[permalink] [raw]
Subject: Re: [PATCH] inotify: IN_DELETE events missing in -mm

On Wed, 2006-29-03 at 10:57 -0500, Amy Griffis wrote:
> In recent -mm kernels (e.g. 2.6.16-mm1), IN_DELETE events are no longer
> generated for the removal of a file from a watched directory.
>
> This seems to be a result of clearing DCACHE_INOTIFY_PARENT_WATCHED in
> d_delete() directly before calling fsnotify_nameremove().
>
> Assuming the flag doesn't need to be cleared before dentry_iput(), this should
> do the trick.

I took a quick look at nick's patch again, and it doesn't seem to
require the flag being cleared before dentry_iput. This looks good to
me. Nick?

--
John McCutchan <[email protected]>

2006-03-30 02:47:25

by Nick Piggin

[permalink] [raw]
Subject: Re: [PATCH] inotify: IN_DELETE events missing in -mm

Amy Griffis wrote:

>In recent -mm kernels (e.g. 2.6.16-mm1), IN_DELETE events are no longer
>generated for the removal of a file from a watched directory.
>
>This seems to be a result of clearing DCACHE_INOTIFY_PARENT_WATCHED in
>d_delete() directly before calling fsnotify_nameremove().
>
>Assuming the flag doesn't need to be cleared before dentry_iput(), this should
>do the trick.
>
>

Thanks Amy. This should go to the next -stable kernel too.

>Signed-off-by: Amy Griffis <[email protected]>
>
>diff --git a/fs/dcache.c b/fs/dcache.c
>index 363cd4b..344ce91 100644
>--- a/fs/dcache.c
>+++ b/fs/dcache.c
>@@ -1198,11 +1198,11 @@ void d_delete(struct dentry * dentry)
> spin_lock(&dentry->d_lock);
> isdir = S_ISDIR(dentry->d_inode->i_mode);
> if (atomic_read(&dentry->d_count) == 1) {
>- /* remove this and other inotify debug checks after 2.6.18 */
>- dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
>-
> dentry_iput(dentry);
> fsnotify_nameremove(dentry, isdir);
>+
>+ /* remove this and other inotify debug checks after 2.6.18 */
>+ dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED;
> return;
> }
>

Send instant messages to your online friends http://au.messenger.yahoo.com

2013-10-16 20:38:35

by Jim Mostek

[permalink] [raw]
Subject: Re: [PATCH] inotify: IN_DELETE events missing in -mm


You cannot move this line of code after dentry_iput(dentry); without
considerations for locking.

Another thread can get this dentry and be changing dentry->d_flags at the
same time!
We have hit this in testing. The code must be changed to have locks (if this
field needs to be changed or ...)

In our tests, the flag 0x10 in __d_drop goes missing because this line of
code executed at the same time on another processor.



--
View this message in context: http://linux-kernel.2935.n7.nabble.com/PATCH-inotify-IN-DELETE-events-missing-in-mm-tp105372p738511.html
Sent from the Linux Kernel mailing list archive at Nabble.com.