Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linus Torvalds
Date: Sunday, September 28, 2008 - 1:46 pm

On Sun, 28 Sep 2008, Al Viro wrote:

What about pure memory pressure? We're holding only the RCU read-side lock 
when looking up dentries, and if there is any memory pressure, the 
dentries may be unhashed and the inodes removed in parallel. Yes, yes, we 
end up not actually _releasing_ the dentry, since it's all RCU, but it 
will set D_UNHASHED and be scheduled for releasing later under RCU.

And d_compare() is called before we have done any validation that the name 
is still active, including checking whether it even got released already! 

I dunno. Do we want to move the D_UNHASHED check up earlier? Or am I still 
missing something?

		Linus

----
 fs/dcache.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/fs/dcache.c b/fs/dcache.c
index 80e9395..e7a1a99 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1395,6 +1395,10 @@ struct dentry * __d_lookup(struct dentry * parent, struct qstr * name)
 		if (dentry->d_parent != parent)
 			goto next;
 
+		/* non-existing due to RCU? */
+		if (d_unhashed(dentry))
+			goto next;
+
 		/*
 		 * It is safe to compare names since d_move() cannot
 		 * change the qstr (protected by d_lock).
@@ -1410,10 +1414,8 @@ struct dentry * __d_lookup(struct dentry * parent, struct qstr * name)
 				goto next;
 		}
 
-		if (!d_unhashed(dentry)) {
-			atomic_inc(&dentry->d_count);
-			found = dentry;
-		}
+		atomic_inc(&dentry->d_count);
+		found = dentry;
 		spin_unlock(&dentry->d_lock);
 		break;
 next:
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Alexey Dobriyan, (Fri Sep 26, 8:20 am)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Fri Sep 26, 8:47 am)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Eric W. Biederman, (Sat Sep 27, 1:44 am)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Hugh Dickins, (Sun Sep 28, 12:28 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Sun Sep 28, 1:38 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Sun Sep 28, 1:46 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Sun Sep 28, 1:50 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Sun Sep 28, 1:55 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Linus Torvalds, (Sun Sep 28, 1:59 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Hugh Dickins, (Sun Sep 28, 3:07 pm)
Re: 2.6.27-rc7-sha1: EIP at proc_sys_compare+0x36/0x50, Eric W. Biederman, (Sun Sep 28, 8:05 pm)