(+ 'linux-arm' since same problem was getting discussed in another thread) > -----Original Message----- > From: Santosh Shilimkar [mailto:santosh.shilimkar@xxxxxx] > Sent: Thursday, January 13, 2011 6:59 PM > To: 'J. R. Okajima'; 'Mark Brown' > Cc: 'Trond Myklebust'; 'Nick Piggin'; 'linux-nfs@xxxxxxxxxxxxxxx'; > 'linux-kernel@xxxxxxxxxxxxxxx'; 'linux-fsdevel@xxxxxxxxxxxxxxx' > Subject: RE: NFS root lockups with -next 20110113 > > > -----Original Message----- > > From: J. R. Okajima [mailto:hooanon05@xxxxxxxxxxx] > > Sent: Thursday, January 13, 2011 6:52 PM > > To: Mark Brown > > Cc: Trond Myklebust; Santosh Shilimkar; Nick Piggin; linux- > > nfs@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; linux- > > fsdevel@xxxxxxxxxxxxxxx > > Subject: Re: NFS root lockups with -next 20110113 > > > > > > Mark Brown: > > > With -next 20110113 I'm experiencing lockups shortly after > > userspace > > > starts when booting with my root filesystem on NFS, log below. > I > > can > > > boot into /bin/sh but running real userspace triggers this very > > easily. > > > This was introduced sometime this week. > > > > > > I've not bisected or otherwise investigated much yet, but I do > > notice > > > code added recently by Nick in "fs: rcu-walk for path lookup" > > showing up > > > in the backtrace so including him in the CCs. > > > > This and a report from Santosh Shilimkar look like the same > problem > > which I reported, and I am testing this patch. If you can, please > > try it > > too. > > Note: Of course this is not offcial fix. > > > > It works. My board booted with NFS with below patch > > > > > > diff --git a/fs/namei.c b/fs/namei.c > > index 5bb7588..51d052f 100644 > > --- a/fs/namei.c > > +++ b/fs/namei.c > > @@ -480,6 +480,7 @@ static int nameidata_dentry_drop_rcu(struct > > nameidata *nd, struct dentry *dentry > > { > > struct fs_struct *fs = current->fs; > > struct dentry *parent = nd->path.dentry; > > + int isroot; > > > > BUG_ON(!(nd->flags & LOOKUP_RCU)); > > if (nd->root.mnt) { > > @@ -489,18 +490,22 @@ static int nameidata_dentry_drop_rcu(struct > > nameidata *nd, struct dentry *dentry > > goto err_root; > > } > > spin_lock(&parent->d_lock); > > - spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); > > - if (!__d_rcu_to_refcount(dentry, nd->seq)) > > - goto err; > > + isroot = IS_ROOT(dentry); > > + if (!isroot) { > > + spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); > > + if (!__d_rcu_to_refcount(dentry, nd->seq)) > > + goto err; > > + } > > /* > > * If the sequence check on the child dentry passed, then the > > child has > > * not been removed from its parent. This means the parent > > dentry must > > * be valid and able to take a reference at this point. > > */ > > - BUG_ON(!IS_ROOT(dentry) && dentry->d_parent != parent); > > + BUG_ON(!isroot && dentry->d_parent != parent); > > BUG_ON(!parent->d_count); > > parent->d_count++; > > - spin_unlock(&dentry->d_lock); > > + if (!isroot) > > + spin_unlock(&dentry->d_lock); > > spin_unlock(&parent->d_lock); > > if (nd->root.mnt) { > > path_get(&nd->root); > > @@ -513,7 +518,8 @@ static int nameidata_dentry_drop_rcu(struct > > nameidata *nd, struct dentry *dentry > > nd->flags &= ~LOOKUP_RCU; > > return 0; > > err: > > - spin_unlock(&dentry->d_lock); > > + if (!isroot) > > + spin_unlock(&dentry->d_lock); > > spin_unlock(&parent->d_lock); > > err_root: > > if (nd->root.mnt) -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html