public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: John McCutchan <ttb@tentacle.dhs.org>
To: Andrew Morton <akpm@osdl.org>
Cc: Linux Kernel <linux-kernel@vger.kernel.org>,
	Robert Love <rml@novell.com>
Subject: [patch] stop inotify from sending random DELETE_SELF event under load
Date: Mon, 19 Sep 2005 20:48:56 -0400	[thread overview]
Message-ID: <1127177337.15262.6.camel@vertex> (raw)

Yo,

Below is a patch that fixes the random DELETE_SELF events when the
system is under load. The problem is that the DELETE_SELF event is sent
from dentry_iput, which is called in two code paths,

1) When a dentry is being deleted
2) When the dcache is being pruned.

We only want to send the event in case 1.

This has been spotted in the wild, and should be put into 2.6.14. It
fixes http://bugzilla.kernel.org/show_bug.cgi?id=5279

Yes, the patch makes me cringe to, but we need fsnotify_inodremove where
it is to avoid locking problems and a race.


Signed-off-by: John McCutchan <ttb@tentacle.dhs.org>

Index: linux-2.6.13/fs/dcache.c
===================================================================
--- linux-2.6.13.orig/fs/dcache.c	2005-08-28 19:41:01.000000000 -0400
+++ linux-2.6.13/fs/dcache.c	2005-09-19 15:30:03.000000000 -0400
@@ -94,7 +94,7 @@
  * d_iput() operation if defined.
  * Called with dcache_lock and per dentry lock held, drops both.
  */
-static inline void dentry_iput(struct dentry * dentry)
+static inline void dentry_iput(struct dentry * dentry, int call_inoderemove)
 {
 	struct inode *inode = dentry->d_inode;
 	if (inode) {
@@ -102,7 +102,8 @@
 		list_del_init(&dentry->d_alias);
 		spin_unlock(&dentry->d_lock);
 		spin_unlock(&dcache_lock);
-		fsnotify_inoderemove(inode);
+		if (call_inoderemove)
+			fsnotify_inoderemove(inode);
 		if (dentry->d_op && dentry->d_op->d_iput)
 			dentry->d_op->d_iput(dentry, inode);
 		else
@@ -195,7 +196,7 @@
   		list_del(&dentry->d_child);
 		dentry_stat.nr_dentry--;	/* For d_free, below */
 		/*drops the locks, at that point nobody can reach this dentry */
-		dentry_iput(dentry);
+		dentry_iput(dentry, 0);
 		parent = dentry->d_parent;
 		d_free(dentry);
 		if (dentry == parent)
@@ -370,7 +371,7 @@
 	__d_drop(dentry);
 	list_del(&dentry->d_child);
 	dentry_stat.nr_dentry--;	/* For d_free, below */
-	dentry_iput(dentry);
+	dentry_iput(dentry, 0);
 	parent = dentry->d_parent;
 	d_free(dentry);
 	if (parent != dentry)
@@ -1175,7 +1176,7 @@
 	spin_lock(&dentry->d_lock);
 	isdir = S_ISDIR(dentry->d_inode->i_mode);
 	if (atomic_read(&dentry->d_count) == 1) {
-		dentry_iput(dentry);
+		dentry_iput(dentry, 1);
 		fsnotify_nameremove(dentry, isdir);
 		return;
 	}


             reply	other threads:[~2005-09-20  0:48 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-09-20  0:48 John McCutchan [this message]
2005-09-20  1:37 ` [patch] stop inotify from sending random DELETE_SELF event under load 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
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=1127177337.15262.6.camel@vertex \
    --to=ttb@tentacle.dhs.org \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rml@novell.com \
    /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