From: John McCutchan <ttb@tentacle.dhs.org>
To: Al Viro <viro@ftp.linux.org.uk>
Cc: Linus Torvalds <torvalds@osdl.org>, Ray Lee <ray@madrabbit.org>,
Andrew Morton <akpm@osdl.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
Robert Love <rml@novell.com>, Al Viro <viro@ZenIV.linux.org.uk>
Subject: Re: [patch] stop inotify from sending random DELETE_SELF event under load
Date: Tue, 20 Sep 2005 21:41:47 -0400 [thread overview]
Message-ID: <1127266907.3950.5.camel@vertex> (raw)
In-Reply-To: <20050921010154.GR7992@ftp.linux.org.uk>
On Wed, 2005-09-21 at 02:01 +0100, Al Viro wrote:
> On Tue, Sep 20, 2005 at 06:53:34PM -0400, John McCutchan wrote:
> > Is there some reason we can't just do this from vfs_unlink
> >
> > inode = dentry->inode;
> > iget (inode);
> > d_delete (dentry);
> > fsnotify_inoderemove (inode);
> > iput (inode);
> >
> > This would allow us to have immediate event notification, and avoid a
> > race with the inode going away, right?
>
> Playing with references to struct inode means playing dirty tricks
> behind the filesystem's back. Doing that in a way that really changes
> inode lifetime means asking for trouble. Combined with a dirty trick
> *already* pulled by sys_unlink() to postpone the final iput until after
> we unlock the parent, it means breakage (and aforementioned dirty trick
> took some rather interesting logics to compensate for in the first place).
>
> Moreover, your suggestion would do that to _everyone_, whether they use
> inotify or not. NAK.
Got it.
>
> > static inline void fsnotify_inoderemove(struct inode *inode)
> > {
> > - inotify_inode_queue_event(inode, IN_DELETE_SELF, 0, NULL);
> > - inotify_inode_is_dead(inode);
> > + inotify_inode_queue_event(inode, IN_DELETE_SELF, inode->i_nlink, NULL);
> > + if (inode->i_nlink == 0)
> > + inotify_inode_is_dead(inode);
> > }
>
> Assumes that filesystem treats ->i_nlink on final iput() in usual way.
> It doesn't have to.
>
I grepped all the filesystems, and they all seem to use
generic_drop_inode, except for hugetlbfs, which seems to have the same
logic of (!inode->i_nlink).
> BTW, what happens if one uses inotify on procfs? Or sysfs, for that matter?
> Fundamental problem with that sucker is that you are playing games with
> lifetime rules of inodes in a way that might be OK for some filesystems,
> but violates a lot of assumptions made by other...
>
Honestly, I don't know. And I don't think I know enough to say with any
certainty how either of them would work. Would a black list of
filesystems that don't want inotify on them be acceptable?
> BTW^2, what guarantees that inotify_unmount_inodes() will not happen while we
> are in inotify_release()? That would happily keep watch refcount bumped,
> so it would outlive inotify_unmount_inodes(). Sure, it would be dropped.
> And call iput() on a pinned inode that had outlived the umount(). Oops...
Good catch,
Index: linux/fs/inotify.c
===================================================================
--- linux.orig/fs/inotify.c 2005-08-31 15:41:11.000000000 -0400
+++ linux/fs/inotify.c 2005-09-20 21:18:35.000000000 -0400
@@ -756,6 +756,7 @@
* do not know the inode until we iterate to the watch. But we need to
* hold inode->inotify_sem before dev->sem. The following works.
*/
+ down(&iprune_sem);
while (1) {
struct inotify_watch *watch;
struct list_head *watches;
@@ -779,6 +780,7 @@
up(&inode->inotify_sem);
put_inotify_watch(watch);
}
+ up(&iprune_sem);
/* destroy all of the events on this device */
down(&dev->sem);
next prev parent reply other threads:[~2005-09-21 1:40 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-20 0:48 [patch] stop inotify from sending random DELETE_SELF event under load John McCutchan
2005-09-20 1:37 ` Linus Torvalds
2005-09-20 2:00 ` John McCutchan
2005-09-20 2:20 ` Linus Torvalds
2005-09-20 3:46 ` John McCutchan
2005-09-20 4:03 ` Linus Torvalds
2005-09-20 4:24 ` Al Viro
2005-09-20 4:30 ` Linus Torvalds
2005-09-20 4:36 ` John McCutchan
2005-09-20 4:46 ` Al Viro
2005-09-20 4:53 ` John McCutchan
2005-09-20 4:58 ` Al Viro
2005-09-20 5:06 ` John McCutchan
2005-09-20 5:17 ` Al Viro
2005-09-20 12:34 ` John McCutchan
2005-09-20 16:38 ` Al Viro
2005-09-20 17:44 ` Ray Lee
2005-09-20 18:12 ` Linus Torvalds
2005-09-20 18:22 ` Al Viro
2005-09-20 19:37 ` Linus Torvalds
2005-09-20 22:53 ` John McCutchan
2005-09-21 0:33 ` Linus Torvalds
2005-09-21 0:52 ` John McCutchan
2005-09-21 1:01 ` Al Viro
2005-09-21 1:41 ` John McCutchan [this message]
2005-09-21 2:36 ` Al Viro
2005-09-21 8:35 ` Christoph Hellwig
2005-09-21 9:15 ` Joel Becker
2005-09-21 9:17 ` Christoph Hellwig
2005-09-21 14:45 ` Joel Becker
2005-09-21 18:08 ` Mark Fasheh
2005-09-20 18:26 ` John McCutchan
2005-09-20 19:39 ` Linus Torvalds
2005-09-20 4:56 ` Linus Torvalds
2005-09-20 4:52 ` Linus Torvalds
2005-09-20 4:27 ` John McCutchan
2005-09-20 3:33 ` Al Viro
2005-09-20 3:50 ` John McCutchan
2005-09-20 3:31 ` Al Viro
2005-09-20 3:51 ` John McCutchan
2005-09-20 8:33 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1127266907.3950.5.camel@vertex \
--to=ttb@tentacle.dhs.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ray@madrabbit.org \
--cc=rml@novell.com \
--cc=torvalds@osdl.org \
--cc=viro@ZenIV.linux.org.uk \
--cc=viro@ftp.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox