public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jakob Oestergaard <jakob@unthought.net>
To: Greg Banks <gnb@melbourne.sgi.com>
Cc: Anando Bhattacharya <a3217055@gmail.com>, linux-kernel@vger.kernel.org
Subject: Re: Major XFS problems...
Date: Thu, 9 Sep 2004 16:00:17 +0200	[thread overview]
Message-ID: <20040909140017.GP390@unthought.net> (raw)
In-Reply-To: <1094661418.19981.36.camel@hole.melbourne.sgi.com>

[-- Attachment #1: Type: text/plain, Size: 1806 bytes --]

On Thu, Sep 09, 2004 at 02:36:58AM +1000, Greg Banks wrote:
> On Thu, 2004-09-09 at 01:44, Jakob Oestergaard wrote:
> > SMP systems on 2.6 have a problem with XFS+NFS.
> 
> Knfsd threads in 2.6 are no longer serialised by the BKL, and the
> change has exposed a number of SMP issues in the dcache.  Try the
> two patches at

Ok - the "small" server just hosed itself with a debug.c:106 - so I'll
be doing some testing on that one as well (after hours, today).

> 
> http://marc.theaimsgroup.com/?l=linux-kernel&m=108330112505555&w=2

Ok, I must say that mail has some *scary* comments to the patch... This
should be interesting  :)

The patch assumes some dcache code is
--------------
if (res) {
 spin_lock(&res->d_lock);
 res->d_sb = inode->i_sb;
 res->d_parent = res;
 res->d_inode = inode;
 res->d_bucket = d_hash(res, res->d_name.hash);
 res->d_flags |= DCACHE_DISCONNECTED;
 res->d_vfs_flags &= ~DCACHE_UNHASHED;
 list_add(&res->d_alias, &inode->i_dentry);
 hlist_add_head(&res->d_hash, &inode->i_sb->s_anon);
 spin_unlock(&res->d_lock);
}
--------------
While it was actually changed to
--------------
if (res) {
 spin_lock(&res->d_lock);
 res->d_sb = inode->i_sb;
 res->d_parent = res;
 res->d_inode = inode;

 /*
  * Set d_bucket to an "impossible" bucket address so
  * that d_move() doesn't get a false positive
  */
 res->d_bucket = NULL;
 res->d_flags |= DCACHE_DISCONNECTED;
 res->d_flags &= ~DCACHE_UNHASHED;
 list_add(&res->d_alias, &inode->i_dentry);
 hlist_add_head(&res->d_hash, &inode->i_sb->s_anon);
 spin_unlock(&res->d_lock);
}
--------------

I'm assuming I should just adapt this to the res->d_bucket change...

New patch against 2.6.8.1 attached.

> 
> and
> 
> http://linus.bkbits.net:8080/linux-2.5/cset@1.1722.48.23

This one is in plain 2.6.8.1 (as you said).

-- 

 / jakob


[-- Attachment #2: dcache-patch2_2.6.8.1.patch --]
[-- Type: text/plain, Size: 3604 bytes --]

--- fs/dcache.c.orig	Sat Aug 14 12:54:50 2004
+++ fs/dcache.c	Thu Sep  9 15:56:04 2004
@@ -286,12 +286,11 @@
  * any other hashed alias over that one.
  */
 
-struct dentry * d_find_alias(struct inode *inode)
+static struct dentry * __d_find_alias(struct inode *inode, int want_discon)
 {
 	struct list_head *head, *next, *tmp;
 	struct dentry *alias, *discon_alias=NULL;
 
-	spin_lock(&dcache_lock);
 	head = &inode->i_dentry;
 	next = inode->i_dentry.next;
 	while (next != head) {
@@ -302,19 +301,26 @@
  		if (!d_unhashed(alias)) {
 			if (alias->d_flags & DCACHE_DISCONNECTED)
 				discon_alias = alias;
-			else {
+			else if (!want_discon) {
 				__dget_locked(alias);
-				spin_unlock(&dcache_lock);
 				return alias;
 			}
 		}
 	}
 	if (discon_alias)
 		__dget_locked(discon_alias);
-	spin_unlock(&dcache_lock);
 	return discon_alias;
 }
 
+struct dentry * d_find_alias(struct inode *inode)
+{
+	struct dentry *de;
+	spin_lock(&dcache_lock);
+	de = __d_find_alias(inode, 0);
+	spin_unlock(&dcache_lock);
+	return de;
+}
+
 /*
  *	Try to kill dentries associated with this inode.
  * WARNING: you must own a reference to inode.
@@ -833,33 +839,27 @@
 	tmp->d_parent = tmp; /* make sure dput doesn't croak */
 	
 	spin_lock(&dcache_lock);
-	if (S_ISDIR(inode->i_mode) && !list_empty(&inode->i_dentry)) {
-		/* A directory can only have one dentry.
-		 * This (now) has one, so use it.
-		 */
-		res = list_entry(inode->i_dentry.next, struct dentry, d_alias);
-		__dget_locked(res);
-	} else {
+	res = __d_find_alias(inode, 0);
+	if (!res) {
 		/* attach a disconnected dentry */
 		res = tmp;
 		tmp = NULL;
-		if (res) {
-			spin_lock(&res->d_lock);
-			res->d_sb = inode->i_sb;
-			res->d_parent = res;
-			res->d_inode = inode;
+		spin_lock(&res->d_lock);
+		res->d_sb = inode->i_sb;
+		res->d_parent = res;
+		res->d_inode = inode;
+
+		/*
+		 * Set d_bucket to an "impossible" bucket address so
+		 * that d_move() doesn't get a false positive
+		 */
+		res->d_bucket = NULL;
+		res->d_flags |= DCACHE_DISCONNECTED;
+		res->d_flags &= ~DCACHE_UNHASHED;
+		list_add(&res->d_alias, &inode->i_dentry);
+		hlist_add_head(&res->d_hash, &inode->i_sb->s_anon);
+		spin_unlock(&res->d_lock);
 
-			/*
-			 * Set d_bucket to an "impossible" bucket address so
-			 * that d_move() doesn't get a false positive
-			 */
-			res->d_bucket = NULL;
-			res->d_flags |= DCACHE_DISCONNECTED;
-			res->d_flags &= ~DCACHE_UNHASHED;
-			list_add(&res->d_alias, &inode->i_dentry);
-			hlist_add_head(&res->d_hash, &inode->i_sb->s_anon);
-			spin_unlock(&res->d_lock);
-		}
 		inode = NULL; /* don't drop reference */
 	}
 	spin_unlock(&dcache_lock);
@@ -881,7 +881,7 @@
  * DCACHE_DISCONNECTED), then d_move that in place of the given dentry
  * and return it, else simply d_add the inode to the dentry and return NULL.
  *
- * This is (will be) needed in the lookup routine of any filesystem that is exportable
+ * This is needed in the lookup routine of any filesystem that is exportable
  * (via knfsd) so that we can build dcache paths to directories effectively.
  *
  * If a dentry was found and moved, then it is returned.  Otherwise NULL
@@ -892,11 +892,11 @@
 {
 	struct dentry *new = NULL;
 
-	if (inode && S_ISDIR(inode->i_mode)) {
+	if (inode) {
 		spin_lock(&dcache_lock);
-		if (!list_empty(&inode->i_dentry)) {
-			new = list_entry(inode->i_dentry.next, struct dentry, d_alias);
-			__dget_locked(new);
+		new = __d_find_alias(inode, 1);
+		if (new) {
+			BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
 			spin_unlock(&dcache_lock);
 			security_d_instantiate(new, inode);
 			d_rehash(dentry);

  parent reply	other threads:[~2004-09-09 14:04 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-08 12:35 Major XFS problems Jakob Oestergaard
2004-09-08 15:04 ` Anando Bhattacharya
2004-09-08 15:44   ` Jakob Oestergaard
2004-09-08 16:36     ` Greg Banks
2004-09-08 17:30       ` Jakob Oestergaard
2004-09-09  2:42         ` Greg Banks
2004-09-08 19:06       ` Bill Davidsen
2004-09-09  3:23         ` Greg Banks
2004-09-09 14:00       ` Jakob Oestergaard [this message]
2004-09-10  2:40         ` Greg Banks
2004-09-10  3:04           ` Kyle Moffett
2004-09-10  3:24             ` Greg Banks
2004-09-13  7:29         ` Jakob Oestergaard
2004-09-17 11:26           ` [PATCH] " Jakob Oestergaard
2004-09-29 21:45             ` Christoph Hellwig
2004-09-29 22:16               ` Linus Torvalds
2004-09-08 16:16 ` Jan-Frode Myklebust
2004-09-08 21:40 ` Nathan Scott
2004-09-08 23:22   ` Jakob Oestergaard
2004-09-08 23:42     ` Nathan Scott
2004-09-09 12:11       ` Jakob Oestergaard
2004-09-09 18:09         ` Chris Wedgwood
2004-09-11 11:39 ` Grzegorz Piotr Jaskiewicz
2004-09-11 13:03   ` Bjoern Brauel
2004-09-11 13:38   ` Anton Blanchard
2004-09-11 14:54     ` Miquel van Smoorenburg
2004-09-11 18:20     ` Grzegorz Piotr Jaskiewicz
2004-09-11 13:58 ` Clemens Schwaighofer
  -- strict thread matches above, loose matches on Subject: below --
2004-09-08 13:07 Piszcz, Justin Michael
2004-09-08 13:26 ` Jakob Oestergaard
2004-09-08 15:24 Piszcz, Justin Michael
     [not found] <20040908133954.GB390@unthought.net>
     [not found] ` <20040909074533.B3958243@wobbly.melbourne.sgi.com>
     [not found]   ` <413F823F.3020507@xfs.org>
2004-09-09  6:52     ` Dave Chinner
2004-09-09  8:10       ` Andrew Morton
     [not found] <2Ca3I-2kY-7@gated-at.bofh.it>
     [not found] ` <2Cdl9-4Pc-65@gated-at.bofh.it>
2004-09-11  9:21   ` ADH

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=20040909140017.GP390@unthought.net \
    --to=jakob@unthought.net \
    --cc=a3217055@gmail.com \
    --cc=gnb@melbourne.sgi.com \
    --cc=linux-kernel@vger.kernel.org \
    /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